【问题标题】:Need help with INI file in Powershell需要有关 Powershell 中的 INI 文件的帮助
【发布时间】:2010-12-13 23:03:59
【问题描述】:

这是交易,我正在浏览一个带有一些代码的 INI 文件。想法是使用正则表达式返回在 INI 文件中找到的所有类别,然后将 arraylist = 设置为结果。

代码如下:

    switch -regex -file $Path
    {
        "^\[(.+)\]$" {
            $arraylist.Add($matches[1])
        }
    }

但是,该函数不仅返回类别,还返回类别的计数。例如,如果 INI 文件如下所示:

[Red]
[White]
[Blue]

输出是:

0
1
2
Red
White
Blue

我该如何解决这个问题?

【问题讨论】:

    标签: powershell ini


    【解决方案1】:

    我正在尝试重现您看到的问题,但无法做到。这是我用来测试的代码的重新创建:

    ("[Red]","[White]","[Blue]") | Out-File Test.ini -Encoding ASCII
    $Path = (get-item Test.ini)
    $arraylist = new-object System.Collections.ArrayList
    $matches = @()
    switch -regex -file $Path {
        "^\[(.+)\]$" {
            $arraylist.Add($matches[1]) 
        }
    }
    
    $arrayList
    

    执行此操作时,我得到以下输出:

    Red   
    White    
    Blue
    

    我是否遗漏了您的代码未显示的内容?

    【讨论】:

    • 不知道为什么它没有为您重新创建它。它正在按照基思所说的那样做。谢谢。
    【解决方案2】:

    ArrayList.Add() 返回添加项目的索引。这就是你看到数字的原因。只需将该语句转换为无效,例如:

    [void]$arraylist.Add($matches[1])
    

    或管道到 Out-Null

    $arraylist.Add($matches[1]) | Out-Null
    

    【讨论】:

    • 谢谢!我实际上只是将其更改为: $index = $arraylist.Add($matches[1]) | Out-Null 并修复了它。
    • 你不需要两者都做。如果您在 $index 之类的变量中捕获输出,则不再需要通过管道传输到 Out-Null。
    【解决方案3】:

    另一种选择:

    $al = new-object System.Collections.ArrayList
    $cat = switch -regex -file $env:WINDIR\system.ini { "^\[([^\]]+)\]$" { $_ -replace '\[|\]'}}
    $al.AddRange($cat)
    

    【讨论】:

    • 请注意,在此版本中,$cat 变量已包含数组中的结果集合,该数组在 PowerShell 中具有一流的支持,因此不需要 ArrayList。另请参阅Get-Help about_arrays
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 2013-04-28
    • 1970-01-01
    • 2015-06-23
    • 2014-12-26
    • 2013-08-12
    • 2014-06-11
    相关资源
    最近更新 更多