command-line - Powershell 命令处理(传入变量)

标签 command-line powershell parameters arguments command

我正在创建一个 Powershell 脚本来部署一些代码,该过程的一部分是调用一个名为 RAR.EXE 的命令行压缩工具来备份一些文件夹。

我正在尝试动态构建参数,然后让 powershell 使用变量调用命令,但我遇到了麻烦。它不工作...

运行以下脚本,您应该会看到我在说什么。作为变量传入的参数正在被破坏。如果我传递整个命令 + 参数,我会收到臭名昭著的“未被识别为 cmdlet...”消息。

谢谢你的帮助!

echo "this should succeed"
& cmd /c echo foo

echo "why does this echo out an additional double quote?"
$param = "/c echo foo"
& cmd "$param"

echo "this does the same"
$param = "/c echo foo"
& cmd $param

echo "escaping the slash doesn't work either..."
$param = "`/c echo foo"
& cmd $param

echo "this fails, but why?"
$cmd = "cmd /c echo foo"
&$cmd

最佳答案

在这种情况下,不需要调用运算符“&”。它用于在新范围内调用命令。这通常用于调用由字符串或脚本块指定的命令。它还具有附带好处,即在命令完成且作用域消失后,将丢弃在 PowerShell 脚本中创建的任何变量。

然而,由于 cmd 是一个 EXE,它在一个完全不同的过程中执行。 FWIW,你直接从 cmd.exe 得到类似的输出:

> cmd "/c echo foo"
foo"

所以最后的额外引用是一个 cmd.exe 问题。通常,当 PowerShell 执行解析以调用命令时,您需要将命令与参数分开,例如
45> & { $foo = "foo" }
46> $foo  # Note that $foo wasn't found - it went away with the scope
47> . { $foo = "foo" } # dotting executes in the current scope
48> $foo 
foo

这里值得注意的异常(exception)是 Invoke-Expression 的行为类似于“评估此字符串”函数。请谨慎使用,尤其是在用户提供字符串的情况下。如果他们提供“ri C:\-r”,您的一天可能会很糟糕。

在这种情况下,正如其他人所建议的那样,我会将/c 拉出字符串 $param 字符串并指定它,例如:
cmd /c $param

或者使用 Invoke-Expression 但要小心使用。顺便说一句,当您尝试调试从 PowerShell 向 EXE 发送参数的问题时,请查看 PowerShell 社区扩展 ( http://pscx.codeplex.com ) 中的 echoargs 实用程序。它非常方便:
49> $param = "/c echo foo"
50> echoargs $param
Arg 0 is </c echo foo>

这表明 cmd.exe 接收“/c echo foo”作为单个参数。 “/c”应该是与“echo foo”(要执行的命令)分开的参数。

关于command-line - Powershell 命令处理(传入变量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/809333/

相关文章:

c - 如果我声明一个参数表为空的函数,然后将参数传递给它会怎样?

linux - 我如何将路径中的最后一个目录打包到 tar 文件中?

powershell - Powershell仅排除文件

windows - cmd.exe 命令行字符串限制

powershell - 使用 PowerShell,如何添加多个命名空间(其中之一是默认命名空间)?

.net - Powershell、JSON 和 UTF8 有 cyrrylic 问题

java - 这个方法返回什么?

php - 使用正则表达式提取 URL 参数 - 重复捕获组

c++ - getopt/long_getopt 的正确使用方法

GUI 和命令行的 C# 应用程序