PowerShell Where-Object -cnotmatch误过滤非注释行问题排查
问题出在正则表达式的逻辑上
你写的正则^::|REM|rem犯了一个常见的正则逻辑错误——没有给REM和rem加上行首锚定,也没做分组,导致匹配规则完全偏离预期:
- 原正则实际的匹配逻辑是:行以
::开头,或者行内任意位置包含REM,或者行内任意位置包含rem - 你提到的那行被误过滤,就是因为行里包含了
rem子串,触发了正则的匹配规则
修复后的命令
把正则改成^(::|REM|rem),用括号将三个行首前缀分组,确保行首锚定符^作用于所有选项:
Get-Content -Path 'temp.cmd' | where { $_ -cnotmatch '^(::|REM|rem)'} | Set-Content 'temp1.cmd' -Encoding utf8
也可以用更直观的多条件判断写法,避免正则分组的误区:
Get-Content -Path 'temp.cmd' | where { -not ($_ -cmatch '^::' -or $_ -cmatch '^REM' -or $_ -cmatch '^rem') } | Set-Content 'temp1.cmd' -Encoding utf8
关键说明
^是正则的行首锚定符,必须紧贴要匹配的内容,才能确保只匹配行开头的字符- 括号
()的作用是把::、REM、rem打包成一组,让^同时约束这三个选项,保证只有行首是这三种情况的行才会被过滤 -cnotmatch是区分大小写的不匹配,如果你不需要区分REM和rem的大小写,换成-notmatch即可
内容的提问来源于stack exchange,提问作者user2956477
相关产品推荐
相关产品推荐

