Як використовувати конфігураційний файл (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

Велике спасибі за вашу допомогу Денніс та Тім! Ваші відповіді ставлять мене на хороший шлях, і я це знайшов

НАСТРОЙКИ.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

POWERSHELL COMMAND

#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

На жаль, у коду за посиланням відсутні регулярні вирази, тож вам доведеться їх відтворити, але є версія, яка обробляє файли без заголовків розділів та рядків, що є коментарями.


Ви можете обробляти коментарі легко, просто додавши ще один випадок в switchс '^#' {}. Крім того, ви можете отримати доступ до вмісту хештелю і крапкою, тому також $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 повинні відповідати іменам параметрів сценарію або змінних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.