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

PowerShell实现文本文件逐行修改:非校验行前6字符后加连字符

PowerShell 修改文本文件:在指定位置插入字符并写回原文件

你的思路方向是对的,问题主要出在没有收集处理后的行并写回文件,另外正则匹配的写法也需要微调。下面是修正后的完整解决方案,以及关键细节的说明:

修正后的脚本(简洁管道版)

$filePath = "C:\Users\usr\Desktop\file123624.TXT"

# 读取文件→逐行处理→写回原文件
(Get-Content $filePath) | ForEach-Object {
    if ($_ -notmatch "^CHECKSUM") {
        # 在前6个字符后插入连字符
        $_.Insert(6, '-')
    } else {
        # 保留校验和行不变
        $_
    }
} | Set-Content -Path $filePath -Encoding ASCII

关键细节说明

  1. 收集处理结果
    原脚本只是在循环里输出修改后的行,但没有把这些结果保存下来。通过管道传递的方式,我们可以把所有处理后的行直接传给Set-Content,一次性写入文件,比用数组收集更简洁高效。

  2. 正则匹配修正
    你原来的-notmatch "CHECKSUM*"存在正则语法问题:*在正则中表示匹配前面的字符零次或多次,所以这个表达式会错误匹配CHECKSU(没有M)、CHECKSUM(一个M)甚至CHECKSU MMM(多个M)。
    正确的写法是^CHECKSUM,其中^表示行的开头,确保只匹配以CHECKSUM开头的那一行(也就是你的校验和行)。

  3. 避免文件占用问题
    把Get-Content $filePath用括号括起来(Get-Content $filePath),是为了先把整个文件内容读入内存,再进行处理。这样处理完后写回原文件时,不会因为文件还在被读取而出现占用报错。

  4. 编码注意事项
    加上-Encoding ASCII是为了和原文件的编码保持一致,避免出现乱码。如果你的原文件是其他编码(比如UTF-8),可以改成对应的编码参数。

验证结果

运行脚本后,文件内容会完全符合你的期望:

FKHOGU-1100;;;;;;;;;;;;;randomdata;1;0;2;1234
YJKMRI-1101;;;;;;;;;;;;;randomdata;1;0;2;1234
FWPCYY-1113;GV;randomdata;5;;;;;;;6012;randomdata;GU;;1;0;2;1234
VOBYTM-1100;;;;;;;;;;;;;randomdata;1;0;2;1234
ZSOKHW-1160;GV;randomdata;53;;;;;;;7653;randomdata;GU;;1;0;2;1234
YCHQHS-1123;GV;randomdata;4;;;;;;;5463;randomdata;GU;;1;0;2;1234
YXRCZO-1105;GV;randomdata;39;;;;;;;9210;randomdata;GU;;1;0;2;1234
XVDUEM-1100;GV;randomdata;14;;;;;;;9401;randomdata;GU;;1;0;2;1234
CHECKSUM;0000008

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:11:27