我在PowerShell中解析简单(没有部分)的INI文件.这里是我想出的代码,有什么方法可以简化它吗?
convertfrom-stringdata -StringData ( `
get-content .\deploy.ini `
| foreach-object `
-Begin { $total = "" } `
{ $total += "`n" + $_.ToString() } `
-End { $total } `
).Replace("\", "\\")
Run Code Online (Sandbox Code Playgroud)
Art*_*rov 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
}
Run Code Online (Sandbox Code Playgroud)
这是Jacques Barathon的.
更新感谢Aasmund Eldhuset和@msorens的增强功能:空白修剪和评论支持.
更新2跳过以分号开头的任何name=value 对,这些对是注释行.替换为.name ;$ini [$section] = @{}$ini[$section] = @{}
唐·琼斯几乎是对的.尝试:
ConvertFrom-StringData((Get-Content .\deploy.ini) -join "`n")
Run Code Online (Sandbox Code Playgroud)
-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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
28521 次 |
| 最近记录: |