如何使用PowerShell 2.0递归删除整个目录?

Mat*_*ley 276 windows filesystems powershell windows-7 delete-directory

在PowerShell中强制删除目录及其所有子目录的最简单方法是什么?我在Windows 7中使用PowerShell V2.

我从几个消息来源获悉,最明显的命令,Remove-Item $targetDir -Recurse -Force无法正常工作.这包括PowerShell V2在线帮助(找到使用Get-Help Remove-Item -Examples)中的声明,其中声明:

...由于此cmdlet中的Recurse参数有问题,因此该命令使用Get-Childitem cmdlet获取所需的文件,并使用管道运算符将它们传递给Remove-Item cmdlet ...

我已经看到了各种使用Get-ChildItem并将其传递给Remove-Item的示例,但这些示例通常会根据过滤器而不是整个目录删除一些文件集.

我正在寻找最简洁的方法来吹灭整个目录,文件和子目录,而不使用最少量的代码生成任何用户警告消息.如果容易理解,单行会很好.

Joe*_*oey 464

Remove-Item -Recurse -Force some_dir
Run Code Online (Sandbox Code Playgroud)

确实像这里宣传的那样工作.

rm -r -fo some_dir
Run Code Online (Sandbox Code Playgroud)

是速记别名,也是有效的.

据我所知,-Recurse当您尝试递归删除过滤的文件集时,该参数无法正常工作.为了杀死一个单一的目录和下面的一切似乎工作正常.

  • 我发现在包含子目录的目录上运行时我需要运行两次.第一次,会出现很多"目录不空"的错误.第二次,它完成没有错误. (14认同)
  • 我认为你是对的.我得到一个"无法删除'某个目录'的项目,因为它正在使用中." 错误,并假设它是递归算法的问题,并去寻找一个解决方法.事实证明我之前在目标目录中运行的脚本中已经触发了一个进程.当更改脚本以等待另一个进程时,"Remove-Item -Recurse -Force"命令有效.总是先照镜子:) (5认同)
  • Kristopher Johnson,我在Windows 7上使用不同的工具得到了类似的错误.似乎删除调用早于文件或文件夹实际删除,有时会造成麻烦.这似乎发生在Explorer,Far,cmd和PowerShell中. (5认同)
  • 什么是"目录不为空"错误?http://serverfault.com/questions/199921/powershell-remove-force也许更好的get-childitem*-include*.csv -recurse | 删除项目我不知道.请参见http://stackoverflow.com/a/1668471/206730 (4认同)
  • @Joey"看起来删除调用早于文件或文件夹的返回实际上已被删除,有时会造成麻烦." - >澄清:父文件夹不会被删除,并且会出现以下错误:"[父文件夹]无法删除,因为它不是空的." 我看到这种情况经常发生在(缓慢的)网络驱动器上.唯一的解决方案是旧的:`cmd/c rd`如下所述. (2认同)

Tua*_*inn 38

我用了:

rm -r folderToDelete
Run Code Online (Sandbox Code Playgroud)

这对我来说就像一个魅力(我从Ubuntu偷了它).

  • @Pete,不,它除了PowerShell之外不需要任何东西.`rm`是PowerShell默认配置中`Remove-Item`的别名.检查`Get-Alias rm`的输出以获取更多详细信息.`-r`正在利用PowerShell对参数的部分匹配行为.由于`Remove-Item`只有一个以'r'开头的参数,`-Recurse`,`-r`匹配.因此,以下所有内容都将起作用:`rm -r`,`rm -re`,`Remove-Item -Recurse`.(注意,`rm -rf`和`rm -r -f`都不起作用,但`rm -r -fo`会.`-rf`匹配没有参数,`-f`匹配多个.) (17认同)
  • 也许是因为我使用了 `-R` 而不是 `-r`(尽管据我所知,PowerShell 就像 Windows 的其余部分不区分大小写,因此它不应该有什么区别)但是我得到一个错误我要删除的文件夹不是空的。 (2认同)

Joh*_*ees 23

