2016-05-12 62 views
0

目標:比較存儲在$a中的字符串與存儲在$b中的字符串。如果在$a中不存在的$b中存在字符串,請顯示這些字符串。如何使用PowerShell比較cmdlet與列表的輸出?

  1. 我運行下面的搜索文本文件的某些信息:

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

    這將返回包含文本文件的名稱(這是他們從服務器命名)線,該字符串的行號和字符串本身。它將它存儲在$a變量中。

  2. 我運行下面的存儲變量$b服務器名稱的列表:

    $b = Get-Content servers.txt 
    
  3. 我運行下面給$a內容與$b比較,並告訴我,如果有在任何名單$b未包含在$a

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

    我清楚地做錯事,因爲這只是顯示的內容$a。 關於我如何實現我的目標的任何想法?

+0

'$ B | ? {$ _ -notin $ a}' – xXhRQ8sD2L7Z

+0

謝謝,但是當我運行這個時,它顯示了$ b的內容,導致我認爲它運行並且認爲$ b中的所有項都缺少$ a。 – user1690152

+0

您能否提供樣本清單*完全*您正在使用哪些數據? – xXhRQ8sD2L7Z

回答

1

Select-String不返回行。它可能以這種方式顯示,但它真正返回的是MtachInfo object,其中包含有關匹配的特定信息的屬性。

那麼你真正想要做的是看每個匹配對象的.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 $_ } 
+0

謝謝你這麼快速的迴應!我正在使用PSv5。我嘗試了第一種解決方案,不幸的是,$ e是空的。 – user1690152

+0

@ user1690152已更新 – briantist

+0

謝謝。這也顯示了$ b的內容,讓我認爲它運行並且認爲$ b中的所有項目都缺少$ a。 – user1690152