我从堆栈溢出中得到以下代码,它工作正常。
$TargetFolder = “Pathofyourfolder”
$Files = Get-ChildItem $TargetFolder -Exclude (gc List.txt) -Recurse
foreach ($File in $Files)
{
write-host “Deleting File $File” -foregroundcolor “Red”;
Remove-Item $File | out-null
}
现在我要删除列表中包含文件名的文件。我尝试了上述的一些变体,例如将Exclude替换为Include但没有成功。有人可以帮忙吗?
答案 0 :(得分:4)
$targetFolder = "D:\TEST_123"
$fileList = "D:\DeleteList.txt"
Get-ChildItem -Path "$targetFolder\*" -Recurse -Include @(Get-Content $fileList) | Remove-Item -Verbose
要使-Include
生效,您应在文件夹名称末尾指定\*
,并在删除列表中指定带扩展名的文件名。上面的代码适用于我,只删除文件夹及其所有子文件夹中的指定文件。
我还使用-Verbose
代替foreach
和Write-Host
。
答案 1 :(得分:2)
您可以直接使用Remove-Item
:
Remove-Item $TargetFolder\* -Recurse -Include (Get-Content List.txt) -Verbose
请注意\*
附加的必需$TargetFolder
。
-Include
和-Exclude
可能很棘手(请参阅我的this answer),但只要-Include
包含,List.txt
就可以在这里工作仅仅是文件名(没有路径组件)。
与n01d的回答一样,-Verbose
旨在用foreach
次来代替明确的Write-Host
循环。
另请注意,Remove-Item
没有向输出流写入任何内容,因此没有理由将其输送到Out-Null
答案 2 :(得分:1)
我发现-Include
param在大多数情况下确实无法按照您的预期运行。
所以我建议这段代码让它快速运行。
$TargetFolder = “Pathofyourfolder”
$Files = Get-ChildItem $TargetFolder -Recurse| Where Name -in (gc List.txt)
foreach ($File in $Files)
{
write-host “Deleting File $File” -foregroundcolor “Red”;
Remove-Item $File | out-null
}
如果您想通过与-include
联系,可以让它更快一些,但我坦率地认为这很糟糕,这样可行。
答案 3 :(得分:1)
您可以尝试以下方法:
Get-Content .\filesToDelete.txt | ForEach-Object {Remove-Item $_}
它更容易理解,很容易解释($_
代表for循环的当前变量)。