PowerShell实现文本文件逐行修改:非校验行前6字符后加连字符
你的思路方向是对的,问题主要出在没有收集处理后的行并写回文件,另外正则匹配的写法也需要微调。下面是修正后的完整解决方案,以及关键细节的说明:
修正后的脚本(简洁管道版)
$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
关键细节说明
收集处理结果
原脚本只是在循环里输出修改后的行,但没有把这些结果保存下来。通过管道传递的方式,我们可以把所有处理后的行直接传给Set-Content,一次性写入文件,比用数组收集更简洁高效。正则匹配修正
你原来的-notmatch "CHECKSUM*"存在正则语法问题:*在正则中表示匹配前面的字符零次或多次,所以这个表达式会错误匹配CHECKSU(没有M)、CHECKSUM(一个M)甚至CHECKSU MMM(多个M)。
正确的写法是^CHECKSUM,其中^表示行的开头,确保只匹配以CHECKSUM开头的那一行(也就是你的校验和行)。避免文件占用问题
把Get-Content $filePath用括号括起来(Get-Content $filePath),是为了先把整个文件内容读入内存,再进行处理。这样处理完后写回原文件时,不会因为文件还在被读取而出现占用报错。编码注意事项
加上-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

