我无法理解Powershell中的参数传递行为。
说,我有一个脚本callScript.ps1
param($a="DefaultA",$b="DefaultB")
echo $a, $b
说,另一个脚本调用callScript.ps1
。
.\callScript.ps1
# outputs DefaultA followed by DefaultB as expected
.\callScript.ps1 -a 2 -b 3
# outputs 2 followed by 3 as expected
$arguments='-a 2 -b 3'
callScript.ps1 $arguments
# I expected output as previous statement but it is as follows.
# -a 2 -b 3
# DefaultB
如何通过动态构造命令来运行powershell脚本,如上所述?
您能否解释为什么$arguments
中的$a
被解释为callScript.ps1
变量的脚本?
答案 0 :(得分:1)
这里发生的事情是你传递了一个字符串:
'-a 2 -b 3'
作为$a
你需要在参数中指定值,如果你真的需要像上面那样去做(虽然这绝对是更好的方法)你可以使用Invoke-Expression
(短{{ 1}})
iex
你也可以改变你的函数来接受这样的值数组:
function doprint {
param( $a,$b )
$a ; $b
}
$arg = '-a "yes" -b "no"'
"doprint $arg" | iex
答案 1 :(得分:1)
正如已经暗示的那样,你不能传递单个字符串,因为你的脚本期望有两个参数 - 字符串被作为参数$a
的输入,而参数$b
需要默认值。
但是,您可以构建一个包含参数的简单哈希表,然后使用splatting将它们传递给脚本。
您的代码更改很少:
$arguments=@{a="2";b="3"}
callScript.ps1 @arguments