web-dev-qa-db-ja.com

単純な.iniファイルから単一の値を読み取るためのPowerShell

私が見つけたものはすべて複雑に見えます。テキストファイルを読み取るだけでよいのとほぼ同じです。

ADAP.iniにはこれだけが含まれています。

http://xxx.104.xxx.226
APP=2.3.6
DLL=2.3.6

Powershellを使用して、どのようにしてAPP = valueを読み取ることができますか?そして、またはDLL =値は何ですか?

値を変数に格納し、後でPowershellスクリプトで使用します。

6
JustJohn

これは、ConvertFrom-StringDataの適切な使用例のように見えます。デフォルトでは、等号で区切られたキーと値のペアが検索されます。

.iniファイルの最初の行には等号がないため、エラーを回避するためにそれをスキップする必要があります。これは単にSelect -Skip 1を使用して行うことができます。

これがコードです:

$ADAP = Get-Content 'ADAP.ini' | Select -Skip 1 | ConvertFrom-StringData

その後、次のように、$ADAPオブジェクトの名前付きプロパティとしてアクセスして、APPおよびDLLの値を取得できます。

$ADAP.APP
$ADAP.DLL
9
Mark Wragg

Iniファイルを読み取ることができるPowerShell関数を簡単に作成できます。

function Get-IniFile 
{  
    param(  
        [parameter(Mandatory = $true)] [string] $filePath  
    )  

    $anonymous = "NoSection"

    $ini = @{}  
    switch -regex -file $filePath  
    {  
        "^\[(.+)\]$" # Section  
        {  
            $section = $matches[1]  
            $ini[$section] = @{}  
            $CommentCount = 0  
        }  

        "^(;.*)$" # Comment  
        {  
            if (!($section))  
            {  
                $section = $anonymous  
                $ini[$section] = @{}  
            }  
            $value = $matches[1]  
            $CommentCount = $CommentCount + 1  
            $name = "Comment" + $CommentCount  
            $ini[$section][$name] = $value  
        }   

        "(.+?)\s*=\s*(.*)" # Key  
        {  
            if (!($section))  
            {  
                $section = $anonymous  
                $ini[$section] = @{}  
            }  
            $name,$value = $matches[1..2]  
            $ini[$section][$name] = $value  
        }  
    }  

    return $ini  
}  

$iniFile = Get-IniFile .\ADAP.ini
$app = $iniFile.NoSection.APP
$dll = $iniFile.NoSection.DLL

Test.iniとして保存されたこのサンプルiniファイルの場合:

; last modified 1 April 2001 by John Doe
[owner]
name=John Doe
organization=Acme Widgets Inc.

[database]
; use IP address in case network name resolution is not working
server=192.0.2.62     
port=143
file="payroll.dat"

これを行う:

$testIni = Get-IniFile .\Test.ini

次のような値を取得できます。

$server = $testIni.database.server
$organization = $testIni.owner.organization
7
David Brabant

「テキストファイルを読み取るだけ」を実行し、APPで始まる行を見つけて、そこから値を抽出します。

# read text file                        # find line beginning APP=
$AppLine = Get-Content -Path test.ini | Where-Object { $_ -match 'APP=' }

# split on = symbol and take second item
$AppVersion = $AppLine.Split('=')[1]

また、[version]$AppVersionを使用すると、文字列ではなく、適切なソート可能な比較可能なバージョン番号にすることができます。

また、値の読み取り、照合、抽出を行う方法にはさまざまなバリエーションがあります(Get-Contentswitch -fileSelect-StringForEach-Object-match 'APP=(.*)'など、さまざまな組み合わせ)。

しかし、マーク・ラッグの答えは全体的に、より優れています。

4
$content = Get-Content ADAP.ini

$app = $content[1].Substring($content[1].IndexOf("=") + 1)
$dll = $content[2].Substring($content[2].IndexOf("=") + 1)

コマンドレットGet-Contentを呼び出して変数に割り当てることにより、コンテンツを取得できます。配列のインデックスのような行にアクセスすることで、文字列を操作するためのメソッドを呼び出すことができます。

注:コードは見苦しいです。

1
pandemic

Mark Wraggの回答のわずかに変更されたバージョン。処理のためにコマンドレットに渡す前に、各行が有効であることを確認する簡単なチェックが含まれています。

$Config = Get-Content "C:\scripts\config.ini" |
    Where-Object {$_ -match "="} | ConvertFrom-StringData

私がここに着陸し、このソリューションを使用して、複数のカテゴリとコメント行を含む構成ファイルを処理するように追加しただけです。

0