#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}
. Этот код сам по себе не зависит от раздела. Для этого вам понадобится дополнительный код.