Почему этот PowerShell script не может выполнить эту внешнюю команду правильно?
Следующий код выведет строку команды, которую я хочу запустить:
[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 из script с помощью этого синтаксиса, это не сработает:
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
Ответы
Ответ 1
Попробуйте вызывать выражение
$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
Ответ 3
Используя EchoArgs.exe из Расширения сообщества PowerShell, мы можем видеть, какие аргументы получает 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>