PowerShell自动化脚本输出CTG文件大小翻倍问题求助
问题分析与解决方案
我一眼就看出你的脚本有两个关键问题,导致了输出文件大小翻倍且替换逻辑不符合预期:
1. 重复写入与编码不匹配
你的脚本每次循环都从原始输入文件读取内容,然后用Out-File写入同一个输出文件。Out-File在PowerShell 5.1及更早版本中默认使用Unicode(UTF-16LE)编码,而你的原始.ctg文件大概率是单字节编码(比如ASCII或UTF-8)。单字节编码转双字节编码会直接让文件大小翻倍,这就是你看到的现象。
2. 替换逻辑错误
当前脚本的三个替换操作是独立的:每次都读取原始输入,替换一个模式后覆盖输出文件。这意味着最终的输出文件只会保留最后一次替换的结果,前两次的替换都会被覆盖,根本没有累积生效。
修正后的脚本
我们需要做两个调整:
- 只读取一次原始输入文件,在内存中依次应用所有替换规则,最后一次性写入输出文件,避免重复编码转换。
- 指定与原始文件一致的编码(比如
UTF8或ASCII,根据你的文件实际情况选择),确保输出文件大小正常。
# 定义替换规则数组 $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''," } ) # 读取一次原始输入文件(指定编码,这里假设是UTF8,根据实际调整) $content = Get-Content -Path "C:\files\DW_FEI_input.ctg" -Encoding UTF8 # 依次应用所有替换规则 foreach ($rule in $replacements) { $content = $content -replace $rule.pattern, $rule.replacement } # 写入输出文件,指定与原始文件一致的编码 $content | Out-File -Path "C:\files\DW_FEI_output.ctg" -Encoding UTF8 -Force
额外说明
- 如果你不确定原始文件的编码,可以直接尝试
ASCII编码(如果文件没有特殊字符),或者用Get-Content -Path "C:\files\DW_FEI_input.ctg" -Raw查看内容后判断。 -Force参数确保输出文件存在时会被覆盖,避免报错。- 这种一次性读取+批量替换的方式不仅解决了文件大小问题,还让所有替换规则都能生效,完全符合你的预期。
内容的提问来源于stack exchange,提问作者user9766188
相关产品推荐
相关产品推荐

