PowerShell遍历文本文件替换回车符\r代码失效问题求助
问题根因
原代码无法替换回车符的核心原因是Get-Content的默认读取逻辑:默认情况下该 cmdlet 会按换行符拆分文件内容,返回的每一行字符串已经自动剥离了行尾的回车(\r)、换行(\n)控制符,后续管道中处理的单行内容根本不包含回车符,无论怎么写匹配规则都无法命中替换。
除此之外原代码还有几个容易出问题的点:
- 没有过滤遍历对象,会把目录、二进制文件也纳入处理,容易触发读取错误
- 单引号包裹的
'\r'在PowerShell中不会被解析为转义字符,只会被识别为普通的\和r两个字符,匹配逻辑本身存在问题 - 写回文件时没有指定编码,可能出现和原文件编码不一致导致的乱码
可直接运行的修复代码
$targetPath = "C:\Users\admin\Desktop\TESTING\" # 按需修改-Include后的后缀,筛选需要处理的文本文件 $files = Get-ChildItem -Path $targetPath -Recurse -File -Include *.txt foreach ($file in $files) { # 加-Raw参数一次性读取整文件为完整字符串,保留所有原始控制字符 $rawContent = Get-Content -Path $file.FullName -Raw # 替换所有回车符,如需统一换行格式为LF,替换\r为空即可 $fixedContent = $rawContent -replace "`r", "" # 写回文件,指定编码、禁止自动追加末尾换行 Set-Content -Path $file.FullName -Value $fixedContent -Encoding UTF8 -NoNewline }
关键参数说明
-Raw:是解决回车符匹配不到的核心参数,关闭按行拆分逻辑,完整保留文件原始内容`r:PowerShell中用反引号作为转义符,双引号包裹的`r才是代表回车符的正确写法-File:限定Get-ChildItem只返回文件对象,过滤掉目录-NoNewline:避免Set-Content在文件末尾自动追加多余的换行符-Encoding:显式指定输出编码,可根据自己的实际文件编码改成UTF8、Default(系统默认编码)等,避免乱码
内容的提问来源于stack exchange,提问作者TheRealHamzaYusuf
相关产品推荐
相关产品推荐

