如何使用 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

您将其与包含 FileExtensionName 属性 进行比较,因此您将仅包含文件名的列表与 -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".