如何使用PowerShell从名称不包含CSV中列出的字符串的文件夹中删除所有文件
我想从名称不包括CSV中列出的SKU的文件夹中删除所有文件 如果SKU与文件库完全匹配,则此操作有效,但我还希望保留包含SKU的图像。例如,如果SKU为“1-526-2”,则不应删除名称为“1-526-2_1.jpg”和“1-526-2_2.jpg”的文件。您是否可以在SKU周围添加通配符 尝试使用此选项:如何使用PowerShell从名称不包含CSV中列出的字符串的文件夹中删除所有文件,powershell,csv,contains,Powershell,Csv,Contains,我想从名称不包括CSV中列出的SKU的文件夹中删除所有文件 如果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
$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".
为此,我将使用regex
-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".
假设:在目标“C:\users\folder\1-123.jpg”上执行“删除文件”操作。
假设:在目标“C:\users\folder\1-123_1.jpg”上执行“删除文件”操作。
假设:在目标“C:\users\folder\5-16547-5.jpg”上执行“删除文件”操作。
另外,
Remove Item
cmdlet不会返回任何输出,因此无需尝试使用$data=
捕获它。感谢您的快速回复。工作如预期。@Pekka很高兴听到它适合你。如果您通过单击旁边的复选标记图标接受我的答案,我将不胜感激。这将帮助其他有类似问题的人更容易地找到它。