2017-08-28 27 views
2

私は読み込んだテキストファイルを持っていますが、値を取得する必要があります。文字列トリミングと分割

例テキストファイル:

$NumOfSites = Get-Content $Sites | 
       Select-String -Pattern "DBServer=" -Context 0,3 
$i = 0 
$NumOfSites | ForEach-Object { 
    $svr = $NumOfSites[$i] -isplit "\n" | 
      % { ($_ -isplit 'DBServer=').Trim()[1] } 
    $db = $NumOfSites[$i] -isplit "\n" | 
      % { ($_ -isplit 'DBName='.Trim())[1] } 
    $uid = $NumOfSites[$i] -isplit "\n" | 
      % { ($_ -isplit 'Username='.Trim())[1] } 
    $pswd = $NumOfSites[$i] -isplit "\n" | 
      % { ($_ -isplit 'Password='.Trim())[1] } 
    $i = $i+1 
} 

 
[Site 01] 
DBServer=LocalHost 
DBName=Database01 
Username=admin 
Password=qwerty 

[Site 02] 
DBServer=192.168.0.10 
DBName=Database02 
Username=admin 
Password=qwerty 

現在、私のコードが発見されたと、このテキストファイルは、多くのサイトを持つことができ、各ラインDBServer=の配列エントリとしてファイルや場所ごとの各を通じて読み込み

余分なスペースや文字列変数として適切に分割することなく、各属性を適切に分割することはできません。 私が持っているファイルの書式の変数からSQL接続行に入れる情報を抽出するだけです。あなたが唯一の等号の後に値を得ることについて気にしている場合

+1

あなたが投稿したコードは不完全です。質問を投稿する際にコードが[mcve]であることを確認してください。また、かっこの一部は間違っているように見えますが、コードを壊すべきではありません。それで、INI形式のファイルを解析することは、かなりよく解決された問題です。いくつか[研究](https://stackoverflow.com/search?q=%5Bpowershell%5D+parse+ini)してください。 –

答えて

3

-splitに不要だ残りはちょうどConvertFrom-StringDataによって処理することができます良い。ヘッダー行で直接分割されたオブジェクトにレコードを変換することができます。 ConvertFrom-StringDataは、複数行の文字列をハッシュテーブルに変換します。ちょうどそれを[PSCustomObject]としてキャストして、ビオラを使うことができます。使いやすいオブジェクトがあります。あなたは(Select-Objectを使用して任意のプロパティにしたい場合はCSVに出力し、またはフィルタ)フィットを参照してくださいしかし

$NumOfSites = Get-Content $Sites -raw 
$SiteObjects = $NumOfSites -split '\[.+?\]'|%{[PSCustomObject](ConvertFrom-StringData -StringData $_)} 

その後、あなたは$SiteObjectsを操作することができます。それとも、あなたは必要に応じて...

ForEach($Connection in $SiteObjects){ 
    $ConStr = "Server = {0}; Database = {1}; Integrated Security = False; User ID = {2}; Password = {3};" -f $Connection.DBServer.Trim(), $Connection.DBName.Trim(), $Connection.Username.Trim(), $Connection.Password.Trim() 
    <Do stuff with SQL> 
} 

編集して接続を構築し、それを通してあなたがループをできる接続を作るために探している場合:サンプルテキストが<pre></pre>を追加するように変更されましたので、私の答えを更新。それらを削除するだけで済みますし、OPではnull値のメソッドについてエラーが発生しているので、nullもフィルタリングします。

$NumOfSites = Get-Content $Sites -raw 
$SiteObjects = $NumOfSites -replace '<.*?>' -split '\[.+?\]' | ?{$_} |%{[PSCustomObject](ConvertFrom-StringData -StringData $_)} 
ForEach($Connection in $SiteObjects){ 
    $svr = $Connection.DBServer.Trim() 
    $db = $Connection.DBName.Trim() 
    $uid = $Connection.Username.Trim() 
    $pwd = $Connection.Password.Trim() 
} 
+0

この素晴らしいアイデア+1には、gcの '-raw'パラメータが必要でした。 – LotPings

+0

ああ、私は 'Get-Content'に' -raw'スイッチを含める答えを更新しました。私にそれを思い出させてくれてありがとう。 – TheMadTechnician

+0

私はこれを試しましたが、最初のラウンド後に$ Connection varを埋めるだけで、エラーが発生します。ヌル値の式でメソッドを呼び出すことはできません。 – catalyph

1

は、ここで提案です:

Get-Content Example.txt | 
    ForEach-Object { 
     Switch -Regex ($_) { 
      'dbs.+=' { $svr = ($_ -replace '.+=').Trim() 
      .. etc .. 
     } 
    } 

Get-Contentパイプで連結されたForEach-Objectには、独自のオブジェクトとして各行を解釈します。


編集:
あなたがそこに道のほとんどだったが、それはラインレコード・ヘッダー(すなわち[Site 01])以外の

$NumOfSites = Get-Content $Sites | Select-String -pattern "DBServer=" -Context 0,3 
$NumOfSites | ForEach-Object { 
    Switch -Wildcard ($_) { 
     'DBS*=' { $svr = ($_ -replace '.+=').Trim() } 
     'DBN*=' { $db = ($_ -replace '.+=').Trim() } 
     'U*=' { $uid = ($_ -replace '.+=').Trim() } 
     'P*=' { $pw = ($_ -replace '.+=').Trim() } 
    } 
} 
+0

これは最初のサイト変数を取得しましたが、それを保持していて、次のループリターンで変更されませんでした。 – catalyph