Немедленное исправление состоит в том, чтобы создать собственное представление массива , перечислив элементы и разделив их ,
, включив строковые значения в '...'
:
# Sample input hashtable. [ordered] preserves the entry order.
$resumeParms = [ordered] @{ foo = 42; bar = 'baz'; arr = (Get-ChildItem *.txt) }
$resumeParms.GetEnumerator() |
ForEach-Object {
"{0}={1}" -f $_.Name, (
$_.Value.ForEach({
(("'{0}'" -f ($_ -replace "'", "''")), $_)[$_.GetType().IsPrimitive]
}) -join ','
)
}
Не что это представляет все не примитивные. NET типы в виде строк , их представлением .ToString()
, которое может быть или не быть достаточно хорошим.
Вышеприведенное выводит что-то вроде:
foo=42
bar='baz'
arr='C:\Users\jdoe\file1.txt','C:\Users\jdoe\file2.txt','C:\Users\jdoe\file3.txt'
См. Нижний раздел для варианта, который создает файл *.psd1
, который впоследствии может быть прочитан обратно в экземпляр хеш-таблицы с Import-PowerShellDataFile
.
Альтернативы для сохранения настроек / данных конфигурации в текстовых файлах:
Запись файла *.psd1
, который можно прочитать с помощью Import-PowerShellDataFile
В рамках заявленных ограничений относительно типов данных - по сути, все, что не является числом или строкой, становится строкой - довольно просто изменить код вверху записать представление хеш-таблицы-литерала PowerShell в *.psd1
файл , чтобы его можно было прочитать как экземпляр [hashtable]
через Import-PowerShellDataFile
:
Как уже отмечалось, если вы не возражаете против установки модуля, рассмотрите модуль Configuration
, в который встроена эта функция.
# Sample input hashtable.
$resumeParms = [ordered] @{ foo = 42; bar = 'baz'; arr = (Get-ChildItem *.txt) }
# Create a hashtable-literal representation and save it to file settings.psd1
@"
@{
$(
($resumeParms.GetEnumerator() |
ForEach-Object {
" {0}={1}" -f $_.Name, (
$_.Value.ForEach({
(("'{0}'" -f ($_ -replace "'", "''")), $_)[$_.GetType().IsPrimitive]
}) -join ','
)
}
) -join "`n"
)
}
"@ > settings.psd1
Если вы прочитаете settings.psd1
с Import-PowerShellDataFile settings.psd1
позже, вы получите [hashtable]
экземпляр, к записям которого у вас есть доступ, как обычно, и который выдает следующий вывод:
Name Value
---- -----
bar baz
arr {C:\Users\jdoe\file1.txt, C:\Users\jdoe\file1.txt, C:\Users\jdoe\file1.txt}
foo 42
Обратите внимание, как порядок записей (ключей) был не сохранен, потому что записи хеш-таблицы по своей природе неупорядочены.
При записи файла *.psd1
вы можете сохранить порядок ключей (-creation), объявив входную хеш-таблицу (System.Collections.Hashtable
) как [ordered]
, как показано выше (который создает экземпляр System.Collections.Specialized.OrderedDictionary
), но, к сожалению, порядок теряется при чтении файла *.psd1
.
Начиная с PowerShell 7.0, даже если вы поместите [ordered]
перед открытием @{
в *.psd1
файле , Import-PowerShellDataFile
тихо проигнорирует его и, тем не менее, создаст неупорядоченный хеш-таблицу.