如何避免PowerShell替换文本时换行符被替换为问号?
解决批处理中PowerShell修改配置文件时换行符变为问号的问题
问题原因
你的原命令用gc(Get-Content)默认按行读取文件,返回字符串数组,管道输出到sc(Set-Content)时,PowerShell会用系统默认换行符拼接数组元素,再加上编码不匹配,导致原始换行符或字符被损坏,出现问号。你尝试的replace[↵]::escape是错误语法,无法生效。
修正方案
核心是保留原始文件结构和统一编码,以下两种方法任选其一:
方法1:一次性读取文件(推荐)
用-Raw参数读取整个文件为单个字符串,替换后直接写入,完全保留原始换行和格式:
powershell -command "& { $p = Get-Content 'path.txt' -Raw; $configPath = Join-Path $p.Trim() 'GameConfig\SpecificFile.txt'; (Get-Content $configPath -Raw -Encoding UTF8).Replace('<col:Default>','<col:Green>') | Set-Content $configPath -Encoding UTF8 }"
方法2:按行处理并保留换行
如果需要按行操作,使用-NoNewline避免额外换行,并指定编码:
powershell -command "& { $p = Get-Content 'path.txt' -Raw; $configPath = Join-Path $p.Trim() 'GameConfig\SpecificFile.txt'; $lines = Get-Content $configPath -Encoding UTF8; $updatedLines = $lines.Replace('<col:Default>','<col:Green>'); $updatedLines | Set-Content $configPath -Encoding UTF8 -NoNewline }"
关键说明
-Raw:避免拆分文件内容,完整保留原始换行符和格式。-Encoding UTF8:确保读取和写入的编码一致,防止字符(包括控制字符)损坏。$p.Trim():移除path.txt中可能存在的换行、空格,保证路径正确。Join-Path:更安全的路径拼接方式,避免手动拼接路径时的错误。
内容的提问来源于stack exchange,提问作者leiseg
相关产品推荐
相关产品推荐

