Почему этот сценарий PowerShell не может правильно выполнить эту внешнюю команду? - PullRequest
3 голосов
/ 02 марта 2011

Следующий код выведет командную строку, которую я хочу запустить:

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

3 голосов
/ 02 марта 2011

Попробуйте Invoke-Expression

$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 голосов
/ 02 марта 2011

Используйте оператор вызова (&) следующим образом:

 & '.\hg' clone $SourceRepo $Repo $revstring
0 голосов
/ 05 сентября 2011

Используя EchoArgs.exe из PowerShell Community Extensions , мы можем видеть, какие аргументы получает 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...