How to delete all the files from folder where name does not include string listed in CSV using PowerShell

雨燕双飞 提交于 2020-06-27 04:09:57

问题


I want to delete all the files from folder where name does not include SKU listed in CSV.

This works if SKU is exact match with the file base, but I also want keep images which include the SKU. For example if SKU is "1-526-2" files with names like "1-526-2_1.jpg" and "1-526-2_2.jpg" should not be deleted. Can you somehow add wildcards around the SKU?

Trying to use this:

$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

Example CSV:

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

Example files in folder:

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

Outcome now is:

"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".

Outcome should be:

"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:


For this, I'd use the regex -match operator:

$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

Output:

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".

P.S. the Remove-Item cmdlet does not return any output, so no need to try ans capture it by using $data =



来源:https://stackoverflow.com/questions/62445840/how-to-delete-all-the-files-from-folder-where-name-does-not-include-string-liste

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!