为什么此PowerShell脚本无法正确执行此外部命令?

时间:2011-03-02 14:03:07

标签: powershell powershell-v2.0

以下代码将输出我希望运行的命令字符串:

[string] $SourceRepo="C:\inetpub\wwwroot\Spyda\"
[string] $Repo="C:\inetpub\wwwroot\BranchClone\"
[string] $revstring="--rev `"default`" --rev `"case 1234`""

Write-Output "hg clone $SourceRepo $Repo $revstring"

哪个给出了

hg clone C:\inetpub\wwwroot\Spyda\ C:\inetpub\wwwroot\BranchClone\ --rev "default" --rev "case 1234"

如果我从powershell提示符运行它,它可以工作,如果我尝试使用这种语法从脚本运行hg clone命令,它会失败:

hg clone $SourceRepo $Repo $revstring

给出错误:

hg.exe : hg clone: option --rev default --rev case not recognized
At line:6 char:3
+ hg <<<<  clone $SourceRepo $Repo $revstring
    + CategoryInfo          : NotSpecified: (hg clone: optio... not recognized:String) [], RemoteE 
   xception
    + FullyQualifiedErrorId : NativeCommandError

3 个答案:

答案 0 :(得分:3)

尝试调用表达式

$SourceRepo="C:\inetpub\wwwroot\Spyda\"
$Repo="C:\inetpub\wwwroot\BranchClone\"
$revstring="--rev `"default`" --rev `"case 1234`""

$cmdString = "hg clone $SourceRepo $Repo $revstring"

Invoke-Expression $cmdString

答案 1 :(得分:2)

以这种方式使用呼叫运算符(&amp;):

 & '.\hg' clone $SourceRepo $Repo $revstring

答案 2 :(得分:0)

使用PowerShell Community Extensions中的EchoArgs.exe,我们可以看到hg.exe正在接收的参数:

PS> & ./EchoArgs.exe clone $SourceRepo $Repo $revstring
Arg 0 is <clone>
Arg 1 is <C:\inetpub\wwwroot\Spyda\>
Arg 2 is <C:\inetpub\wwwroot\BranchClone\>
Arg 3 is <--rev default --rev case>
Arg 4 is <1234>

powershell解析对本机应用程序的调用,因此它会自动使用引号来转义包含空格的变量参数,例如$revstring

我们可以通过简单地构建一个我们想要使用的不同值的数组来利用这种转义,而不是预先引用我们的参数:

PS> $hgArgs = @('clone',$SourceRepo,$Repo,'--rev','default','--rev','case 1234')
PS> & ./EchoArgs.exe $hgArgs
Arg 0 is <clone>
Arg 1 is <C:\inetpub\wwwroot\Spyda\>
Arg 2 is <C:\inetpub\wwwroot\BranchClone\>
Arg 3 is <--rev>
Arg 4 is <default>
Arg 5 is <--rev>
Arg 6 is <case 1234>