PowerShell - 与Get-ChildItem一起苦苦挣扎

时间:2016-06-01 01:18:04

标签: powershell

我对这个很疯狂,希望有人可以提供帮助。请温柔,我的编码技巧不是很好。

我有两个单独的CSV文件,我正在尝试进行比较。每个CSV都包含一个计算机帐户列表。我想将这两个文件之间的差异导出到新的CSV。一个文件位于已定义的目录中,但另一个文件位于单独的目录结构中。这是一个例子:

定义目录中的文件1:C:\blah\xyz.csv
文件2位于不同的变化目录中:C:\share\uploads\foo\bar\xyz-computers.csv

这些文件名的XYZ部分是客户端名称,路径的\foo\bar\部分对于每个文件可能不同。每个文件2名称始终以*-computers.csv结尾。我正在尝试使用搜索结果与定义目录中的文件进行比较。由于我对编码的无知而失败了。 (我正在努力!)

这就是我所拥有的。由于$file2为空,似乎失败了:

gci C:\share\uploads -include *computers.csv -recurse | foreach {$path = $_.FullName;
$client = $_.Name.Trim("-computers.csv");
$file1 = import-csv -path c:\workingdir\output\$client.csv;
$file2 = import-csv -path $path | Compare-Object $file1 $file2 -property Name} | export-csv C:\workingdir\$client.csv -NoTypeInformation

任何帮助将不胜感激。我被卡住了!

1 个答案:

答案 0 :(得分:0)

如果没有一些示例CSV文件,请不要确定我已修复它或使其变得更糟。一些问题:

  1. 您没有向Compare-Object发送任何内容。
  2. 添加了验证Import-CSV调用是否有效的代码,如果没有,则编写一条消息。
  3. Trim的调用失败了。我把它改成了替换。
  4. 代码不太可读。
  5. 添加了一些详细的日志记录。
  6. 剩余问题

    1. 导出将使用最后一个客户名称。
    2. 示例代码

      $files = Get-ChildItem C:\share\uploads -include *computers.csv -recurse
      $files | Foreach-Object {
          $path = $_.FullName
          Write-Verbose "Path: $path" -Verbose
          $client = $_.Name.Replace("-computers.csv","")
          Write-Verbose "Client: $client" -Verbose
          $file1 = Import-Csv -path c:\workingdir\output\$client.csv
          $file2 = Import-Csv -path $path 
      
          if($file1 -and $file2) { 
              Compare-Object $file1 $file2 -property Name
          } 
          else
          {
              Write-Verbose -Message "Error processing $path" -Verbose
          }
      } | Export-Csv C:\workingdir\$client.csv -NoTypeInformation