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

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

Это работает, если SKU точно соответствует базе файла, но я также хочу сохранить изображения, которые включают SKU . Например, если SKU - «1-526-2», файлы с именами типа «1-526-2_1.jpg» и «1-526-2_2.jpg» не должны удаляться. Можете ли вы как-нибудь добавить подстановочные знаки вокруг SKU?

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

$filestokeep = import-csv "C:\Users\exmaple\csv.csv" -Header sku).sku
$files = "C:\users\folder"

$data = Get-ChildItem $files -Recurse |
     Where-Object {$filestokeep  -notcontains $_.basename} |
        Remove-Item -WhatIf

Пример CSV:

"SKU"
"1-526-2"
"2-1234"
"1-6435"

Примеры файлов в папке:

1-123.jpg
1-123_1.jpg
1-526-2.jpg
1-526-2_1.jpg
1-6435_2.jpg
2-1234.jpg
5-16547-5.jpg

Результат сейчас:

"Remove File" on target "C:\Users\folder\1-123.jpg".
"Remove File" on target "C:\Users\folder\1-123_1.jpg".
"Remove File" on target "C:\Users\folder\1-526-2_1.jpg".
"Remove File" on target "C:\Users\folder\1-6435_2.jpg".
"Remove File" on target "C:\Users\folder\5-16547-5.jpg".

Результат должен быть:

"Remove File" on target "C:\Users\folder\1-123.jpg".
"Remove File" on target "C:\Users\folder\1-123_1.jpg".
"Remove File" on target "C:\Users\folder\5-16547-5.jpg".

1 Ответ

1 голос
/ 18 июня 2020

Для этого я бы использовал оператор регулярного выражения -match:

$sourceFolder = "C:\users\folder"
$filestokeep  = (Import-Csv "C:\Users\exmaple\csv.csv" -Header sku).sku

# create a regex string of the filestokeep array combining the
# strings with regex OR (`|`). Use [regex]::Escape() to escape any characters
# that have special meaning in regex.
# in this example "^(1-526-2|2-1234|1-6435)"
# the "^" anchors the match at the beginning of the string
$keepThese = '^({0})' -f (($filestokeep | ForEach-Object { [regex]::Escape($_) }) -join '|')

Get-ChildItem -Path $sourceFolder -Filter '*.jpg' -Recurse -File |
     Where-Object {$_.BaseName -notmatch $keepThese} |
        Remove-Item -WhatIf

Вывод:

What if: Performing the operation "Remove File" on target "C:\users\folder\1-123.jpg".
What if: Performing the operation "Remove File" on target "C:\users\folder\1-123_1.jpg".
What if: Performing the operation "Remove File" on target "C:\users\folder\5-16547-5.jpg".

PS командлет Remove-Item не возвращает никаких вывод, поэтому нет необходимости пытаться захватить его, используя $data =

...