我在PowerShell中解析简单(没有部分)的INI文件.这里是我想出的代码,有什么方法可以简化它吗?
convertfrom-stringdata -StringData ( ` get-content .\deploy.ini ` | foreach-object ` -Begin { $total = "" } ` { $total += "`n" + $_.ToString() } ` -End { $total } ` ).Replace("\", "\\")
Artem Tikhom.. 27
在搜索了这个主题的互联网后,我找到了一些解决方案.所有这些都是手工解析文件数据所以我放弃了尝试制作标准cmdlet来完成这项工作.有花式解决这个支持写入场景.
有更简单的,只要我不需要写作支持,我选择了非常优雅的代码片段:
Function Parse-IniFile ($file) { $ini = @{} # Create a default section if none exist in the file. Like a java prop file. $section = "NO_SECTION" $ini[$section] = @{} switch -regex -file $file { "^\[(.+)\]$" { $section = $matches[1].Trim() $ini[$section] = @{} } "^\s*([^#].+?)\s*=\s*(.*)" { $name,$value = $matches[1..2] # skip comments that start with semicolon: if (!($name.StartsWith(";"))) { $ini[$section][$name] = $value.Trim() } } } $ini }
这是Jacques Barathon的.
更新感谢Aasmund Eldhuset和@msorens的增强功能:空白修剪和评论支持.
更新2跳过以分号开头的任何name=value
对,这些对是注释行.替换为.name
;
$ini [$section] = @{}
$ini[$section] = @{}
在搜索了这个主题的互联网后,我找到了一些解决方案.所有这些都是手工解析文件数据所以我放弃了尝试制作标准cmdlet来完成这项工作.有花式解决这个支持写入场景.
有更简单的,只要我不需要写作支持,我选择了非常优雅的代码片段:
Function Parse-IniFile ($file) { $ini = @{} # Create a default section if none exist in the file. Like a java prop file. $section = "NO_SECTION" $ini[$section] = @{} switch -regex -file $file { "^\[(.+)\]$" { $section = $matches[1].Trim() $ini[$section] = @{} } "^\s*([^#].+?)\s*=\s*(.*)" { $name,$value = $matches[1..2] # skip comments that start with semicolon: if (!($name.StartsWith(";"))) { $ini[$section][$name] = $value.Trim() } } } $ini }
这是Jacques Barathon的.
更新感谢Aasmund Eldhuset和@msorens的增强功能:空白修剪和评论支持.
更新2跳过以分号开头的任何name=value
对,这些对是注释行.替换为.name
;
$ini [$section] = @{}
$ini[$section] = @{}
唐·琼斯几乎是对的.尝试:
ConvertFrom-StringData((Get-Content .\deploy.ini) -join "`n")
-join
将Object []转换为单个字符串,数组中的每个项目由换行符char分隔.ConvertFrom-StringData
然后将字符串解析为键/值对.
这实际上是对当前答案的扩展(似乎无法附加评论).
我搞砸了这个做整数和小数的基本处理......
function Parse-IniFile ($file) { $ini = @{} switch -regex -file $file { #Section. "^\[(.+)\]$" { $section = $matches[1].Trim() $ini[$section] = @{} continue } #Int. "^\s*([^#].+?)\s*=\s*(\d+)\s*$" { $name,$value = $matches[1..2] $ini[$section][$name] = [int]$value continue } #Decimal. "^\s*([^#].+?)\s*=\s*(\d+\.\d+)\s*$" { $name,$value = $matches[1..2] $ini[$section][$name] = [decimal]$value continue } #Everything else. "^\s*([^#].+?)\s*=\s*(.*)" { $name,$value = $matches[1..2] $ini[$section][$name] = $value.Trim() } } $ini }