vik*_*ata 1 powershell foreach iterator
我有一个数组定义:
> $a={"abc","xyz","hello"}
Run Code Online (Sandbox Code Playgroud)
然后,使用foreach来修改它,但似乎原始元素没有改变:
> foreach($i in $a){$i="kkk"+$i}
> $a
> "abc","xyz","hello"
Run Code Online (Sandbox Code Playgroud)
为什么foreach循环不修改元素?然后我尝试使用ForEach-Object,这一次,它甚至没有运行:
> $a|%{$_=$_+"kkk"}
Method invocation failed because [System.Management.Automation.ScriptBlock] does not contain a method named 'op_Addition'.
At line:1 char:6
+ $a|%{$_=$_+"kkk"}
+ ~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (op_Addition:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
Run Code Online (Sandbox Code Playgroud)
这有任何语法错误吗?或者我的理解不正确?谢谢.
你没有阵列$a,你有一个[ScriptBlock].大括号{}表示PowerShell中的脚本块.
数组运算符是@().
这是第二个例子中错误的原因.
$a=@("abc","xyz","hello")
foreach($i in $a) {
$i = "zzz" + $i
}
$a | % { $_ += "zzz" }
Run Code Online (Sandbox Code Playgroud)
但是,这仍然不起作用,因为$i并且$_是副本,而不是引用回原始数组位置.
相反,您可以使用常规for循环遍历数组:
for( $i = 0 ; $i -lt $a.Count ; $i++ ) {
$a[$i] += "zzz"
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,您可以看到在循环体中,您直接引用数组$a并修改其实际值.
另请注意,ForEach-Object(%)返回一个值(或从块返回的所有值),因此您也可以这样做:
$a = $a | % { "qqq" + $_ }
Run Code Online (Sandbox Code Playgroud)
当然,这只是形成一个全新的阵列并分配给它$a,而不是在技术上修改原始阵列.