使用Getini-content、Out-IniFile操作INI文件的问题咨询
Get-IniContent(PsIni模块)常见问题解决方案
问题1:Out-IniFile保存后配置节之间空行丢失
Out-IniFile默认采用紧凑模式序列化INI对象,解析阶段会丢弃原文件中无语义的空行,因此输出时不会保留原有空行。
- 常规场景修复:执行输出命令时添加
-BlankLineBetweenSections开关,即可在每个配置节之间自动插入空行,避免格式错乱,修正后的命令如下:
$File | Out-IniFile -Force "C:\MyiniFile.ini" -BlankLineBetweenSections
- 如果需要1:1还原原文件所有位置的空行(包括节内空行、连续空行),原生cmdlet不支持该能力,可在输出文件后,通过读取文件内容按自定义规则插入空行做后处理即可。
问题2:批量注释指定配置节下所有内容
模块没有内置一键注释配置节的功能,可通过两种方式实现:
方法1:操作INI对象实现(适合后续还要继续修改INI内容的场景)
先读取INI为结构化对象,把目标节的内容拼接为注释格式后删除原节,再插回对应位置即可,以注释[fruits]节为例:
# 读取INI文件 $ini = Get-IniContent "C:\MyiniFile.ini" # 拼接注释内容 $commentedContent = @(";[fruits]") foreach ($kv in $ini["fruits"].GetEnumerator()) { $commentedContent += ";$($kv.Key) = $($kv.Value)" } # 删除原fruits节 $ini.Remove("fruits") # 把注释内容写入自定义注释节,输出后即为逐行注释效果 $ini["__commented_fruits"] = $commentedContent # 保存文件 $ini | Out-IniFile -Force "C:\MyiniFile.ini" -BlankLineBetweenSections
方法2:按行处理文件(适合不想破坏其他原有格式的场景)
直接读取文件所有行,匹配到目标节范围后逐行添加注释前缀,不会改动其他位置的内容:
$filePath = "C:\MyiniFile.ini" $lines = Get-Content $filePath $inTargetSection = $false $result = for ($i=0; $i -lt $lines.Count; $i++) { $currentLine = $lines[$i] # 匹配到[fruits]节开头,开启注释标记 if ($currentLine -match '^\[fruits\]\s*$') { $inTargetSection = $true ";$currentLine" continue } if ($inTargetSection) { # 碰到下一个配置节开头,关闭注释标记 if ($currentLine -match '^\[.+\]\s*$') { $inTargetSection = $false $currentLine } # 非空行前面加分号注释,空行保留原样 elseif (-not [string]::IsNullOrWhiteSpace($currentLine)) { ";$currentLine" } else { $currentLine } } else { $currentLine } } # 写回文件,可根据需要调整编码 $result | Set-Content $filePath -Encoding UTF8
额外使用提示
本地安装模块后,直接在PowerShell中执行以下命令即可查看完整的参数说明和内置示例,不需要依赖网上的零散资料:
# 查看Get-IniContent完整帮助 Get-Help Get-IniContent -Full # 查看Out-IniFile完整帮助 Get-Help Out-IniFile -Full
内容的提问来源于stack exchange,提问作者Ofir Patishi
相关产品推荐
相关产品推荐

