gpt4 book ai didi

powershell - ScriptBlock截断数组上的调用方法

转载 作者:行者123 更新时间:2023-12-02 23:14:25 25 4
gpt4 key购买 nike

我定义了以下ScriptBlock:

[ScriptBlock]$strSb = {
param(
[Parameter(Mandatory=$false,Position=0)]
[String[]]$Modules = @('String3','String4')
)
Write-Host "Passed in params:"
foreach($m in $Modules){
Write-Host $m
}
$defaultModules = @('String3','String4')
# Add Default Modules back if not present #
foreach($module in $defaultModules){
if($Modules -notcontains $module){
$Modules += $module
}
}
Write-Host "Final set:"
# Load Dependencies #
foreach($m in $Modules){
Write-Host $m
}
}

正如参数在ScriptBlock中指出的那样,我希望能够传递字符串数组。当我调用 $strSb.Invoke(@('String11','String12'))时,我收到以下信息:
Passed in params:
String11
Final set:
String11
String3
String4

我期望的是:
Passed in params:
String11
String12
Final set:
String11
String12
String3
String4

为什么invoke方法将我的数组截断为输入的第一项?我将如何解决它,以便可以传递字符串数组?

FWIW:我正在v2和v3中工作。

最佳答案

问题在于调用方法采用一个参数数组(类似于具有 -ArgumentList 参数的类似命令),因此数组中的每个元素都被解析为单独的参数。第一个参数'String11'分配给第一个位置参数 $ Modules ,由于没有更多的位置参数,所有后续参数都将被丢弃。 $ Modules 声明为字符串数组并不重要;由于参数列表的每个元素都是一个单独的参数,因此您需要将 $ Modules 设置为一个元素数组。

如果使用,运算符指示要传递单个数组参数,则该参数将按预期工作:

$strSb.Invoke((,@('String11','String12')))

顺便说一句,您实际上并不需要 @,因为默认情况下,逗号分隔的字符串列表被解释为数组。不仅在这种特定情况下,而且一般而言。所以只要使用这个:
$strSb.Invoke((,('String11','String12')))

为了证明上面的解释,请尝试使用此脚本块,该脚本块除了声明了第二个参数(俗称 $ SecondParameter )外,其余相同,然后在显示第一个参数值的循环之后显示:
[ScriptBlock]$strSb = {
param(
[Parameter(Mandatory=$false,Position=0)]
[String[]]$Modules = @('String3','String4'),
[String]$SecondParameter
)
Write-Host "Passed in params:"
foreach($m in $Modules){
Write-Host $m
}
Write-Host "`nSecondParameter: $SecondParameter`n"
$defaultModules = @('String3','String4')
# Add Default Modules back if not present #
foreach($module in $defaultModules){
if($Modules -notcontains $module){
$Modules += $module
}
}
Write-Host "Final set:"
# Load Dependencies #
foreach($m in $Modules){
Write-Host $m
}
}

如果然后像以前一样传递参数 $strSb.Invoke(@('String11','String12')),则会得到以下结果:
11-26-13 19:02:12.55 D:\Scratch\soscratch» $strSb.Invoke(@('String11','String12'))
Passed in params:
String11

SecondParameter: String12

Final set:
String11
String3
String4
11-26-13 19:02:29.34 D:\Scratch\soscratch»

最后一个与该问题没有直接关系的技巧是,您可以通过使用管道来压缩 foreach 循环,这不仅更简洁,而且通常更有效。这是代码的压缩版本:
[ScriptBlock]$strSb = {
param(
[Parameter(Mandatory=$false,Position=0)]
[String[]]$Modules = ('String3','String4')
)
Write-Host "Passed in params:"
$Modules | Write-Host
$defaultModules = 'String3','String4'
# Add Default Modules back if not present #
$defaultModules | ?{$Modules -notcontains $_} | %{$Modules += $_}
Write-Host "Final set:"
# Load Dependencies #
$Modules | Write-Host
}

关于powershell - ScriptBlock截断数组上的调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20229992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com