You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:33:45