Как использовать файл конфигурации (ini, conf,…) со скриптом PowerShell?

14

Можно ли использовать файл конфигурации со скриптом PowerShell?

Например, файл конфигурации:

#links
link1=http://www.google.com
link2=http://www.apple.com
link3=http://www.microsoft.com

А затем вызвать эту информацию в сценарии PS1:

start-process iexplore.exe $Link1
Ксавье С
источник

Ответы:

17

Большое спасибо за вашу помощь Деннис и Тим! Ваши ответы поставили меня на правильный путь, и я нашел это

settings.txt

#from http://tlingenf.spaces.live.com/blog/cns!B1B09F516B5BAEBF!213.entry
#
[General]
MySetting1=value

[Locations]
InputFile="C:\Users.txt"
OutputFile="C:\output.log"

[Other]
WaitForTime=20
VerboseLogging=True

ПОЛОЖИТЕЛЬНАЯ КОМАНДА

#from http://tlingenf.spaces.live.com/blog/cns!B1B09F516B5BAEBF!213.entry
#
Get-Content "C:\settings.txt" | foreach-object -begin {$h=@{}} -process { $k = [regex]::split($_,'='); if(($k[0].CompareTo("") -ne 0) -and ($k[0].StartsWith("[") -ne $True)) { $h.Add($k[0], $k[1]) } }

тогда

После выполнения фрагмента кода переменная ($ h) будет содержать значения в HashTable.

Name                           Value
----                           -----
MySetting1                     value
VerboseLogging                 True
WaitForTime                    20
OutputFile                     "C:\output.log"
InputFile                      "C:\Users.txt"

* Чтобы извлечь элемент из таблицы, используйте команду $h.Get_Item("MySetting1").*

Ксавье С
источник
4
Вы также можете получить настройки гораздо более дружественным $ h.MySetting1
Райан Шиллингтон
Я получаю исключение массива за пределами границ в строке анализатора регулярных выражений, несмотря на использование точно такого же файла .txt, показанного в этом ответе, и кода синтаксического анализатора (без изменений) => Index was outside the bounds of the array. At C:\testConfigreader.ps1:13 char:264 + ... -ne $True)) { $h.Add($k[0], $k[1]) } } + ~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : OperationStopped: (:) [], IndexOutOfRangeException + FullyQualifiedErrorId : System.IndexOutOfRangeExceptionУ кого-нибудь это работает правильно?
Шива
Если в вашем конфигурационном файле нет [Sections]или ; semicolon comments, вы можете сделать просто $config = Get-Content $ConfigPath | ConvertFrom-StringData. См. ConvertFrom-StringData для деталей.
Асмиронов
4

Там хороший поток здесь , который показывает этот код (цитата из связанного потока):

# from http://www.eggheadcafe.com/software/aspnet/30358576/powershell-and-ini-files.aspx
param ($file)

$ini = @{}
switch -regex -file $file
{
    "^\[(.+)\]$" {
        $section = $matches[1]
        $ini[$section] = @{}
    }
    "(.+)=(.+)" {
        $name,$value = $matches[1..2]
        $ini[$section][$name] = $value
    }
}
$ini

Тогда вы можете сделать:

PS> $links = import-ini links.ini
PS> $links["search-engines"]["link1"]
http://www.google.com
PS> $links["vendors"]["link1"]
http://www.apple.com

Предполагая, что INI-файл выглядит следующим образом:

[vendors]
link1=http://www.apple.com
[search-engines]
link1=http://www.google.com

К сожалению, в коде по ссылке отсутствуют регулярные выражения, поэтому вам придется их воспроизводить, но есть версия, которая обрабатывает файлы без заголовков разделов и строк, являющихся комментариями.

Приостановлено до дальнейшего уведомления.
источник
Вы можете легко обрабатывать комментарии, просто добавив еще один случай в switchwith '^#' {}. Также вы можете получить доступ к содержимому хеш-таблицы с точкой, так что $links.vendors.link1должно работать, что может быть немного лучше читать.
Джои
2

да, вы ищете командлеты get-content и select-string.

$content=get-content C:\links.txt
start-process iexplore.exe $content[0]
Тим
источник
0

Для более комплексного подхода рассмотрите https://github.com/alekdavis/ConfigFile . Этот модуль поддерживает файлы конфигурации в формате JSON, а также INI. Это позволяет расширять переменные и делает несколько изящных трюков. Следует помнить, что имена пар ключ-значение в INI-файле должны совпадать с именами параметров или переменных скрипта.

Алек Дэвис
источник