2015-10-05 102 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 


}