PowerShell:遍历.ini文件

时间:2018-10-31 14:32:04

标签: powershell loops if-statement foreach ini

我正在处理将执行以下操作的PowerShell脚本:

  1. 使用一个函数来获取ini数据并将其分配给哈希表(基本上是Get-IniContent的功能,但是我使用的是我在本网站上找到的数据)。
  2. 检查嵌套键(不是节,而是每个节的键),以查看值“ NoRequest”是否存在。
  3. 如果一个节包含一个NoRequest键,并且仅当NoRequest值是false时,我才想返回该节的名称,NoRequest键和键的值。例如,类似“部分[DataStuff]的NoRequest值设置为false”。如果某个部分不包含NoRequest键,或者该值设置为true,则可以跳过该部分。

我相信我已经完成了前两个部分,但是我不确定如何进行第三步。这是我到目前为止的代码:

DateTime.Now - DateTime.UtcNow

当我运行上述代码时,它会提供以下预期输出,因为我知道INI中有四个NoRequest实例,并且其中只有一个设置为false:

function Get-IniFile 
{  
    param(  
        [parameter(Mandatory = $true)] [string] $filePath  
    )  

    $anonymous = "NoSection"

    $ini = @{}  
    switch -regex -file $filePath  
    {  
        "^\[(.+)\]$" # Section  
        {  
            $section = $matches[1]  
            $ini[$section] = @{}  
            $CommentCount = 0  
        }  

        "^(;.*)$" # Comment  
        {  
            if (!($section))  
            {  
                $section = $anonymous  
                $ini[$section] = @{}  
            }  
            $value = $matches[1]  
            $CommentCount = $CommentCount + 1  
            $name = "Comment" + $CommentCount  
            $ini[$section][$name] = $value  
        }   

        "(.+?)\s*=\s*(.*)" # Key  
        {  
            if (!($section))  
            {  
                $section = $anonymous  
                $ini[$section] = @{}  
            }  
            $name,$value = $matches[1..2]  
            $ini[$section][$name] = $value  
        }  
    }  

    return $ini  
}  

$iniContents = Get-IniFile C:\testing.ini

    foreach ($key in $iniContents.Keys){
    if ($iniContents.$key.Contains("NoRequest")){
        if ($iniContents.$key.NoRequest -ne "true"){
        Write-Output $iniContents.$key.NoRequest
        }
    }
}

我相信我已经解决了从文件中查找正确值的问题,但是我不确定如何继续进行上述步骤3中提到的正确输出。

1 个答案:

答案 0 :(得分:1)

您快到了。这将以您提到的形式输出一个字符串:

$key = "NoRequest" # They key you're looking for
$expected = "false" # The expected value
foreach ($section in $iniContents.Keys) {
    # check if key exists and is set to expected value
    if ($iniContents[$section].Contains($key) -and $iniContents[$section][$key] -eq $expected) {
        # output section-name, key-name and expected value
        "Section '$section' has a '$key' key set to '$expected'."
    }
}

当然,自从你说过。

  

如果某节包含一个NoRequest键,并且仅当NoRequest值   为假,那么我想返回该部分的名称NoRequest   键,以及键的值。

..键名和-value在输出中将始终相同。