PowerShell中读取文本生成的变量用于-match模式不生效问题咨询
问题原因
- 核心诱因是Windows平台下文本文件默认换行符为回车+换行组合(
`r`n),你的代码仅替换了换行符`n为|,遗漏了不可见的回车符`r,导致$s_01实际内容为F3MCr|FRSEr|FGTSr`,代入正则表达式后无法和目标字符串匹配。 - 回车符属于控制台不可见控制字符,直接打印
$s_01时不会显示异常,会让你误以为两个变量内容完全一致,这也是该问题容易被忽略的关键。 - 额外可能诱因:pascodes.txt文件首尾存在多余空行、每行内容前后有未清理的空白,也会导致生成的匹配规则不符合预期。
你可以执行以下代码验证两个变量的实际差异:
# 对比长度,存在回车符时$s_01长度会明显大于$s_02 $s_01.Length $s_02.Length # 输出$s_01所有字符的ASCII编码,可看到代表回车符的数值13 [byte[]][char[]]$s_01
解决方法
以下方案按稳妥性排序:
- 方案1(最推荐):利用PowerShell内置的行拆分特性自动处理换行符,无需手动替换:
# Get-Content不加-Raw参数时会自动按行拆分内容,自动去除行尾所有换行符 $s_01 = (Get-Content $path\source_files\pascodes.txt) -join '|'
- 方案2(手动全量替换换行符):清理所有回车符后再替换换行符,同时修剪首尾多余的
|避免空行影响:
$s_01 = (Get-Content $path\source_files\pascodes.txt -Raw).Replace("`r","").Replace("`n","|").Trim('|')
- 方案3(额外清理空白内容):如果文件中存在无效空行、每行前后有多余空格,可以先清理每行内容再拼接:
$s_01 = (Get-Content $path\source_files\pascodes.txt | ForEach-Object { $_.Trim() } | Where-Object { $_ -ne '' }) -join '|'
内容的提问来源于stack exchange,提问作者Boris Pumpernickel
相关产品推荐
相关产品推荐

