PowerShell: цикл по INI-файлу - PullRequest
0 голосов
/ 31 октября 2018

Я работаю над сценарием PowerShell, который будет выполнять следующие действия:

  1. Используйте функцию, чтобы получить данные ini и назначить их хеш-таблице (в основном то, что делает Get-IniContent, но я использую такую, которую нашел на этом сайте).
  2. Проверьте вложенные ключи (не разделы, а ключи каждого раздела), чтобы узнать, существует ли значение «NoRequest».
  3. Если раздел содержит ключ NoRequest и ТОЛЬКО ЕСЛИ значение NoRequest равно false, тогда я хочу вернуть имя раздела, ключ NoRequest и значение ключа. Например, что-то вроде «Section [DataStuff] имеет значение NoRequest, установленное в false». Если раздел не содержит ключа NoRequest или для него установлено значение true, его можно пропустить.

Я считаю, что я выполнил первые две части этого, но я не уверен, как перейти к третьему шагу. Вот код, который у меня есть:

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
        }
    }
}

Когда я запускаю приведенный выше код, он дает мне следующий ожидаемый результат, поскольку я знаю, что в INI есть четыре экземпляра NoRequest, и только один из них имеет значение false:

false

Я полагаю, что я решил проблему с поиском правильных значений из файла, но я не уверен, как поступить с правильным выводом, как указано в шаге 3 выше.

1 Ответ

0 голосов
/ 31 октября 2018

Вы были почти там. Это выведет строку в форме, которую вы упомянули:

$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 всегда будут одинаковыми в выводе.

...