PowerShell脚本致输出文件重复加倍,如何修复并实现单文件修改?
解决PowerShell脚本导致输出文件重复加倍的问题
听起来你遇到的问题根源有两个:一是链式的输入输出依赖(用前一个输出文件作为下一个的输入),二是Out-File默认编码和原文件不匹配导致文件大小翻倍,而且你其实想要所有修改都在同一个文件完成,不需要生成多个中间文件。
问题分析
你的现有脚本是依次处理三个步骤,每个步骤都读取前一个输出文件再写入新文件:
- 第一步把
DW_FEI_input1.ctg处理成DW_FEI_output1.ctg - 第二步把
DW_FEI_output1.ctg处理成DW_FEI_output2.ctg - 第三步把
DW_FEI_output2.ctg处理成DW_FEI_output3.ctg
这种方式不仅生成冗余的中间文件,更关键的是Out-File默认使用**UTF-16(Unicode)**编码,而你的源文件大概率是ANSI或UTF-8编码,这直接导致文件大小翻倍(因为UTF-16每个字符占2字节)。另外,链式处理还可能导致重复替换的风险(比如后续规则匹配到之前修改的内容)。
解决方案:一次性读取+批量替换+指定编码
我们可以读取一次源文件,在内存中完成所有替换,最后写入目标文件,同时指定和原文件一致的编码,确保文件大小不会异常变化。
修改后的脚本如下:
# 定义所有替换规则(只保留pattern和replacement,不需要重复指定文件) $replacements = @( @{ pattern = "LACTION 'SQL\(''logility_prod_scp_logility''," replacement = "LACTION 'SQL(''LOGILITY_PROD_SCP_LOGILITY''," }, @{ pattern = "LACTION 'SQL\(''dwfei''," replacement = "LACTION 'SQL(''DW_FEI''," }, @{ pattern = "LACTION 'SQL\(''DWFEI''," replacement = "LACTION 'SQL(''DW_FEI''," } ) # 定义源文件和目标文件路径(可以是同一个文件,建议先备份源文件) $sourceFile = "C:\files\DW_FEI_input1.ctg" $outputFile = "C:\files\DW_FEI_final.ctg" # 一次性读取源文件内容(-Raw参数避免逐行处理的潜在问题) $content = Get-Content -Path $sourceFile -Raw # 依次应用所有替换规则 foreach ($rule in $replacements) { $content = $content -replace $rule.pattern, $rule.replacement } # 写入目标文件,指定编码和原文件一致(这里用Default对应ANSI,根据实际情况调整) $content | Out-File -Path $outputFile -Encoding Default
关键要点
- 一次性读取:用
Get-Content -Raw把整个文件读入内存,避免多次读写文件,提高效率也避免重复写入的问题。 - 批量替换:在内存中依次应用所有规则,不需要生成中间文件,确保修改是一次性完成的。
- 指定编码:
-Encoding Default会使用系统默认的ANSI编码,如果你原文件是UTF-8,就改成-Encoding UTF8,这样文件大小和原文件保持一致。 - 备份源文件:如果想要直接覆盖源文件,把
$outputFile改成和$sourceFile一样,但一定要先备份源文件,避免修改出错无法恢复。
这样处理后,你就能得到一个只包含所需修改、文件大小正常的输出文件,不会再出现重复加倍的问题了。
内容的提问来源于stack exchange,提问作者user9766188
相关产品推荐
相关产品推荐

