将数组传递给脚本块中的一个命名参数?

时间:2015-10-19 12:20:47

标签: powershell named-parameters invoke-command splat scriptblock

我试图想出一种方法将数组传递给单独脚本中的命名参数。但是,我找不到任何解决方案。

Test2.ps1:

param(
    [int]$a,
    [int]$b,
    [int]$c,
    [string[]]$d
)

write-host "`$a = $a"
write-host "`$b = $b"
write-host "`$c = $c"
write-host "`$d:" -nonewline
foreach($str in $d) {
    write-host " $str" -nonewline
}
write-host

主要剧本:

$arr = @("abc", "def", "ghi")
$params = @{
    a = 1;
    b = 2;
    c = 3;
    d = $arr
}

#invoke-command -filepath "test2.ps1" -ArgumentList 1,2,3,@("abc", "def", "ghi")
$scriptPath = "test2.ps1"
$sb = [scriptblock]::create(".{$(get-content $ScriptPath -Raw)} $(&{$args} @params)")
invoke-command -scriptblock $sb

执行时,我得到输出

$d:System.Object[]

下面的行是从另一个Stackoverflow答案中复制的,但我不太清楚它对前3个命名参数的工作原理。

$sb = [scriptblock]::create(".{$(get-content $ScriptPath -Raw)} $(&{$args} @params)")

特别是" $(& {$ args} @params)"部分。我对splatting有基本的了解,但这超出了我的范围。非常感谢有人能为我解释一下语法。

1 个答案:

答案 0 :(得分:1)

当您将@params置于可扩展字符串中时,您强制解析器将结果输出转换为字符串,ToString()的默认行为(如果未被覆盖)是只需返回相关对象的类型名称。

在提供参数之前,只需等到调用脚本:

$sb = [scriptblock]::Create("$(get-content $ScriptPath -Raw)")
& $sb $args @params

或者,如果您想要 dot-source 具有特定参数的脚本:

$sb = [scriptblock]::Create("$(get-content $ScriptPath -Raw)")
& {.$sb $args @params}