【问题标题】:Comparing csv files with -like in Powershell在 Powershell 中将 csv 文件与 -like 进行比较
【发布时间】:2025-11-27 04:45:02
【问题描述】:

我有两个 csv 文件,每个文件都包含一个 PATH 列。例如:

CSV1.csv

PATH,Data,NF
\\server1\folderA,1,1
\\server1\folderB,1,1
\\server2\folderA,1,1
\\server2\folderB,1,1

CSV2.csv

PATH,User,Access,Size
\\server1\folderA\file1,don,1
\\server1\folderA\file2,don,1
\\server1\folderA\file3,sue,1
\\server2\folderB\file1,don,1

我正在尝试创建一个脚本,该脚本将根据 CSV1 中的路径生成单独的 csv 导出,以便新文件包含来自 CSV2 的匹配文件值。例如,从上面,我会得到 2 个结果:

result1.csv

\\server1\folderA\file1,don,1
\\server1\folderA\file2,don,1
\\server1\folderA\file3,sue,1

result2.csv

\\server2\folderB\file1,don,1

以前我在两个值准确时使用了一个脚本:

$reportfile = import-csv $apireportoutputfile -delimiter ';' -encoding unicode
$masterlist = import-csv $pathlistfile

foreach ($record in $masterlist)
    {
    $path=$record.Path
    $filename = $path -replace '\\','_'
    $filename = '.\Working\sharefiles\' + $filename + '.csv'

    $reportfile | where-object {$_.path -eq $path} | select FilePath,UserName,LastAccessDate,LogicalSize | export-csv -path $filename
    write-host "     Creating files list for $path"  -foregroundcolor red -backgroundcolor white
    }

但是,由于两个路径值不同,它什么也不返回。我找到了一个 -like 运算符,但不确定如何在此代码中使用它来获得我想要的结果。 where-object 是一个过滤器,而 -like 最终返回一个真/假。我在正确的轨道上吗?有什么解决方案的想法吗?

【问题讨论】:

    标签: powershell csv


    【解决方案1】:

    可能是这样的吧?

    $ht = @{}
    Import-Csv csv1.csv |
      foreach { $ht[$_.path] = New-Object collections.arraylist }
    
    Import-Csv csv2.csv |
      foreach { 
                $path = $_.path | Split-Path -Parent
                $ht[$path].Add($_) > $null
              }
    
    $i=1
    $ht.Values |
     foreach { if ($_.count)
                {
                 $_ | Export-Csv "result$i.csv" -NoTypeInformation
                 $i++
                }
              }
    

    【讨论】:

      【解决方案2】:

      我的建议:

      $1=ipcsv .\csv1.CSV
      $2=ipcsv .\csv2.CSV
      $equal = diff ($2|select @{n='PATH';e={Split-Path $_.PATH}}) $1 -Property PATH -IncludeEqual -ExcludeDifferent -PassThru
      0..(-1 + $equal.Count) | %{%{$i = $_}{
           $2 | ?{ (Split-Path $_.PATH) -eq $equal[$i].PATH } | epcsv ".\Result$i.CSV"
      }}
      

      【讨论】: