PowerShell脚本问题:如何将数组参数换行写入INI文件
PowerShell脚本修复:向INI文件添加分类参数并保持格式正确
我正在编写PowerShell脚本,用于将更新中的新参数按[分类]归类添加至INI文件,脚本需检测缺失参数并追加到对应分类下,但现有脚本输出格式异常,需修正。
现有代码
$inipath = "somepath" $list =@([PSCustomObject] @{ type = "\[cat\]"; values = "par1=N","par2=N", "par3=N"}) foreach($entry in $list){ if(Select-String -Path $inipath -Pattern $entry.values -SimpleMatch -Quiet){ } else{ $parameter += @([PSCustomObject] @{ type = $entry.type; values = $entry.values }) } } $tlength = $parameter.type.length for($x=0; $x -le $tlength; $x++ ){ $vlength = $parameter[$x].values.Length for($y=0;$y -le $vlength; $y++){ $par = $parameter[$x].values[$y] $par = $par -join '`n' $fileContent = Get-Content $inipath $linenumber= Get-Content $inipath | select-string $parameter[$x].type $fileContent[$lineNumber.LineNumber +1] += $par $fileContent | Set-Content $inipath }
当前问题
脚本可识别缺失参数,但输出格式混乱:
[cat]par1=Npar2=N=par3=N
期望输出
[cat] par1=N par2=N par3=N
问题分析与修复方案
- 循环边界错误:原脚本用
-le(小于等于)遍历数组,因数组索引从0开始,会导致越界访问空元素,需改为-lt(小于)。 - 参数拼接逻辑错误:单个参数执行
-join 'n'`无意义,应直接对整个参数数组做换行拼接。 - 文件读写效率低下:内部循环反复读写文件,应一次性读取内容,处理完成后再写入。
- 行号处理错误:
LineNumber从1开始,数组索引从0开始,需转换后再定位插入位置,且不能直接追加到行末尾,需单独成行插入。
修正后的完整代码
$inipath = "somepath" # 定义需检查的分类与参数,无需转义分类名,后续用SimpleMatch匹配 $requiredSettings = @( [PSCustomObject]@{ Section = "[cat]" Parameters = "par1=N", "par2=N", "par3=N" } ) # 一次性读取INI文件全部内容,减少IO操作 $fileContent = Get-Content -Path $inipath -Raw foreach ($setting in $requiredSettings) { # 检查目标分类是否存在 $sectionExists = $fileContent -match [regex]::Escape($setting.Section) if (-not $sectionExists) { # 分类不存在时,直接追加分类及所有参数 $fileContent += "`n$($setting.Section)`n$($setting.Parameters -join "`n")`n" continue } # 提取当前分类下已有的参数 $sectionRegex = "(?s)(?<=^$([regex]::Escape($setting.Section))`n).*?(?=^`[|`Z)" $currentParams = if ($fileContent -match $sectionRegex) { $matches[0] -split "`n" | Where-Object { $_ -match '=' } } else { @() } # 筛选出缺失的参数 $missingParams = $setting.Parameters | Where-Object { $_ -notin $currentParams } if ($missingParams.Count -eq 0) { continue } # 计算参数插入位置:分类行的下一行 $sectionLineNumber = ($fileContent -split "`n") | Select-String -Pattern $setting.Section -SimpleMatch | Select-Object -ExpandProperty LineNumber $insertIndex = $sectionLineNumber # 转换为数组索引(行号1对应数组索引0,下一行索引为1) $fileArray = $fileContent -split "`n" # 插入缺失参数,每个参数单独成行 $fileArray = $fileArray[0..($insertIndex-1)] + $missingParams + $fileArray[$insertIndex..($fileArray.Count-1)] $fileContent = $fileArray -join "`n" } # 一次性写入修改后的内容 Set-Content -Path $inipath -Value $fileContent -Force
修正说明
- 用
-Raw参数一次性读取文件,避免反复IO操作,提升效率。 - 通过正则匹配精准定位分类区域,提取已有参数对比缺失项。
- 兼容分类不存在的场景,直接添加分类及对应参数。
- 正确计算插入位置,确保参数在分类下方单独成行,符合INI格式规范。
内容的提问来源于stack exchange,提问作者jesse North
相关产品推荐
相关产品推荐

