如何使用嵌套ForEach-Object?需在内部访问外层循环对象值
嵌套ForEach-Object中访问外层循环变量的方法
在PowerShell的嵌套ForEach-Object里,内层的$_会覆盖外层的管道变量,导致你无法直接通过$_获取外层的应用名称。解决这个问题有两种常用方法:
方法一:将外层变量存入自定义变量
在外层循环中,先把当前的应用名称赋值给一个自定义变量,内层循环直接调用这个变量即可:
@( "Microsoft Teams", "Microsoft Teams Meeting Add-in for Microsoft Office", "Teams Machine-Wide Installer" ) | ForEach-Object { # 保存外层循环的当前应用名称 $currentApp = $_ "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*", "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*", "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" | ForEach-Object { # 同时访问外层应用名称和内层注册表路径 Write-Host "应用: $currentApp,注册表路径: $_" } }
方法二:使用-PipelineVariable参数(PowerShell 4.0+)
通过-PipelineVariable(可简写为-pv)参数,将外层循环的对象绑定到指定变量,后续管道中直接调用该变量即可,无需额外赋值:
@( "Microsoft Teams", "Microsoft Teams Meeting Add-in for Microsoft Office", "Teams Machine-Wide Installer" ) | ForEach-Object -PipelineVariable app { "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*", "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*", "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" | ForEach-Object { Write-Host "应用: $app,注册表路径: $_" } }
两种方法都能实现需求,第一种逻辑更直观,适合新手;第二种写法更简洁,适合熟悉PowerShell高级特性的场景。
内容的提问来源于stack exchange,提问作者eRcumenT14141
相关产品推荐
相关产品推荐

