如何使用 PowerShell 从 CSV 中未列出的文件夹中删除图像
How to remove images from folder which are not listed in CSV with PowerShell
我正在尝试删除 CSV 文件中未列出的所有图像。数据以下述格式转为 CSV。
问题是脚本将删除图像文件夹中的所有文件。我只想从 CSV 文件中删除不包含 SKU 的图片(例如“7-5468-XXX7”)。在这里做什么?
正在尝试使用这个:
$filestokeep = Import-Csv "C:\Users\example\filestokeep.csv"
$files = Get-ChildItem "C:\Users\example\images\"
$files |
Where-Object Name -notin $filestokeep.sku |
Remove-Item -WhatIf
filestokeep.csv 看起来像:
"sku"
"1-123-X"
"2-123-XXXXX"
"3-562-XXXX"
"4-215-XXXXXX"
"5-56482-XX-X"
"6-45688"
"7-5468-XXX"
"856-54648-X"
C:\Users\example\images\ 包含如下文件:
1-123-X.jpg
2-123-XXXXX.jpg
1-123-X_1.jpg
1-123-X_2.jpg
7-5468-XXX7.jpg
7-5468-XXX7_1.jpg
7-5468-XXX7_2.jpg
6-45688.jpg
Images 文件夹在 运行:
之后应如下所示
1-123-X.jpg
2-123-XXXXX.jpg
1-123-X_1.jpg
1-123-X_2.jpg
6-45688.jpg
Link 到我试图实现的原始代码:
https://www.reddit.com/r/PowerShell/comments/8f2z0l/remove_files_not_in_csv/
您的 FilesToKeep.csv
文件包含文件名列表,例如 1-123-X
。
您将其与包含 FileExtension
的 Name
属性 进行比较,因此您将仅包含文件名的列表与 -123-X_1.jpg
之类的内容进行比较其中包括扩展名。
为了清楚起见,比较如下所示:
Name Sku
1-123-X_1.jpg 1-123-X_1 #doesn't match because Windows cares about the .jpg piece
明白为什么这不起作用吗?分机属于一组,不属于另一组!
修复非常简单,只需与 BaseName
属性 进行比较,如下所示:
$files |
Where-Object BaseName -notin $filestokeep.sku |
Remove-Item -WhatIf
这将导致此比较发生:
BaseName Sku
1-123-X_1 1-123-X_1 #MATCHES!
然后当您继续 运行 完整脚本时,您会看到此输出,显示如果删除 -WhatIf
.
会发生什么
What if: Performing the operation "Remove File" on target "C:\temp\Files-123-X_1.jpg".
What if: Performing the operation "Remove File" on target "C:\temp\Files-123-X_2.jpg".
What if: Performing the operation "Remove File" on target "C:\temp\Files-5468-XXX7.jpg".
What if: Performing the operation "Remove File" on target "C:\temp\Files-5468-XXX7_1.jpg".
What if: Performing the operation "Remove File" on target "C:\temp\Files-5468-XXX7_2.jpg".
我正在尝试删除 CSV 文件中未列出的所有图像。数据以下述格式转为 CSV。
问题是脚本将删除图像文件夹中的所有文件。我只想从 CSV 文件中删除不包含 SKU 的图片(例如“7-5468-XXX7”)。在这里做什么?
正在尝试使用这个:
$filestokeep = Import-Csv "C:\Users\example\filestokeep.csv"
$files = Get-ChildItem "C:\Users\example\images\"
$files |
Where-Object Name -notin $filestokeep.sku |
Remove-Item -WhatIf
filestokeep.csv 看起来像:
"sku"
"1-123-X"
"2-123-XXXXX"
"3-562-XXXX"
"4-215-XXXXXX"
"5-56482-XX-X"
"6-45688"
"7-5468-XXX"
"856-54648-X"
C:\Users\example\images\ 包含如下文件:
1-123-X.jpg
2-123-XXXXX.jpg
1-123-X_1.jpg
1-123-X_2.jpg
7-5468-XXX7.jpg
7-5468-XXX7_1.jpg
7-5468-XXX7_2.jpg
6-45688.jpg
Images 文件夹在 运行:
之后应如下所示1-123-X.jpg
2-123-XXXXX.jpg
1-123-X_1.jpg
1-123-X_2.jpg
6-45688.jpg
Link 到我试图实现的原始代码: https://www.reddit.com/r/PowerShell/comments/8f2z0l/remove_files_not_in_csv/
您的 FilesToKeep.csv
文件包含文件名列表,例如 1-123-X
。
您将其与包含 FileExtension
的 Name
属性 进行比较,因此您将仅包含文件名的列表与 -123-X_1.jpg
之类的内容进行比较其中包括扩展名。
为了清楚起见,比较如下所示:
Name Sku
1-123-X_1.jpg 1-123-X_1 #doesn't match because Windows cares about the .jpg piece
明白为什么这不起作用吗?分机属于一组,不属于另一组!
修复非常简单,只需与 BaseName
属性 进行比较,如下所示:
$files |
Where-Object BaseName -notin $filestokeep.sku |
Remove-Item -WhatIf
这将导致此比较发生:
BaseName Sku
1-123-X_1 1-123-X_1 #MATCHES!
然后当您继续 运行 完整脚本时,您会看到此输出,显示如果删除 -WhatIf
.
What if: Performing the operation "Remove File" on target "C:\temp\Files-123-X_1.jpg".
What if: Performing the operation "Remove File" on target "C:\temp\Files-123-X_2.jpg".
What if: Performing the operation "Remove File" on target "C:\temp\Files-5468-XXX7.jpg".
What if: Performing the operation "Remove File" on target "C:\temp\Files-5468-XXX7_1.jpg".
What if: Performing the operation "Remove File" on target "C:\temp\Files-5468-XXX7_2.jpg".