使用简单的递归删除文件Remove-Item "folder" -Recurse我有时会看到间歇性错误:[folder] cannot be removed because it is not empty.

此答案尝试通过单独删除文件来防止该错误.

function Get-Tree($Path,$Include='*') { 
    @(Get-Item $Path -Include $Include -Force) + 
        (Get-ChildItem $Path -Recurse -Include $Include -Force) | 
        sort pspath -Descending -unique
} 

function Remove-Tree($Path,$Include='*') { 
    Get-Tree $Path $Include | Remove-Item -force -recurse
} 

Remove-Tree some_dir
Run Code Online (Sandbox Code Playgroud)

一个重要的细节是对所有项目进行排序,pspath -Descending以便在根之前删除叶子.对pspath参数进行排序,因为除文件系统之外的提供者有更多的工作机会.-Include如果要过滤要删除的项目,该参数只是一个方便.

它分为两个函数,因为我发现通过运行来查看我要删除的内容很有用

Get-Tree some_dir | select fullname
Run Code Online (Sandbox Code Playgroud)

  • 在 TFS 构建脚本中使用 PowerShell 解决问题时,事实证明这是正确的答案。 (2认同)

mik*_*key 14

如果您致力于使用 powershell,则可以使用它,如已接受的答案中所述:

rm -r -fo targetDir
Run Code Online (Sandbox Code Playgroud)

但我发现使用 Windows 命令提示符更快

rmdir /s/q targetDir
Run Code Online (Sandbox Code Playgroud)

除了速度更快之外,使用命令提示符选项的另一个优点是它会立即开始删除文件(powershell 首先执行一些枚举),因此如果在运行时出现问题,您至少在删除文件方面取得了一些进展。


ste*_*ier 10

rm -r ./folder -Force    
Run Code Online (Sandbox Code Playgroud)

......为我工作


小智 9

试试这个例子.如果该目录不存在,则不会引发错误.您可能需要PowerShell v3.0.

remove-item -path "c:\Test Temp\Test Folder" -Force -Recurse -ErrorAction SilentlyContinue
Run Code Online (Sandbox Code Playgroud)


小智 7

使用旧式DOS命令:

rd /s <dir>
Run Code Online (Sandbox Code Playgroud)

  • 如果这是脚本的一部分,您也必须使用“/q”(安静模式,不要询问是否可以使用/S删除目录树)。 (2认同)

Dej*_*jan 6

要避免接受的答案的"目录不为空"错误,只需使用之前建议的旧的旧DOS命令.准备好复制粘贴的完整PS语法是:

& cmd.exe /c rd /S /Q $folderToDelete
Run Code Online (Sandbox Code Playgroud)

  • 它仍然为文件夹提供"目录不为空"错误!? (2认同)

jdo*_*ose 5

出于某种原因,约翰里斯的回答有时在我的案例中不起作用.但它使我朝着以下方向前进.首先,我尝试使用buggy -recurse选项以递归方式删除目录.然后我进入左边的每个子目录并删除所有文件.

function Remove-Tree($Path)
{ 
    Remove-Item $Path -force -Recurse -ErrorAction silentlycontinue

    if (Test-Path "$Path\" -ErrorAction silentlycontinue)
    {
        $folders = Get-ChildItem -Path $Path –Directory -Force
        ForEach ($folder in $folders)
        {
            Remove-Tree $folder.FullName
        }

        $files = Get-ChildItem -Path $Path -File -Force

        ForEach ($file in $files)
        {
            Remove-Item $file.FullName -force
        }

        if (Test-Path "$Path\" -ErrorAction silentlycontinue)
        {
            Remove-Item $Path -force
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Gaj*_*mbi 5

del <dir> -Recurse -Force # I prefer this, short & sweet
Run Code Online (Sandbox Code Playgroud)

或者

remove-item <dir> -Recurse -Force
Run Code Online (Sandbox Code Playgroud)

如果你有一个很大的目录那么我通常做的是

while (dir | where name -match <dir>) {write-host deleting; sleep -s 3}
Run Code Online (Sandbox Code Playgroud)

在另一个 powershell 终端上运行它,完成后它将停止。