我打算在脚本中使用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"