0

$a目的: に格納されている文字列と に格納されている文字列を比較します$b$bに存在しない文字列が に存在する場合は$a、それらを表示します。

  1. 特定の情報についてテキストファイルを検索するために、次を実行しています。

    $a = Select-String -Path *.txt "<string>"
    

    これは、テキスト ファイルの名前 (元のサーバーにちなんで命名されます)、文字列が見つかった行番号、および文字列自体を含む行を返します。それを$a変数に格納します。

  2. 以下を実行して、サーバー名のリストを variable に格納します$b

    $b = Get-Content servers.txt
    
  3. 次のコマンドを実行して の内容を比較し$a$bのリストに に$b含まれていないものがあるかどうかを確認し$aます。

    $b | Where-Object {$a -NotMatch $_}
    

    これは単にの内容を表示するだけなので、明らかに何か間違っています$a。どうすれば目的を達成できるかについてのアイデアはありますか?

4

1 に答える 1

1

Select-String行を返しません。そのように表示される場合がありますが、実際に返されるのは、一致に関する特定の情報を含むプロパティを含むMtachInfo オブジェクトです。

したがって、実際にやりたいことは.Filename、各一致オブジェクトのプロパティを確認することです。これは、SERVERNAME.txt(説明が正しく理解できれば) のようなものになり、それをサーバー名と比較して$b、フォーム内にあると理解していますSERVERNAME

いくつかの方法がありますが、両側が配列であるため、最初に正規化すると非常に役立ちます。

$e = $a.Filename | ForEach-Object {
    $_ -replace '\.txt$',''  # trim off the extension
}
$b | Where-Object { $_ -notin $e }

この例は、PowerShell v3+ で動作します。

v2以下でそれを行うには:

$e = $a | ForEach-Object {
    $_.Filename -replace '\.txt$',''
}
$b | Where-Object { $e -notcontains $_ }
于 2016-05-12T23:13:17.800 に答える