Powershell命令处理(传入变量)

Gab*_*beA 7 parameters powershell command-line command arguments

我正在创建一个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
Run Code Online (Sandbox Code Playgroud)

Kei*_*ill 9

在这种情况下,呼叫操作员'&'是不必要的.它用于在新范围内调用命令.这通常用于调用由字符串或sc​​riptblock指定的命令.它还有一个附带的好处,即在命令完成并且范围消失后,在PowerShell脚本中创建的任何变量都将被丢弃.

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

> cmd "/c echo foo"
foo"
Run Code Online (Sandbox Code Playgroud)

所以最后的额外引用是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
Run Code Online (Sandbox Code Playgroud)

这里值得注意的例外是Invoke-Expression的行为类似于"评估此字符串"功能.请小心使用,尤其是在用户提供字符串时.如果他们提供"ri C:\ -r",那么你的日子会很糟糕.

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

cmd /c $param
Run Code Online (Sandbox Code Playgroud)

或者使用Invoke-Expression但要小心使用.BTW当您尝试调试从PowerShell向EXE发送参数的问题时,请查看PowerShell社区扩展(http://pscx.codeplex.com)中的echoargs实用程序.它非常方便:

49> $param = "/c echo foo"
50> echoargs $param
Arg 0 is </c echo foo>
Run Code Online (Sandbox Code Playgroud)

这表明cmd.exe接收"/ c echo foo"作为单个参数."/ c"应该是"echo foo"(要执行的命令)的单独参数.

  • 数组也适用于构建命令行参数; 即$ cmdArgs = @('/ c','echo foo'); cmd $ cmdArgs (5认同)

zda*_*dan 8

在尝试调用您正在尝试的可执行类型命令时,我在过去遇到过&call运算符问题.不确定我理解为什么.然而,Invoke-Expression似乎总是在这种情况下起作用:

PS C:\> $cmd = "cmd /c echo foo"
PS C:\> Invoke-expression $cmd
foo
Run Code Online (Sandbox Code Playgroud)


Tom*_*zel 8

我发现这样做的另一种方法是为命令行创建一个参数数组,并将其与apersand和call运算符一起使用.像这样的东西:

$exe = "cmd";
[Array]$params = "/c", "echo", "foo";

& $exe $params;
Run Code Online (Sandbox Code Playgroud)

它对我有用.

我最初在这里找到了这种技术:http: //techstumbler.blogspot.com/2009/12/windows-commands-with-arguments-in.html