Как отредактировать значение INI-файла в Powershell?

#powershell #ini

#powershell #ini

Вопрос:

У меня есть INI-файл:

  [Name]
    Female = 10
    Male = 30

    [Class]
    Kids = 2
    Adult = 10
  

Я хочу изменить значение каждого раздела. Дайте мне идею, пожалуйста.

Я попробовал этот код:

 function Set-OrAddIniValue
{
    Param(
        [string]$FilePath,
        [hashtable]$keyValueList
    )

    $content = Get-Content $FilePath

    $keyValueList.GetEnumerator() | ForEach-Object {
        if ($content -match "^$($_.Key)=")
        {
            $content= $content -replace "^$($_.Key)=(.*)", "$($_.Key)=$($_.Value)"
        }
        else
        {
            $content  = "$($_.Key)=$($_.Value)"
        }
    }

    $content | Set-Content $FilePath
}
  

это код

Комментарии:

1. Что вы пробовали? Есть какая-нибудь работа, которую нужно показать? На какой именно части вы застряли? Stack Overflow не является сервисом для написания кода. Если вам нужна помощь в написании кода или устранении неполадок в чем-либо, то это место для вас.

2. Основная проблема, которую я вижу, заключается в том, что ваши регулярные выражения -match и -replace начинаются с ^ символа. Учитывая пример INI-файла в этом сообщении, первым символом в строке может быть пробел. Это приведет к сбою всех ваших совпадений и замен. Вокруг вашего = символа также есть пробелы, которые вы также не учитываете.

3. Что именно вы хотите отредактировать? Section s или Values внутри этих разделов? Может быть, лучше, если вы используете модуль, предназначенный для обработки INI-файлов, таких как, например, PsIni

Ответ №1:

Вы бы сделали так:

 $ini = Get-IniContent "<pathToYourIniFile>"
$ini["<yourSection>"]["<yourKey>"] = "<yourValue>"
$ini | out-inifile -FilePath "<pathToYourIniFile>"
  

Комментарии:

1. В чем проблема?

2. Я пробовал это: $input_file = Get-Content "C:Userstest.ini" $input_file["Name"]["Female"]="30" $input_file | Out-IniFile -Force -FilePath "C:Userstest.ini" я использовал -Force, потому что хочу перезаписать предыдущий файл. Но этот код возвращает мне ошибку: Cannot index into a null array.

Ответ №2:

Если вы обновили свой код до следующего, он будет более успешным:

 function Set-OrAddIniValue
{
    Param(
        [string]$FilePath,
        [hashtable]$keyValueList
    )

    $content = Get-Content $FilePath
    $keyValueList.GetEnumerator() | ForEach-Object {
        if ($content -match "$($_.Key)s*=")
        {
            $content= $content -replace "$($_.Key)s*=(.*)", "$($_.Key)=$($_.Value)"
        }
        else
        {
            $content  = "$($_.Key)=$($_.Value)"
        }
    }

    $content | Set-Content $FilePath
}
  

Одна из проблем будет заключаться в том, что если вы добавите дополнительные пары ключ / значение, все они будут добавлены в последний раздел. Другими словами, код не зависит от раздела.

Комментарии:

1. Но я все еще не могу добиться успеха с этим кодом. Я пробую этот код, выполняемый из cmd следующим образом: script.ps1 -FilePath -keyValueList Name.Female=200

2. -keyValueList Параметр ожидает, что ему будет передан тип хэш-таблицы. Итак, вам нужно сделать что-то вроде этого -keyValueList @{"Female"=200} . Этот код сам по себе не зависит от раздела. Для этого вам понадобится дополнительный код.