PowerShell中foreach循环break异常及通配符含义问询
问题解答:注册表遍历break异常与通配符疑问
一、break导致后续代码不执行的问题
你碰到的核心问题是混淆了PowerShell里两种foreach的行为:
- 用
foreach ($item in $collection)这种语句遍历的话,里面的break只会跳出当前的foreach循环,外层if和后续输出${path}的代码完全不受影响,会正常执行。 - 但如果是用管道配合
ForEach-Object(简写%)来遍历,比如Get-ChildItem ... | ForEach-Object { ... },这里面的break会直接终止整个管道流程,甚至跳出外层的脚本块,导致后续输出代码根本跑不到。
解决办法很直接:
- 优先改用
foreach语句遍历注册表项,示例代码结构如下:if (你的前置判断条件) { # 先获取要遍历的注册表项集合 $regEntries = Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Enum\HID" foreach ($entry in $regEntries) { if ($entry.Name -like "*HID Keyboard*") { $path = $entry.PSPath break # 只退出foreach循环,后续代码正常执行 } } Write-Output ${path} # 这里会正常输出找到的路径 }
二、HID Keyboard%中%的含义
这里的%是Windows原生环境(注册表、CMD命令)里的通配符,作用和你习惯用的PowerShell里的*一样,用来匹配任意长度的字符(包括零个)。
之所以会出现%,是因为有些场景下用的是Windows原生的API或工具(比如reg.exe命令),这些环境里默认用%作为通配符;而在PowerShell自身的命令中,*才是标准通配符,你直接用HID Keyboard*就能正常匹配相关项。
内容的提问来源于stack exchange,提问作者Livy
相关产品推荐
相关产品推荐

