Получение Вы не можете вызвать метод для выражения с нулевым значением в словаре Powershell - PullRequest
0 голосов
/ 12 марта 2019
$file = 'test.properties'

$dict = @{}

foreach ($line in Get-Content $file) {
   $words = $line.split('=', 2)
   $dict.Add($words[0].Trim(), $words[1].Trim())
}

test.properties

dbpassword=password
dbdatabase=database
dbuser=username

Я пытаюсь прочитать файл свойств в диктанцию ​​в виде ключей и значений, как показано ниже.

$dict = @{dbpassword='password', dbdatabase='database}

Но когда я пытаюсь запустить этот код. Я получаю. Вы не можете вызвать метод для выражения с нулевым значением. ошибка. Где я делаю не так?

1 Ответ

1 голос
/ 12 марта 2019

Один из способов сделать это для заданного количества файлов через $args (на основе вашего первого кода) может быть следующим:

# $in is an Array of filenames, so use [string[]], not [string]
$in   = [string[]]$args
$dict = @{}

# get a list of FileInfo objects for files that match the names in the $in variable
$files = @(Get-ChildItem -Filter *.properties -File | Where-Object { $_.Name -in $in })

if ($files.Count) {
    $files | ForEach-Object {
        foreach ($line in ($_ | Get-Content)) {
            # check if this is indeed a "key=Value" line
            if ($line -match '.+=.*') {
                # get the key and the value and trim them at the same time
                $key, $value = $line.split('=', 2).Trim()

                # Decide here what to do with duplicates.
                # 1) skip adding new values if the key already exists ('First one wins')
                if (!($dict.ContainsKey($key))) {
                    $dict.Add($key, $value)
                }

                # or
                # 2) overwrite any values for keys that already exist ('Last one wins')
                # $dict[$key] = $value
            }
        }
    }
}
else {
    Write-Host "None of the given files exist"
}

Если вы абсолютно уверены в структуре данного файла .properties, вы также можете использовать командлет ConvertFrom-StringData . Используя ваше последнее редактирование, где вы читаете в одном файле:

$file = 'test.properties'
if (Test-Path -Path $file -PathType Leaf) {
    $dict = ConvertFrom-StringData -StringData (Get-Content $file -Raw)
}
else {
    Write-Host "File '$file' does not exist"
}

Сообщение об ошибке, которое вы получили, я думаю из строки foreach ($line in Get-Content $file) {..}. Там вы должны были поставить Get-Content часть между скобками, вот так:

foreach ($line in (Get-Content $file)) {..}

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...