Как передать строковую переменную в команду в powershell? - PullRequest
1 голос
/ 07 января 2020

Я намерен использовать переменную powershell в скрипте, чтобы передать строковое значение команде, после чего команда выполняется с параметрами, определенными в строке. Я смотрю на это уже пару часов и не вижу, что делаю неправильно. Я упростил столько, сколько смогу. В надежде на свободные sh глаза я прилагаю изображение, показывающее:

a. скрипт, который я использую. Это три строки.

$Parms = "-it amazonlinux2 /bin/sh"
Write-Output "& docker run $Parms"
& docker run $Parms

б. командная строка PS, где я выполняю сценарий.

PS C:\dev\gamelift\serversdk\build> ./test

c. результат выполнения скрипта

& docker run -it amazonlinux2 /bin/sh
unknown shorthand flag: ' ' in - amazonlinux2 /bin/sh
See 'docker run --help'.

d. та же команда выполняется сразу же по приглашению.

PS C:\dev\gamelift\serversdk\build> docker run -it amazonlinux2 /bin/sh

e. правильный результат команды подсказки интерпретировать как команду? Я пробовал:

a. docker run $Parms (без знака &)

b. & docker run "$Parms" (в кавычках)

c. $Parms = "amazonlinux2 /bin/sh" и & docker run -it $Parms (разные ошибки)

d. $Parms = "amazonlinux2" и & docker run -it $Parms /bin/sh (работает)

e. экранирование (другая ошибка)

f. $Parms = "-it amazonlinux2 /bin/sh" и каждый из & docker run $($Parms), & docker run ${$Parms} и & docker run ${Parms}

Я чувствую себя немного глупо. Я не вижу, насколько верен Write-Output, но команда call не работает. Это не может быть так сложно ...

Ответы [ 2 ]

0 голосов
/ 07 января 2020

Это часто задаваемый вопрос, хотя и недостаточно хорошо задокументированный. Параметры оператора вызова работают как массив:

$Parms = '-it','amazonlinux2','/bin/sh'
Write-Output "& docker run $Parms"
& docker run $Parms

Я бы просто запустил docker напрямую.

docker -it amazonlinux2 /bin/sh
0 голосов
/ 07 января 2020

Оператор вызова (&) не анализирует строки , поэтому «вы не можете использовать параметры команды в строке при использовании оператора вызова». Однако вы можете передать массив, чтобы сработало следующее:

$Parms = "-it amazonlinux2 /bin/sh"
Write-Output "& docker run $Parms"
$myargs = -split $Parms 
& docker run $myargs

В качестве альтернативы можно использовать Invoke-Expression (псевдоним iex), например:

$Parms = "-it amazonlinux2/bin/sh"
Write-Output "& docker run $Parms"
iex "docker run $Parms"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...