如何在PowerShell中按行号更新文件?解决配置修改异常问题
解决PowerShell更新config.ini的两个问题
问题1:按“..”分割字符串失败的原因
PowerShell的-Split默认用正则表达式匹配,而.在正则里是任意单个字符的通配符,直接写-Split ".."会匹配任意两个连续字符,根本不是你想要的按字面意义的..分割。必须把..转义成正则里的字面量,用\.\.或者借助[regex]::Escape()来处理。
你原代码里的分割逻辑完全错误,导致拿不到正确的路径后缀。
问题2:更新行号时文件被清空的原因
- 索引越界:
Select-String返回的LineNumber是从1开始计数的,但PowerShell数组的索引是从0开始的,你直接用$ConfigContent[$LineNum]访问的是数组里不存在的位置,赋值后结果是$null。 - 逻辑错误:你把修改单个元素的操作和
Set-Content用管道连在一起,相当于只把这一个无效元素写入文件,自然会清空原内容只留无效行。
修正后的完整脚本
# 配置参数 $CfgFile = ".\cfg\cfg.ini" $OutputFile = ".\cfg\cfg-test.ini" $SearchString = "version.clients.latest.jreLocation=" # 直接用目标路径后缀更简单,不需要从原路径提取 $NewLine = "$SearchString..\..\..\1AOpenJRE\jre1.8.0_342\jre8" # 读取配置文件内容到数组 $ConfigContent = Get-Content -Path $CfgFile # 找到目标行的索引(数组从0开始) $LineIndex = $ConfigContent | ForEach-Object { $i = 0 } { if ($_ -match "^$SearchString") { $i }; $i++ } # 修改数组中的对应行 $ConfigContent[$LineIndex] = $NewLine # 将整个修改后的数组写入输出文件 $ConfigContent | Set-Content -Path $OutputFile -Encoding Default
可选:从原路径提取后缀的正确方式
如果一定要从原路径里截取\1AOpenJRE...部分,分割代码应该这么写:
# 先按=分割拿到原路径值(限制只分割1次,避免路径里有=号) $OriginalPath = $TargetLine -split "=", 2 | Select-Object -Last 1 # 按字面意义的..分割,取第二部分 $PathSuffix = ($OriginalPath -split [regex]::Escape(".."), 2)[1] $NewLine = "$SearchString..\..\..$PathSuffix"
内容的提问来源于stack exchange,提问作者Mr. E
相关产品推荐
相关产品推荐

