动态构建Powershell命令 - 参数传递问题

时间:2017-10-17 14:48:04

标签: powershell

我无法理解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变量的脚本?

2 个答案:

答案 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