将数组传递给脚本块中的命名参数之一?
Passing array to one of named parameters in script block?
我正在尝试找出一种方法,将数组传递给单独脚本中的命名参数。但是,我找不到任何解决方案。
测试 2.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[]
下面这行是从另一个 Whosebug 答案中复制过来的,但我不太明白前 3 个命名参数是如何工作的。
$sb = [scriptblock]::create(".{$(get-content $ScriptPath -Raw)} $(&{$args} @params)")
尤其是“$(&{$args} @params)”部分。我对飞溅有基本的了解,但这超出了我的范围。如果有人能为我解释一下语法,我将不胜感激。
当您将 @params
放入可扩展字符串中时,您会强制解析器将生成的输出转换为字符串,并且 ToString()
的默认行为(如果未被覆盖)是只是 return 相关对象的类型名称。
只需等到调用脚本后再提供参数:
$sb = [scriptblock]::Create("$(get-content $ScriptPath -Raw)")
& $sb $args @params
或者,如果您想 dot-source 具有特定参数的脚本:
$sb = [scriptblock]::Create("$(get-content $ScriptPath -Raw)")
& {.$sb $args @params}
我正在尝试找出一种方法,将数组传递给单独脚本中的命名参数。但是,我找不到任何解决方案。
测试 2.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[]
下面这行是从另一个 Whosebug 答案中复制过来的,但我不太明白前 3 个命名参数是如何工作的。
$sb = [scriptblock]::create(".{$(get-content $ScriptPath -Raw)} $(&{$args} @params)")
尤其是“$(&{$args} @params)”部分。我对飞溅有基本的了解,但这超出了我的范围。如果有人能为我解释一下语法,我将不胜感激。
当您将 @params
放入可扩展字符串中时,您会强制解析器将生成的输出转换为字符串,并且 ToString()
的默认行为(如果未被覆盖)是只是 return 相关对象的类型名称。
只需等到调用脚本后再提供参数:
$sb = [scriptblock]::Create("$(get-content $ScriptPath -Raw)")
& $sb $args @params
或者,如果您想 dot-source 具有特定参数的脚本:
$sb = [scriptblock]::Create("$(get-content $ScriptPath -Raw)")
& {.$sb $args @params}