当前位置:  开发笔记 > 编程语言 > 正文

在PowerShell中解析INI文件

如何解决《在PowerShell中解析INI文件》经验,为你挑选了3个好方法。

我在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] = @{}



1> Artem Tikhom..:

在搜索了这个主题的互联网后,我找到了一些解决方案.所有这些都是手工解析文件数据所以我放弃了尝试制作标准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] = @{}



2> Steve Becker..:

唐·琼斯几乎是对的.尝试:

ConvertFrom-StringData((Get-Content .\deploy.ini) -join "`n")

-join将Object []转换为单个字符串,数组中的每个项目由换行符char分隔.ConvertFrom-StringData然后将字符串解析为键/值对.



3> WaffleSouffl..:

这实际上是对当前答案的扩展(似乎无法附加评论).

我搞砸了这个做整数和小数的基本处理......

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
}

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有