我打算在脚本中使用powershell变量将字符串值传递给命令,然后该命令将使用字符串中定义的参数执行。我已经看了几个小时了,但我没有发现我做错了什么。我已尽力简化了。为了给大家带来新鲜的眼睛,我附上一张图片,显示:

一种。我正在使用的脚本。这是三行。

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

b。我执行脚本的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。提示命令的结果,这是正确的
sh-4.2#

Image of the above

发生了什么魔术,因此写入输出不会被解释为命令?我努力了:

一种。 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命令却很糟糕。没那么难...

最佳答案

call 操作符(&)不parse strings,因此“使用 call 操作符时,您不能在字符串中使用命令参数”。但是,您可以传递一个数组,以便执行以下操作:

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

09-25 15:19