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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 02:32:43