You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:31:40