JeroenMostert предоставил критический указатель в комментарии:
PowerShell, начиная с версии 6.2.0, имеет нет встроенных командлетов для обработки файлов INI (*.ini
) , хотя вопрос о введении таких командлетов обсуждается в GitHub .
Get-IniContent
и Out-IniFile
- это расширенные функции (функции, подобные командлетам), которые поставляются с сторонним PSIni
модулем , , доступным в PowerShell Галерея .
В PowerShell v5 или выше, который поставляется с модулем PowerShellGet
[1] , Установка так же проста, как:
Install-Module -Scope CurrentUser PsIni
Если вы опустите -Scope CurrentUser
, вы установите модуль для всех пользователей, но для этого требуется запуск с правами администратора.
Если $PSModuleAutoLoadingPreference
установлено по умолчанию (не установлено), этот модуль автоматически загружается , по запросу в сеанс, который пытается вызвать одну из команд модуля, например Get-IniContent
. * 1044. *
Вот полный, автономный пример, который реализует основные функции модуля PsIni
:
- устанавливает модуль по требованию
- создает образец
*.ini
файла с нуля с помощью Out-IniFile
из вложенной упорядоченной хеш-таблицы.
- читает файл с диска с
Get-IniContent
в (новую) вложенную упорядоченную хеш-таблицу
- изменяет и удаляет записи
- записывает измененную хеш-таблицу обратно в файл с
Out-IniFile
Примечание. Предполагается, что доступен Install-Module
, т. Е. Установлен модуль PowerShellGet
, и что работающий компьютер подключен к сети и ему разрешено загружать пакеты из https://www.powershellgallery.com/.
# Import the PsIni module.
# If necessary, install it first, for the current user.
$ErrorActionPreference = 'Stop' # Abort, if something unexpectedly goes wrong.
try {
Import-Module PsIni
} catch {
Install-Module -Scope CurrentUser PsIni
Import-Module PsIni
}
# Create an ordered hashtable that is the in-memory representation of the
# sample *.ini file from the question, with a second section added.
$iniFileContent = [ordered] @{
# 'XXX' is the section name.
# The nested hashtable contains that section's entries.
XXX = [ordered] @{
# IMPORTANT:
# * The PsIni module only supports STRING values.
# * While you can assign values of different types in-memory, they are
# CONVERTED TO STRINGS with .ToString() and READ AS STRINGS later
# by Get-IniContent.
# * In v3+, PSIni now supports values in *.ini files that have
# embedded quoting - e.g., `AB = "23"` as a raw line - which is
# (sensibly) *stripped* on reading the values.
AB = '23'
BC = '34'
}
# Create a 2nd section, named 'YYY', with entries 'yin' and 'yang'
YYY = [ordered] @{
yin = 'foo'
yang = 'none'
}
}
# Use Out-IniFile to create file 'file.ini' in the current dir.
# * Default encoding is UTF-8 (with BOM in Windows PowerShell, without BOM
# in PowerShell Core)
# * Use -Encoding to override, but note that
# Get-IniContent has no matching -Encoding parameter, so the encoding you use
# must be detectable by PowerShell in the absence of explicit information.
# * CAVEAT: -Force is only needed if an existing file must be overwritten.
# I'm using it here so you can run the sample code repeatedly without
# failure, but in general you should only use it if you want to
# blindly replace an existing file - such as after having modified
# the in-memory representation of an *.ini file and wanting to
# write the modifications back to disk - see below.
$iniFileContent | Out-IniFile -Force file.ini
# Read the file back into a (new) ordered hashtable
$iniFileContent = Get-IniContent file.ini
# Modify the value of the [XXX] section's 'AB' entry.
$iniFileContent.XXX.AB = '12'
# Use the alternative *indexing syntax* (which is equivalent in most cases)
# to also modify the [YYY] section's 'yin' entry.
$iniFileContent['YYY']['yin'] = 'bar'
# Rmove the 'yang' value from section [YYY]:
$iniFileContent.YYY.Remove('yang')
# Save the modified content back to the original file.
# Note that -Force is now *required* to signal the explicit intent to
# replace the existing file.
$iniFileContent | Out-IniFile -Force file.ini
# Double-check that modifying the values succeeded.
(Get-IniContent file.ini).XXX.AB # should output '12'
(Get-IniContent file.ini).YYY.yin # should output 'bar'
# Print the updated content of the INI file, which
# shows the updated values and the removal of 'yang' from [YYY].
"--- Contents of file.ini:"
Get-Content file.ini
Выполнение вышеуказанного должно завершиться успешно и вывести следующее, демонстрирующее, что файл *.ini
был успешно создан, считан обратно в память, изменен и сохранен обратно на диск:
12
bar
--- Contents of file.ini:
[XXX]
AB=12
BC=34
[YYY]
yin=bar
[1] Вы можете установить PowerShellGet
по требованию для PowerShell версий 3 и 4 - см. https://www.microsoft.com/en-us/download/details.aspx?id=51451