PowerShell批量替换子文件夹配置文件字符后去换行问题求助
解决PowerShell替换配置文件后莫名加换行符的问题
哈哈,这个坑我之前踩过!你遇到的换行符问题,根源是Get-Content和Set-Content的默认行为:Get-Content会把文件内容拆成一行行的数组,哪怕你的文件只有一行不带换行的内容,它也会把这行单独作为数组元素;而Set-Content输出时,会给每个数组元素自动加换行符,结果就凭空多了个尾巴换行。
给你两种靠谱的解决办法,按需选就行:
方法1:用Get-Content -Raw一次性读文件
-Raw参数会把整个文件内容当成单个字符串读进来,不会拆分成行,再配合Set-Content的-NoNewline参数,就能完美避免额外换行:
$sourceDir = "C:\Users\001" $configFiles = Get-ChildItem $sourceDir *.dat -Recurse foreach ($file in $configFiles) { (Get-Content $file.PSPath -Raw) -replace "006", "007" | Set-Content $file.PSPath -NoNewline }
-Raw:把文件内容一次性读成一个完整字符串,跳过分行逻辑-NoNewline:告诉Set-Content写完内容后别额外加换行
方法2:直接调用.NET的文件操作类(更精准)
如果想完全掌控文件读写的细节,绕开PowerShell cmdlet的默认格式化,直接用.NET的System.IO.File静态方法是最稳妥的:
$sourceDir = "C:\Users\001" $configFiles = Get-ChildItem $sourceDir *.dat -Recurse foreach ($file in $configFiles) { $content = [System.IO.File]::ReadAllText($file.FullName) $newContent = $content -replace "006", "007" [System.IO.File]::WriteAllText($file.FullName, $newContent) }
这个方法会原封不动保留文件原本的格式——原来有换行就留着,原来没有就不会加,只替换你指定的字符串,完全不会搞小动作。
小提醒:如果你的所有配置文件都是只有一行无换行的字符串,两种方法都能用;要是有些文件本身带换行,那方法2更合适,它不会破坏原有换行结构。
内容的提问来源于stack exchange,提问作者Chipmunk_da
相关产品推荐
相关产品推荐

