【问题标题】:Export Differences to CSV and Combine with Columns from a Separate CSV PowerShell将差异导出到 CSV 并与单独的 CSV PowerShell 中的列合并
【发布时间】:2018-11-04 03:42:24
【问题描述】:

基本上,我有一个 CSV 文件,其中列出了一个目录的内容,以分析任何丢失的文件。

我的脚本会执行此操作,但我正在尝试将丢失文件的结果导出到新的 CSV 文件。

当前脚本:

#get working directory
$documents = 'C:\Users\Me\Documents\ScriptTest'
#path to files located in the directory
$myFolder = Get-ChildItem 'C:\Users\Me\Documents\Test\1' -Recurse -Include *.txt | 
    Select-Object -ExpandProperty BaseName | 
        Where-Object{$_ -notmatch "\\FolderName\\"}
#get items located in CSV file list column
$myCSV = Import-CSV -Path 'C:\Users\Me\Documents\Test.csv' | 
    Select-Object -ExpandProperty 'File Path'

$CSVexport = '\Users\Me\Documents\Test.csv'

$results=@()
$desiredColumns = @{
        ID = $CSVexport | Select-Object ID 
        'File Path' = $CSVexport | Select-Object 'File Path'
        }

#split the CSV item names
$splits=@()
foreach($file in $myCSV){
  $split = $file.split("\\")[2]
  $split2 = $split.split(".")[0]
  $splits+=$split2
}

#compare the CSV items to the folder items
$compare = Compare-Object -ReferenceObject $splits -DifferenceObject $myFolder -includeequal

Write-Output "`n_____Results____`n"
#Write the results and export to a CSV file
$compare | ForEach-Object {
    if($_.SideIndicator -eq "<="){
        write-host "`n$($_.InputObject) is missing from the Test folder.`n"
        $results = New-Object PSObject -Property $desiredColumns
        $results.'File Path' = $_.InputObject
        $results | Export-Csv -Path C:\Users\Me\Documents\Results.csv –NoTypeInformation
    }
}

我得到的只是:

它只获取丢失的文件之一,而“ID”列则没有。我希望能够获得比较结果并将其导出到新的 CSV,其中包含第一个 CSV 文件中的相关列。例如:

我可以就我可能做错的事情寻求帮助吗?


编辑(响应 LotPings 回答)

新代码:

$documents = 'C:\Users\Me\Documents'

$NewCsv = Import-CSV -Path 'C:\Users\Me\Documents\Test.csv' |
    Select-Object ID,'File Path' |  
      ForEach-Object {
        if (!(Test-Path (Join-Path $documents $_.'File Path'))){
          [PSCustomObject]@{
             ID = $_.ID
             Missing = $_.'File Path'
          }
       }
    }
    $NewCsv

输出:

Name                           Value                                                                           
----                           -----                                                                           
ID                             4                                                                               
Missing                        Test\1\File4.txt                                                                
ID                             6                                                                               
Missing                        Test\1\File6.txt   

【问题讨论】:

  • 您在 PowerShell ISE 中执行此操作?关闭 ISE,然后重新启动它并再次尝试 LotPings 回答。您的输出看起来像是在输出多个哈希表,因此要么您有一些类型错误的重用变量,要么您忘记了其中的 [pscustomobject] 部分。

标签: arrays powershell csv scripting comparison


【解决方案1】:

非常复杂。

如果你迭代你的 csv,检查每个文件的存在并动态生成一个新的 csv,它可以很简单:

## Q:\Test\2018\05\24\SO_50517360.ps1
$BasePath = "C:\Users\Me\Documents"

$NewCsv = Import-CSV -Path '.\Test.csv'|Select-Object ID,'File Path' |  
  ForEach-Object {
    if (!(Test-Path (Join-Path $BasePath $_.'File Path'))){
      [PSCustomObject]@{
         ID = $_.ID
         Missing = $_.'File Path'
      }
   }
}
$NewCsv

示例输出(可通过
$NewCsv|Export-Csv .\Missing.csv -NoTypeInformation

放入新文件中
> .\SO_50517360.ps1

ID Missing
-- -------
4  Test\1\File4.txt
6  Test\1\File6.txt

【讨论】:

  • 使用了您的代码,结果与您为我提供的不同。请参阅 OP 中的编辑。如果有帮助,请使用 PowerShell v1..
  • @jl93 不太可能是 v1...$PSVersionTable 的 PSVersion 值是多少?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 2018-09-15
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 2013-04-08
  • 2021-03-03
相关资源
最近更新 更多