首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PowerShell中的INI文件解析

PowerShell中的INI文件解析
EN

Stack Overflow用户
提问于 2009-01-07 03:32:51
回答 8查看 34.5K关注 0票数 17

我正在用PowerShell解析简单的(没有节) INI文件。下面是我想出来的代码,有没有办法简化它呢?

代码语言:javascript
复制
convertfrom-stringdata -StringData ( `
  get-content .\deploy.ini `
  | foreach-object `
    -Begin { $total = "" }  `
    { $total += "`n" + $_.ToString() } `
    -End { $total } `
).Replace("\", "\\")
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-01-07 22:52:04

在网上搜索了这个话题后,我找到了一些解决方案。所有这些都是手动解析文件数据,所以我放弃了尝试制作标准的cmdlet来完成这项工作。有一些奇特的解决方案,如this,它支持编写场景。

还有一些更简单的,只要我不需要编写支持,我就选择了以下非常优雅的代码片段:

代码语言:javascript
复制
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] = @{}

票数 28
EN

Stack Overflow用户

发布于 2011-11-22 09:03:03

唐·琼斯几乎说对了。尝试:

代码语言:javascript
复制
ConvertFrom-StringData((Get-Content .\deploy.ini) -join "`n")

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

票数 10
EN

Stack Overflow用户

发布于 2011-07-13 22:12:20

这实际上是对当前答案的扩展(似乎无法添加注释)。

我摆弄了一下,对整数和小数做了基本的处理……

代码语言:javascript
复制
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
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/417798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档