我正在用PowerShell解析简单的(没有节) INI文件。下面是我想出来的代码,有没有办法简化它呢?
convertfrom-stringdata -StringData ( `
get-content .\deploy.ini `
| foreach-object `
-Begin { $total = "" } `
{ $total += "`n" + $_.ToString() } `
-End { $total } `
).Replace("\", "\\")发布于 2009-01-07 22:52:04
在网上搜索了这个话题后,我找到了一些解决方案。所有这些都是手动解析文件数据,所以我放弃了尝试制作标准的cmdlet来完成这项工作。有一些奇特的解决方案,如this,它支持编写场景。
还有一些更简单的,只要我不需要编写支持,我就选择了以下非常优雅的代码片段:
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 starts with a semicolon ; which are comment lines的任何name=value对。已将$ini [$section] = @{}替换为$ini[$section] = @{}。
发布于 2011-11-22 09:03:03
唐·琼斯几乎说对了。尝试:
ConvertFrom-StringData((Get-Content .\deploy.ini) -join "`n")-join将Object[]转换为单个字符串,数组中的每一项都用换行符分隔。然后,ConvertFrom-StringData将字符串解析为键/值对。
发布于 2011-07-13 22:12:20
这实际上是对当前答案的扩展(似乎无法添加注释)。
我摆弄了一下,对整数和小数做了基本的处理……
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
}https://stackoverflow.com/questions/417798
复制相似问题