Как удалить изображения из папки, не указанные в CSV с помощью PowerShell - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь удалить все изображения, которых нет в CSV-файле. Данные поступают в CSV в формате, описанном ниже.

Проблема в том, что скрипт удаляет все файлы в папке изображений. Я хочу удалить только изображения, не содержащие SKU (например, «7-5468-XXX7») из файла CSV. Что здесь делать?

Попытка использовать это:

$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

После запуска папка изображений должна выглядеть так:

1-123-X.jpg
2-123-XXXXX.jpg
1-123-X_1.jpg
1-123-X_2.jpg
6-45688.jpg

Ссылка на исходный код, который я пытаюсь реализовать: https://www.reddit.com/r/PowerShell/comments/8f2z0l/remove_files_not_in_csv/

1 Ответ

0 голосов
/ 16 июня 2020

Ваш FilesToKeep.csv файл содержит списки имен файлов, например 1-123-X.

Вы сравниваете это со свойством Name, которое включает FileExtension, поэтому вы сравниваете свой список только имена файлов с чем-то вроде \1-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!

И когда вы затем go вперед и запустите полный скрипт, вы увидите результат этого, показывающий, что произойдет, если вы удалите -WhatIf.

What if: Performing the operation "Remove File" on target "C:\temp\Files\1-123-X_1.jpg".
What if: Performing the operation "Remove File" on target "C:\temp\Files\1-123-X_2.jpg".
What if: Performing the operation "Remove File" on target "C:\temp\Files\7-5468-XXX7.jpg".
What if: Performing the operation "Remove File" on target "C:\temp\Files\7-5468-XXX7_1.jpg".
What if: Performing the operation "Remove File" on target "C:\temp\Files\7-5468-XXX7_2.jpg".

...