2011-03-02 149 views
3

下面的代碼將輸出的命令字符串我想運行:爲什麼此PowerShell腳本無法正確執行此外部命令?

[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 $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

嘗試調用,表達

$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 
2

使用調用運算符(&)這樣說:

& '.\hg' clone $SourceRepo $Repo $revstring 
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> 

會發生什麼是pow ershell解析了對本地應用程序的調用,因此它會自動使用引號來轉義包含空格的變量參數,如$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> 
相關問題