首页 > 解决方案 > Powershell 使用 CSV 列表检查文件夹中是否缺少文件

问题描述

我对脚本有点陌生,请原谅我在这里有任何明显的答案。

基本上,我每个月都会在一个文件夹中存储大量音乐文件。我创建了一个较小的文件夹用于测试目的:

音乐文件夹

我有一个应该在文件夹中的所有文件的 CSV 列表:

缺少条目的 CSV 文件

我正在尝试创建一个 Powershell 脚本:

到目前为止我的测试脚本(已编辑):

$folder = 'C:/Users/Me/Documents'
$myFolder = Get-ChildItem '/Users/Me/Documents/Music' 
$myCSV = Import-Csv -Path 'Documents/AudioMissing.csv'| % {$_.'Audio File Path' -replace "\\", ""}

$compare = Compare-Object -ReferenceObject $myCSV -DifferenceObject $myFolder

foreach($y in $compare){
    if($y.SideIndicator -eq "=>"){
     write-output "$($y.InputObject) Is present in the Music folder but not in the CSV."
    }
    if($y.SideIndicator -eq "<="){
     write-output "$($y.InputObject) Is present in the CSV but not in Music folder."
    }
 }

除了当我运行脚本时,它会返回列表和文件夹中的所有文件,并且还说有些文件丢失了,即使它们是相同的文件名。

输出如下所示(已编辑):

9913SA_FIle1.wav Is present in the Music folder but not in the CSV.
9914SA_File2.wav Is present in the Music folder but not in the CSV.
9915SA_File3.wav Is present in the Music folder but not in the CSV.
9916SA_File4.wav Is present in the Music folder but not in the CSV.
9917SA_File5.wav Is present in the Music folder but not in the CSV.
9913SA_FIle1.wav Is present in the CSV but not in Music folder.
9914SA_File2.wav Is present in the CSV but not in Music folder.
9915SA_File3.wav Is present in the CSV but not in Music folder.
9916SA_File4.wav Is present in the CSV but not in Music folder.

我希望脚本只输出丢失的文件,如下所示:

 9917SA_File5.wav Is present in the Music folder but not in the CSV.

这可能吗?


编辑:

原来我的 CSV 文件实际上在每个“音频文件路径”条目的末尾都有隐藏空格,导致它读起来像一个不同的名称。

新代码

$myFolder = Get-ChildItem '/Users/Me/Documents/Music' | % {$_.Name}
$myCSV = Import-Csv -Path '/Users/Me/Documents/AudioMissing.csv' | % {$_.'Audio File Path' -replace "\\", ""}
$compare = Compare-Object -ReferenceObject $myCSV -DifferenceObject $myFolder -includeequal

Write-Output "`n_____FOLDER_____`n"
$myFolder

Write-Output "`n_____CSV_____`n"
$myCSV

Write-Output "`n_____COMPARE_____`n"
$compare

Write-Output "`n_____Formatted Results____`n"
foreach($y in $compare){
    if($y.SideIndicator -eq "=>"){
     write-output "$($y.InputObject) Is present in the Music folder but not in the CSV."
    }
    if($y.SideIndicator -eq "<="){
     write-output "$($y.InputObject) Is present in the CSV but not in Music folder."
    }
 }
if($y.SideIndicator -eq "=="){
     write-output "All files present."
    } 

回报:

_____FOLDER_____

9913SA_File1.wav
9914SA_File2.wav
9915SA_File3.wav
9916SA_File4.wav
9917SA_File5.wav

_____CSV_____

9913SA_File1.wav
9914SA_File2.wav
9915SA_File3.wav
9916SA_File4.wav

_____COMPARE_____


InputObject                                                         SideIndicator                                                     
-----------                                                         -------------                                                     
9913SA_File1.wav                                                    ==                                                                
9914SA_File2.wav                                                    ==                                                                
9915SA_File3.wav                                                    ==                                                                
9916SA_File4.wav                                                    ==                                                                
9917SA_File5.wav                                                    =>                                                                

_____Formatted Results____

9917SA_File5.wav Is present in the Music folder but not in the CSV.

标签: arrayspowershellcsvcomparedirectory

解决方案


我创建了一个 csv 文件,其中包含以下内容:

ID  Audio File Path
1   99\13\SA_File1.docx
2   99\13\SA_File2.docx
3   99\13\SA_File3.docx
5   99\13\SA_File5.docx

注意:我99\13\SA_File4.docx从列表中删除。

然后我运行以下脚本:

$myCSV = Import-Csv -Path '/Users/me/myFiles.csv' | % {$_.'Audio File Path' -replace "\\", ""}
$myFolder = Get-ChildItem '/Users/me/test'

$compare = Compare-Object -ReferenceObject $myCSV -DifferenceObject $myFolder

foreach($y in $compare){
    if($y.SideIndicator -eq "=>"){
     write-output "$($y.InputObject) Is present in the Music folder but not in CSV."
    }
    if($y.SideIndicator -eq "<="){
     write-output "$($y.InputObject) Is present in the CSV but not in the Music folder."
    }
 }

我已经测试过从文件夹中删除一个文件并将该文件包含在 CSV 中,并且脚本符合要求。

比较对象时不需要-passthru标志,Get-ChildItem这对这个应用程序很好。


编辑:

你的结果很奇怪,请看下面的脚本(我已经更新了文件名,看起来更像你的):

$myFolder = Get-ChildItem '/Users/me/test'
$myCSV = Import-Csv -Path '/Users/me/myFiles.csv' | % {$_.'Audio File Path' -replace "\\", ""}
$compare = Compare-Object -ReferenceObject $myCSV -DifferenceObject $myFolder

Write-Output "`n_____FOLDER_____`n"
$myFolder.Name

Write-Output "`n_____CSV_____`n"
$myCSV

Write-Output "`n_____COMPARE_____`n"
$compare

Write-Output "`n_____Formatted Results____`n"
foreach($y in $compare){
    if($y.SideIndicator -eq "=>"){
     write-output "$($y.InputObject) Is present in the Music folder but not in the CSV."
    }
    if($y.SideIndicator -eq "<="){
     write-output "$($y.InputObject) Is present in the CSV but not in Music folder."
    }
 }

这给了我以下输出:

脚本的输出 你能运行上面的脚本并发送输出吗?


推荐阅读