2017-07-05 103 views
0

重複項目的我試圖找到在BIND DNS記錄不符。我想輸出一個只有這些差異的CSV文件。我有一個CSV文件,其中包含BIND中所有位置的所有記錄(ns.prvt,ns.pub,common,includes)。我試圖弄清楚的是如何輸出只顯示差異的CSV。對於2條記錄被視爲差異,它們必須符合以下條件:的PowerShell:刪除陣列

  1. 兩條記錄具有相同的RecordName和RecordType。
  2. 兩條記錄都有不同的數據或TTL。
  3. 這兩個記錄來自不同的位置。

我幾乎在那裏用下面的腳本,但它不斷向我顯示幾行不一定符合上述條件。

$Records = Import-Csv C:\Temp\Domain_ALL.csv | Select * | Sort Data,Location 
$RecordsRev = @() 
$Records | % { 
    $Record = $_ 
    $Records | % { 
     $DataFE = $_ 
     If (
     ([string]($Record | ? {($_.RecordName -eq $DataFE.RecordName)}).RecordName -eq $DataFE.RecordName) -and 
     ([string]($Record | ? {($_.RecordName -eq $DataFE.RecordName)}).RecordType -eq $DataFE.RecordType) -and 
     ([string]($Record | ? {($_.RecordName -eq $DataFE.RecordName)}).Location -ne $DataFE.Location) -and 
     (([string]($Record | ? {($_.RecordName -eq $DataFE.RecordName)}).Data -ne $DataFE.Data) -or 
     ([string]($Record | ? {($_.RecordName -eq $DataFE.RecordName)}).TTL -ne $DataFE.TTL)) 
     ) { 
      $RecordsRev += $_ 
     } 
    } 
} 
$RecordsRev | Export-Csv C:\Temp\Domain_Discrepancies.csv -NoType 

,我得到的結果是:

RecordName RecordType Data       TTL Location 
---------- ---------- ----       --- -------- 
www  CNAME  somedomain.com.test.   600 Includes 
www  CNAME  somedomain.com.    600 Common 

如何在數組中刪除所有重複的行:

RecordName RecordType Data       TTL Location 
---------- ---------- ----       --- -------- 
domain.com TXT  "MS=abc1234566"    600 Includes 
domain.com TXT  "MS=abc1234566"    600 Common 
domain.com TXT  "site-verification=abcd1234" 600 Includes 
domain.com TXT  "site-verification=abcd1234" 600 Common 
www  CNAME  somedomain.com.test.   600 Includes 
www  CNAME  somedomain.com.    600 Common 

,我希望結果如何?這與「Select * -unique」不同,因爲我不想保留包含重複信息的任何行。

編輯:我認爲主要的問題是,因爲腳本會針對在CSV每個記錄每條記錄,這在技術上是一個矛盾。例如,在下表中,由於記錄1與記錄4不同,因此記錄1符合標準是不一致的。但是,由於記錄1與記錄2相同,實際上應該從結果中省略。

RecordNumber RecordName RecordType Data       TTL Location 
------------ ---------- ---------- ----       --- -------- 
1   domain.com TXT  "MS=abc1234566"    600 Includes 
2   domain.com TXT  "MS=abc1234566"    600 Common 
3   domain.com TXT  "site-verification=abcd1234" 600 Includes 
4   domain.com TXT  "site-verification=abcd1234" 600 Common 
5   www  CNAME  somedomain.com.test.   600 Includes 
6   www  CNAME  somedomain.com.    600 Common 

任何幫助將不勝感激。

凱爾

+1

如何爲創紀錄的1相同,記錄3? –

+0

糟糕。我的意思是記錄1與記錄2相同。編輯。謝謝。 – Kyle

+0

我仍然有同樣的問題。記錄1和2之間的「位置」列是不同的。因此,根據您的標準,它們不是重複的。 –

回答

1

我能與別人誰刪除了自己的崗位的幫助下算出這個......這裏是我現在使用的找到滿足所有下列條件的所有記錄的腳本:

  1. 兩個記錄具有相同的RecordName和記錄類型。 -and
  2. 兩個記錄有不同的數據或TTL。 -and
  3. 兩個記錄來自不同的位置。

    $Records = Import-Csv C:\Temp\Domain_ALL.csv | Select * | Sort Data,Location 
    $Discrepancies = @() 
    $GoodRecords = @() 
    $BadRecords = @() 
    
    $Records | ForEach-Object { 
    
        # for each record $_, compare it against every other record.. 
        foreach ($R in $Records) { 
    
         # if Both records have the same RecordName and RecordType.. 
         if (($_.RecordName -eq $R.RecordName) -and ($_.RecordType -eq $R.RecordType)) { 
    
          # and if Both records come from different locations.. 
          if ($_.Location -ne $R.Location) { 
    
           # if Both records have the same Data and TTL then they are considered good: 
           if (($_.Data -eq $R.Data) -and ($_.TTL -eq $R.TTL)) { 
            $GoodRecords += $_ 
           } 
           Else{ 
            # if Both records have different Data or TTL then they are considered bad: 
            $BadRecords += $_ 
           } 
          } 
         } 
        } 
    
    } 
    
    ForEach ($BadRecord in $BadRecords){ 
        If (($GoodRecords -notcontains $BadRecord)){ 
         $Discrepancies += $BadRecord 
        } 
    } 
    $Discrepancies | Select * -Unique | Sort RecordName,Location,Data | ft