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

如何在PowerShell中结合If/Else实现文本查找替换

批量修改文本行尾值的PowerShell解决方案

需求说明

  • 处理含约250行的文本文件,每行以分号分隔字段
  • 需按以下规则替换每行最后两个值:
    1. 所有以;0;3;3;;结尾的行,替换为;0;17;18;;(已实现)
    2. 行内包含-的,将行尾;3;3;;替换为;21;21;;
    3. 行内不包含-的,将行尾;3;3;;替换为;22;22;;

示例文本行:

112;20-21;32;20-21;24;0;2;248;271;3;3;;
69;1;4;173390;5;0;0;5460;5464;3;3;;
24;7;4;173390;227;0;0;0;0;3;3;;

现有问题

原脚本无法区分行内是否含-,统一替换了行尾;3;3;;,尝试给含-的行加后缀的方法未成功。

原脚本代码:

foreach ($file in Get-ChildItem *.*)
{
  (Get-Content $file) -replace ';0;3;3;;',';;0;17;18;;' -replace ';3;3;;',';21;21;;' | Out-file -encoding ASCII $file-new
}

解决方案

不需要给行添加额外标记,直接逐行判断处理即可,以下是修正后的脚本:

foreach ($file in Get-ChildItem *.*) {
    $outputLines = Get-Content $file | ForEach-Object {
        $line = $_
        # 处理第一个规则:替换;0;3;3;;为;0;17;18;;
        $line = $line -replace ';0;3;3;;', ';0;17;18;;'
        # 判断是否需要处理剩余规则(如果已经替换过第一个规则,行尾不再是;3;3;;)
        if ($line -match ';3;3;;$') {
            if ($line -like '*-*') {
                # 含-的行,替换行尾为;21;21;;
                $line = $line -replace ';3;3;;$', ';21;21;;'
            } else {
                # 不含-的行,替换行尾为;22;22;;
                $line = $line -replace ';3;3;;$', ';22;22;;'
            }
        }
        $line
    }
    # 输出到新文件,避免覆盖原文件
    $outputLines | Out-File -Encoding ASCII "$($file.Name)-new.txt"
}

脚本说明

  1. 用ForEach-Object逐行处理文本,确保每一行单独判断
  2. 先执行第一个替换规则,避免后续判断冲突
  3. 通过-match ';3;3;;$'精准检查行尾是否还需要处理
  4. 用-like '*-*'判断行内是否包含短横线,分别执行对应替换
  5. 输出文件命名为原文件名加-new.txt,防止误删原文件

补充优化

如果需要直接覆盖原文件(建议先备份),可以把输出部分改为:

$outputLines | Set-Content -Encoding ASCII $file.FullName

内容的提问来源于stack exchange,提问作者Mr DXF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:32:22