PowerShellスクリプトで構成ファイル(ini、conf、…)を使用する方法は?


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します。
シヴァ

configファイルが[Sections]またはを持っていない; semicolon comments場合は、単に実行できます$config = Get-Content $ConfigPath | ConvertFrom-StringData。詳細については、ConvertFrom-StringDataを参照してください。
asmironov

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ファイル内のキーと値のペアの名前は、スクリプトのパラメーターまたは変数の名前と一致する必要があるということです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.