1

2つの単語の間にテキストをプルするにはどうすればよいですか?私は正規表現がこれを行うことができることを知っています、そして私は周りを見回していますが、私が試したコードは私にはまったく機能しません...正規表現を持つレンガのように無知です...おそらくそれは完全に間違っています...

テキストファイルがあり、これらのテキスト文字列の間に表示されているものをすべて照会したいと思います。

【問題のあるデバイス】

デバイスPNPデバイスIDエラーコード

[USB]

私はこれをやってみましたが、どこにも行きません!

$devices = Get-Content c:\temp\dev.txt | out-string [regex]::match($devices,'(?<=\<Problem Devices\>).+(?=\<USB\>)',"singleline").value.trim()

You cannot call a method on a null-valued expression.
At line:1 char:141
+ $devices = Get-Content c:\temp\dev.txt | out-string [regex]::match($devices,'(?<=\<Problem Devices\>).+(?=\<USB\>)',"
singleline").value.trim <<<< ()
    + CategoryInfo          : InvalidOperation: (trim:String) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
4

2 に答える 2

1

への配管out-stringは必要ありません。get-contentファイルの各行を個別のオブジェクトとしてパイプラインに送信しています。したがって、これらのオブジェクトをforeach-object.

$devices = Get-Content c:\temp\dev.txt | foreach-object{[regex]::match($devices,'(?<=\<Problem Devices\>).+(?=\<USB\>)',"singleline").value.trim()}

trim()ただし、オブジェクトを試行するという問題はまだ残っていnullます。正規表現の一致で一致が見つからない場合は、 を呼び出すことはできませんvalue.trim()

入力ファイル<Problem Devices>[Problem Devices].

単一の一連のパイプライン ステップですべてを実行しようとするのではなく、問題を分解してください。

  1. ファイルの各行について、[問題のあるデバイス] を確認します。
  2. 以降の各行で、[USB] の場合はループを抜けます。[USB] でない場合は、各行を変数にキャプチャします (これらの行の配列を作成します)。
  3. ループの後、作成した配列の各要素を繰り返し処理して、各値を解析しPSObjectsます (必要に応じて、ハッシュのコレクション (デバイスごとに 1 つ) またはハッシュのコレクション (デバイスごとに 1 つ) を作成します)。
于 2013-01-02T17:11:38.980 に答える
0

正規表現に慣れていない場合は、他の方法があります。

$test = $false

$devices = get-content file.txt |

foreach {

if ($_.trim() -eq '[Problem Devices]'){$test = $true}

elseif ($_.trim() -eq '[USB]') {$test = $false}

elseif ($test){$_}

} | where {$_.trim()}
于 2013-01-04T04:31:58.657 に答える