【问题标题】:Passing array to one of named parameters in script block?将数组传递给脚本块中的命名参数之一?
【发布时间】:2016-01-17 18:57:07
【问题描述】:

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

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)”部分。我对喷溅有基本的了解,但这超出了我的范围。如果有人可以为我解释一下语法,将不胜感激。

【问题讨论】:

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


    【解决方案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}
    

    【讨论】:

      猜你喜欢
      • 2018-07-29
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 2018-07-23
      相关资源
      最近更新 更多