如何使用 PowerShell 从名称不包含 CSV 中列出的字符串的文件夹中删除所有文件
How to delete all the files from folder where name does not include string listed in CSV using PowerShell
我想删除名称不包含 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"
$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-123.jpg".
"Remove File" on target "C:\Users\folder-123_1.jpg".
"Remove File" on target "C:\Users\folder-526-2_1.jpg".
"Remove File" on target "C:\Users\folder-6435_2.jpg".
"Remove File" on target "C:\Users\folder-16547-5.jpg".
结果应该是:
"Remove File" on target "C:\Users\folder-123.jpg".
"Remove File" on target "C:\Users\folder-123_1.jpg".
"Remove File" on target "C:\Users\folder-16547-5.jpg".
为此,我将使用正则表达式 -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-123.jpg".
What if: Performing the operation "Remove File" on target "C:\users\folder-123_1.jpg".
What if: Performing the operation "Remove File" on target "C:\users\folder-16547-5.jpg".
P.S。 Remove-Item
cmdlet 没有 return 任何输出,因此无需尝试使用 $data =
捕获它
我想删除名称不包含 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"
$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-123.jpg".
"Remove File" on target "C:\Users\folder-123_1.jpg".
"Remove File" on target "C:\Users\folder-526-2_1.jpg".
"Remove File" on target "C:\Users\folder-6435_2.jpg".
"Remove File" on target "C:\Users\folder-16547-5.jpg".
结果应该是:
"Remove File" on target "C:\Users\folder-123.jpg".
"Remove File" on target "C:\Users\folder-123_1.jpg".
"Remove File" on target "C:\Users\folder-16547-5.jpg".
为此,我将使用正则表达式 -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-123.jpg". What if: Performing the operation "Remove File" on target "C:\users\folder-123_1.jpg". What if: Performing the operation "Remove File" on target "C:\users\folder-16547-5.jpg".
P.S。 Remove-Item
cmdlet 没有 return 任何输出,因此无需尝试使用 $data =