PowerShell中能否在哈希表内嵌入foreach循环?附示例代码
可以在PowerShell哈希表中嵌入foreach循环吗?
当然可以!PowerShell的哈希表值支持任何合法的表达式,包括循环语句,但你的示例代码里有几个逻辑细节需要调整,才能得到你想要的结果。
先看你代码里的问题点:
- 你在
Disk字段的循环里写了$disks.size -join '.',但这里遍历的是$disk单条记录,却引用了整个$disks集合的Size属性,这会导致重复输出所有磁盘大小,而不是单盘的大小。 - 直接在哈希值里写foreach循环时,需要确保把循环的输出收集起来再做拼接,否则会得到不符合预期的结果。
修正后的两种写法
写法1:更简洁的属性访问(推荐)
不需要显式foreach循环,直接对$disks集合的Size属性进行批量访问,再用-join拼接:
$vms = Get-VM foreach ($vm in $vms) { $disks = Get-Vhd -VMId $vm.Id # 明确参数名,提升代码可读性 $hash = [ordered]@{ 'VM Name' = $vm.VMName 'State' = $vm.State 'Disk Sizes' = $disks.Size -join '.' # 直接批量获取所有磁盘大小并拼接 } New-Object -TypeName PSObject -Property $hash }
写法2:显式使用foreach循环
如果一定要在哈希表值里用foreach循环,需要用@()把循环的输出转为数组,再进行拼接:
$vms = Get-VM foreach ($vm in $vms) { $disks = Get-Vhd -VMId $vm.Id $hash = [ordered]@{ 'VM Name' = $vm.VMName 'State' = $vm.State 'Disk Sizes' = @(foreach ($disk in $disks) { $disk.Size }) -join '.' } New-Object -TypeName PSObject -Property $hash }
关键说明
- 哈希表的值本质上是PowerShell表达式的结果,所以任何能返回值的代码(包括循环、条件判断等)都可以放在这里。
- 当使用foreach循环时,默认会逐条输出结果,用
@()包裹可以把这些零散的输出收集成一个数组,方便后续的-join操作。 - 原代码里的
VM<br>Name如果是为了生成HTML格式的表头,可以保留,但如果是普通文本输出,建议改成VM Name更易读。
内容的提问来源于stack exchange,提问作者Sasa
相关产品推荐
相关产品推荐

