powershell - 使用文件名列表删除文件

时间:2016-07-21 04:04:13

标签: powershell powershell-v3.0

我从堆栈溢出中得到以下代码,它工作正常。

$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但没有成功。有人可以帮忙吗?

4 个答案:

答案 0 :(得分:4)

$targetFolder = "D:\TEST_123"
$fileList = "D:\DeleteList.txt"

Get-ChildItem -Path "$targetFolder\*" -Recurse -Include @(Get-Content $fileList) | Remove-Item -Verbose

要使-Include生效,您应在文件夹名称末尾指定\*,并在删除列表中指定带扩展名的文件名。上面的代码适用于我,只删除文件夹及其所有子文件夹中的指定文件。

我还使用-Verbose代替foreachWrite-Host

答案 1 :(得分:2)

简化n01d's helpful answer

您可以直接使用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循环的当前变量)。