Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PowerShell从名称不包含CSV中列出的字符串的文件夹中删除所有文件_Powershell_Csv_Contains - Fatal编程技术网

如何使用PowerShell从名称不包含CSV中列出的字符串的文件夹中删除所有文件

如何使用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

我想从名称不包括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\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很高兴听到它适合你。如果您通过单击旁边的复选标记图标接受我的答案,我将不胜感激。这将帮助其他有类似问题的人更容易地找到它。