私が見つけたものはすべて複雑に見えます。テキストファイルを読み取るだけでよいのとほぼ同じです。
ADAP.iniにはこれだけが含まれています。
http://xxx.104.xxx.226
APP=2.3.6
DLL=2.3.6
Powershellを使用して、どのようにしてAPP = valueを読み取ることができますか?そして、またはDLL =値は何ですか?
値を変数に格納し、後でPowershellスクリプトで使用します。
これは、ConvertFrom-StringData
の適切な使用例のように見えます。デフォルトでは、等号で区切られたキーと値のペアが検索されます。
.iniファイルの最初の行には等号がないため、エラーを回避するためにそれをスキップする必要があります。これは単にSelect -Skip 1
を使用して行うことができます。
これがコードです:
$ADAP = Get-Content 'ADAP.ini' | Select -Skip 1 | ConvertFrom-StringData
その後、次のように、$ADAP
オブジェクトの名前付きプロパティとしてアクセスして、APPおよびDLLの値を取得できます。
$ADAP.APP
$ADAP.DLL
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
「テキストファイルを読み取るだけ」を実行し、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-Content
、switch -file
、Select-String
、ForEach-Object
、-match 'APP=(.*)'
など、さまざまな組み合わせ)。
しかし、マーク・ラッグの答えは全体的に、より優れています。
$content = Get-Content ADAP.ini
$app = $content[1].Substring($content[1].IndexOf("=") + 1)
$dll = $content[2].Substring($content[2].IndexOf("=") + 1)
コマンドレットGet-Contentを呼び出して変数に割り当てることにより、コンテンツを取得できます。配列のインデックスのような行にアクセスすることで、文字列を操作するためのメソッドを呼び出すことができます。
注:コードは見苦しいです。
Mark Wraggの回答のわずかに変更されたバージョン。処理のためにコマンドレットに渡す前に、各行が有効であることを確認する簡単なチェックが含まれています。
$Config = Get-Content "C:\scripts\config.ini" |
Where-Object {$_ -match "="} | ConvertFrom-StringData
私がここに着陸し、このソリューションを使用して、複数のカテゴリとコメント行を含む構成ファイルを処理するように追加しただけです。