2015-10-05 97 views
0

我試圖將多個文件針對單個文件進行比較。我已經設法使那部分工作,但是我的問題是,我想能夠在比較運行之前檢查文件是否存在。PowerShell的 - 比較多個文件對單一的CSV文件

即檢查是否文件A存在,如果是這樣比較針對主csv文件,如果不繼續,並檢查文件b存在,如果是這樣比較針對主CSV等。

我的劇本至今老話:

$files = get-content -path "H:\Compare\File Location\servername Files.txt" 
$prod = "H:\compare\Results\master_SystemInfo.csv" 

foreach ($file in $files) { 

If((Test-Path -path $file)) 
{ 
    Write-Host "File exists, comparing against production" 

    $content1 = Get-Content "H:\Compare\Results\$file" 
    $content2 = Get-Content $prod 

    $comparedLines = Compare-Object $content1 $content2 -IncludeEqual | 
    Sort-Object { $_.InputObject.ReadCount } 

    $lineNumber = 0 
    $comparedLines | foreach { 
     $pattern = ".*" 

     if($_.SideIndicator -eq "==" -or $_.SideIndicator -eq "=>") 
     { 
      $lineNumber = $_.InputObject.ReadCount 
     } 

     if($_.InputObject -match $pattern) 
     { 
      if($_.SideIndicator -ne "==") 
      { 
       if($_.SideIndicator -eq "=>") 
       { 
        $lineOperation = "prod" 
       } 
       elseif($_.SideIndicator -eq "<=") 
       { 
        $lineOperation = "test" 
       } 

       [PSCustomObject] @{ 
        Line = $lineNumber 
        File = $lineOperation 
        Text = $_.InputObject 
       } 
      } 
     } 
    } | Export-Csv "h:\compare\Comparison Reports\Prod.vs.$file" - NoTypeInformation 

} 
Else 
{ "File does not exist, aborting" ; return} 
} 

的比較工作只需要運行比較,因爲它仍然是隨地吐痰結果不存在的文件之前添加的檢查文件。

非常感謝你,

+0

看起來你已經檢查文件是否存在使用'試驗Path'。問題可能是您將'$ files'傳遞給'Test-Path'而不是'$ file'。 – ama1111

+0

謝謝@ ama1111但現在腳本停止。我刪除了;從「Else」區域返回,但現在不進行比較? – dragonhsv

+0

輸出是什麼?單個「文件不存在,正在中止」? – ama1111

回答

0

我已經改變代碼找到了答案,這一次我只是從創建文件一個txt文件的文件夾先在這樣,我並不需要測試路徑。這現在從文件夾生成一個文件列表,然後將每個文件與主文件進行比較並輸出多個文件,每個文件一個,將其保存爲原始文件名,即「Prod.vs._SystemInfor.csv」

FYI - In第一行abc123 *是一個變量,用於查找文件夾中的特定服務器名稱,並根據這些名稱生成文件列表。我們有許多服務器都具有相似的命名約定,但最後4位數字取決於它們的位置而不同。

感謝

工作PowerShell腳本:

Get-ChildItem -file abc123* H:\Compare\Results -Name | Out-File "H:\Compare\Results\Office Files.txt" 
$officefiles = get-content -path "H:\Compare\results\Office Files.txt" 

$officeprod = "H:\compare\Results\master_SystemInfo.csv" 


foreach ($officefile in $officefiles) { 

$content1 = Get-Content "H:\Compare\Results\$officefile" 
$content2 = Get-Content $officeprod 

$comparedLines = Compare-Object $content1 $content2 -IncludeEqual | 
Sort-Object { $_.InputObject.ReadCount } 

$lineNumber = 0 
$comparedLines | foreach { 
$pattern = ".*" 

    if($_.SideIndicator -eq "==" -or $_.SideIndicator -eq "=>") 
{ 
    $lineNumber = $_.InputObject.ReadCount 
} 

if($_.InputObject -match $pattern) 
{ 
    if($_.SideIndicator -ne "==") 
    { 
     if($_.SideIndicator -eq "=>") 
     { 
      $lineOperation = "prod" 
     } 
     elseif($_.SideIndicator -eq "<=") 
     { 
      $lineOperation = "test" 
     } 

     [PSCustomObject] @{ 
      Line = $lineNumber 
      File = $lineOperation 
      Text = $_.InputObject 
     } 
    } 
} 
} | Export-Csv "h:\compare\Comparison Reports\Prod.vs.$officefile" -NoTypeInformation 


}