arrays - Powershell 使用 CSV 列表检查文件夹中是否缺少文件
问题描述
我对脚本有点陌生,请原谅我在这里有任何明显的答案。
基本上,我每个月都会在一个文件夹中存储大量音乐文件。我创建了一个较小的文件夹用于测试目的:
我有一个应该在文件夹中的所有文件的 CSV 列表:
我正在尝试创建一个 Powershell 脚本:
- 获取 CSV 列“音频文件路径”名称并将其与文件夹“音乐”中的文件名进行比较
- 检查 CSV 列表或音乐文件夹中是否有任何丢失的文件
- 输出丢失文件的名称
到目前为止我的测试脚本(已编辑):
$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.
解决方案
我创建了一个 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."
}
}
这给了我以下输出:
脚本的输出 你能运行上面的脚本并发送输出吗?
推荐阅读
- javascript - 在浏览器中打开 PDF 时从 PDF 文件向服务器发送请求
- asp.net - 编写 XML 文件
- c# - While 循环以 switch 结尾:我应该使用“break”还是“continue”来结束案例?
- c++ - 为什么只有 32 个字节的 std::string 可以包含一个 62 个字节的字符串文字?
- c# - 如何在 Xunit 的 Catch 块中编写单元测试?
- spring - 如何正确抛出和检测此异常
- java - 使用 Hystrix 在 Spring Cloud 中 shareSecurityContext 是如何工作的?
- python - python迭代器、生成器和介于两者之间
- postgresql - 无法连接到 Gitlab CI 中的 postgres
- r - 在R中的数据框中识别具有最高数值的列