1

ファイル内の文字列を検索し、その文字列と区切り記号の間のすべてを抽出する方法を探しています。ファイルから LINE を取り出すことはできますが、必要な文字列を取り出す方法に少し困惑しています。

ファイルの行は次のとおりです。

<add key="ConnectionString" value="Data Source=xxxxxx;Initial Catalog=Database;Integrated Security=True" />

「Data Source=」は見つかりますが、「xxxxxx」を返したいです。これが私が使用しているものです:

((Get-Process -Name "db-engine").Path ) + '.Config' | Select-String -Path {$_} - Pattern 'Data Source='

これにより、上記の「キーの追加」行全体が表示されます。

助けてくれてありがとう!

編集:回答ありがとうございます。さらに掘り下げた後、「より適切な」方法は、実際には [xml] を使用してファイルの内容を xml オブジェクトにプルすることです。次に、値を取得し、分割を使用してデータを必要なチャンクに分割します。最終的なコードは次のようになります。

$configpath     = ((Get-Process -Name "db-engine").Path)
$linepath       = $configpath + ".Config"
[xml]$xmlfile   = get-content $linepath
$xmlvalue       = ($xmlfile.configuration.appSettings.add | where {$_.key -eq "ConnectionString"}).value
$server         = $xmlvalue.split(";=")[3]
$db             = $xmlvalue.split(";=")[5]  

まだねじれを解決していますが、これは私を正しい道に導いているようです. Split は入力を配列に分割するため、[x] を使用して特定の要素を呼び出すことができます。分割に複数の区切り文字があると、それらのいずれかで入力が中断されます。たぶん、これは将来他の誰かを助けることができます。

みんな、助けてくれてありがとう!

4

2 に答える 2

2

@Bacon Bitsに同意します-xmlファイルがある場合は、そのように扱うことを検討してください。Select-String を使用する場合は、MatchInfo のキャプチャされたグループを使用できます。名前付きグループを使用した例:

 gc .\dataSource.txt | Select-String -Pattern 'Data Source=(?<ds>.+?);' | % { $_.Matches[0].Groups['ds'].Value }
于 2016-03-04T16:32:17.177 に答える
2

個人的には、おそらく Select-Xml を使用した XQuery を使用して属性の値を取得し、それをセミコロンで分割して、次のように使用しますConvertFrom-StringData

$xml = [xml]'<add key="ConnectionString" value="Data Source=xxxxxx;Initial Catalog=Database;Integrated Security=True" />';
$ConnectionString = ($xml | Select-Xml -XPath '/add[@key="ConnectionString"]/@value').Node.'#text'
$DataSource = ($ConnectionString.Split(';') | ConvertFrom-StringData).'Data Source'
于 2016-03-04T16:25:00.433 に答える