2011-03-02 11 views
3

次のコードが出力されます私が実行したいコマンド文字列:私はHGを実行しようとした場合のPowerShellプロンプトから、それは、動作することを実行した場合このPowerShellスクリプトがこの外部コマンドを正しく実行できないのはなぜですか?

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

を与える

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

は、この構文を使用してスクリプトから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

は、呼び出し演算子(&)この方法を使用し

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

を、我々は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> 
関連する問題