2013-07-04 58 views
0

我有兩個文本文件,一個是遠程服務器的註冊表設置列表,另一個是首選註冊表設置。該文件的格式相同,即:比較兩個逗號分隔文本文件

ServValues.txt

HKLM:\software\Wow6432Node\Policies\Citrix\, Evidence, DesktopKind, Private 
HKLM:\software\Wow6432Node\Policies\Citrix\, MultimediaPolicies, EnableRAVE, 1 
HKLM:\software\Wow6432Node\Policies\Citrix\, ICAPolicies, ACRLogEvents, 1 
HKLM:\software\Wow6432Node\Policies\Citrix\, ICAPolicies, ACRRequireAuth, 0 

CorrectValues.txt

HKLM:\software\Wow6432Node\Policies\Citrix\, Evidence, DesktopKind, Private 
HKLM:\software\Wow6432Node\Policies\Citrix\, MultimediaPolicies, EnableRAVE, 1 
HKLM:\software\Wow6432Node\Policies\Citrix\, ICAPolicies, ACRLogEvents, 0 
HKLM:\software\Wow6432Node\Policies\Citrix\, ICAPolicies, ACRRequireAuth, 2 

我想寫一個powershel腳本,這兩個文件進行比較,並找到差異(如第三行和第四行)創建一個新的日誌文件,如:

Discrepancies.txt

RemoteSever> HKLM:\ SOFTWARE \ Wow6432Node \策略\的Citrix \,ICAPolicies,ACRLogEvents設置爲1,應該是0

REMOTESERVER >> HKLM:\ SOFTWARE \ Wow6432Node \策略\的Citrix \,ICAPolicies,ACRRequireAuth設置爲0,應該是2

我只比較最後一個逗號後面的值,其餘的假設是相同的。 我很難過,有什麼建議嗎?

+0

我的意思是,明確了第一步,我會想,是這樣的: '$ ServerSettings = GET -file ServValues.txt' '$ CorrectSettings = get-file CorrectValues.txt' 對我來說很難,那就是在同一時間對兩個數組進行解析,比較每個數組的值。 – NewPowerSheller

+1

你有沒有嘗試開始使用'比較對象'? –

回答

1

你試過Compare-Object

如果這是行不通的,你必須使用一個標準的for循環:

filter Split-RegSettingLine 
{ 
    param(
     [Parameter(ValueFromPipeline=$true)] 
     $Line 
    ) 
    if($Line -notmatch '^(.*), ([^,]+)$') 
    { 
     Write-Error ('Invalid line: {0}' -f $Line) 
     return 
    } 
    $matches[1],$matches[2] 
} 

$ServerSettings = Get-Content ServValues.txt 
$CorrectSettings = Get-Content CorrectValues.txt 

if($ServerSettings.Length -ne $CorrectSettings.Length) 
{ 
    Write-Warning ('Files have different number of lines. WATCH OUT!') 
} 

for($idx = 0 $idx -lt $ServerSettings.Length -and $idx -lt $CorrectSettings.Length; ++$idx) 
{ 
    $serverKey,$serverValue = $ServerSettings[$idx] | Split-RegSettingLine 
    $correctKey,$correctValue = $CorrectSettings[$idx] | Split-RegSettingLine 

    if($serverKey -ne $correctKey) 
    { 
     Write-Error ('Line {0}: mismatched keys: <{1}> <=> <{2}>' -f $idx,$serverKey,$correctKey) 
     continue 
    } 

    if($serverValue -ne $correctValue) 
    { 
     Write-Error ('Line {0}: key {1}: set to <{2}>, should be <{3}>' -f $idx,$serverKey,$serverValue,$correctValue 
    } 
}