Я не могу обновить INI-файл.Рассматривать ini-файл как hastable в Powershell - PullRequest
0 голосов
/ 03 января 2019

Мне нужно обновить файл конфигурации ini.Мне удалось преобразовать файл в hastable и обновить значения.Но когда я проверяю, верны ли изменения в файле, он не изменился.Add-Content не работает.мне нужно преобразовать в строку для использования функции Add-Content?

Файл конфигурации также заполнен простым текстом.

"ini" Файл конфигурации:

[sqlScript1Deployment]

sqlServerName                         = '??????????'
olapServerName                        = '??????????'
(...)

Мой код ps1:

[hashtable]$ht = Get-Configuration($iniFilepath)
$ht["sqlScript1Deployment"]["sqlServerName"] = 'Master'

$ht | Add-Content $iniFilepath

Ожидаемый код в файле "ini":

[sqlScript1Deployment]
sqlServerName                         = 'Master'

Фактический результат в файле "ini":

[sqlScript1Deployment]
sqlServerName                         = '??????????'

1 Ответ

0 голосов
/ 04 января 2019

Я понятия не имею, откуда вы взяли функцию Get-Configuration, но если она создает хеш-таблицу, где каждый ключ равен Section для INI, а каждое значение - это пара name/value, например:

$ht = @{
    'sqlScript1Deployment' = @{
        'sqlServerName'  = '??????????'
        'olapServerName' = '??????????'
    }
}

Может помочь следующий код:

# set the new value for sqlServerName
$ht['sqlScript1Deployment']['sqlServerName'] = 'Master'

# write the Hashtable back to disk as .INI file
$sb = New-Object -TypeName System.Text.StringBuilder

# the Keys are the Sections in the Ini file
# the properties are name/value pairs within these keys
foreach ($section in $ht.Keys) {
    [void]$sb.AppendLine("[$section]")
    foreach ($name in $ht[$section].Keys) {
        $value = $ht[$section][$name]
        # the value needs to be quoted when:
        # - it begins or ends with whitespace characters
        # - it contains single or double quote characters
        # - it contains possible comment characters ('#' or ';')
        if ($value -match '^\s+|[#;"'']|\s+$') {
            # escape quotes inside the value and surround the value with double quote marks
            $value = '"' + ($value -replace '(["''])', '\$1') + '"'
        }
        [void]$sb.AppendLine("$name = $value")
    }
}

$sb.ToString() | Out-File $iniFilepath
[void]$sb.Clear()

Полученный файл будет выглядеть так:

[sqlScript1Deployment]
sqlServerName = Master
olapServerName = ??????????
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...