首页 文章

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

提问于
浏览
223

在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 的示例,但这些示例通常会根据过滤器而不是整个目录删除一些文件集 .

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

15 回答

  • 2

    真的很简单:

    remove-item -path <type in file or directory name>, press Enter
    
  • 9
    Remove-Item -Recurse -Force some_dir
    

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

    rm -r -fo some_dir
    

    是也适用的速记别名 .

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

  • -1
    rm -r ./folder -Force
    

    ......为我工作

  • 381

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

    remove-item -path "c:\Test Temp\Test Folder" -Force -Recurse -ErrorAction SilentlyContinue
    
  • 8

    出于某种原因,约翰里斯的回答有时在我的案例中不起作用 . 但它引领我走向了以下方向 . 首先,我尝试使用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
            }
        }
    }
    
  • 1

    使用旧式DOS命令:

    rd /s <dir>
    
  • 6
    $users = get-childitem \\ServerName\c$\users\ | select -ExpandProperty name
    
    foreach ($user in $users)
    
    {
    remove-item -path "\\Servername\c$\Users\$user\AppData\Local\Microsoft\Office365\PowerShell\*" -Force -Recurse
    Write-Warning "$user Cleaned"
    }
    

    写上面的内容来清理一些日志文件而不删除父目录,这非常有效!

  • 17

    使用简单的 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
    

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

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

    Get-Tree some_dir | select fullname
    
  • 5

    我采取了另一种灵感来自@ john-rees的方法 - 尤其是当他的方法在某些时候开始让我失败时 . 基本上递归子树并按路径长度排序文件 - 从最长到最短删除

    Get-ChildItem $tfsLocalPath -Recurse |  #Find all children
        Select-Object FullName,@{Name='PathLength';Expression={($_.FullName.Length)}} |  #Calculate the length of their path
        Sort-Object PathLength -Descending | #sort by path length descending
        %{ Get-Item -LiteralPath $_.FullName } | 
        Remove-Item -Force
    

    关于-LiteralPath魔法,这是另一个可能会打你的可能:https://superuser.com/q/212808

  • 1

    删除包括文件夹结构使用的完整内容

    get-childitem $dest -recurse | foreach ($_) {remove-item $_.fullname -recurse}
    

    添加到 remove-item-recurse 确保禁用交互式提示 .

  • 1

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

    & cmd.exe /c rd /S /Q $folderToDelete
    
  • 32

    我用了:

    rm -r folderToDelete
    

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

  • 8

    Another useful trick:

    如果您发现很多具有相同或相似名称约定的文件(例如带有点前缀名称的mac文件......那个着名的文件提取),您可以使用powershell中的一行轻松删除它们,如下所示:

    ls -r .* | rm
    

    这一行将删除当前目录中名称开头的所有带有点的文件,以及此目录中其他文件夹内具有相同情况的所有文件 . 使用它时要注意它 . :d

  • 1

    删除整个文件夹树有时会起作用,有时会因"Directory not empty"错误而失败 . 随后尝试检查文件夹是否仍然存在可能导致"Access Denied"或"Unauthorized Access"错误 . 我不知道为什么会发生这种情况,尽管可以从_489304获得一些见解 .

    通过指定删除文件夹中项目的顺序以及添加延迟,我能够解决这些问题 . 以下对我来说运行良好:

    # First remove any files in the folder tree
    Get-ChildItem -LiteralPath $FolderToDelete -Recurse -Force | Where-Object { -not ($_.psiscontainer) } | Remove-Item –Force
    
    # Then remove any sub-folders (deepest ones first).    The -Recurse switch may be needed despite the deepest items being deleted first.
    ForEach ($Subfolder in Get-ChildItem -LiteralPath $FolderToDelete -Recurse -Force | Select-Object FullName, @{Name="Depth";Expression={($_.FullName -split "\\").Count}} | Sort-Object -Property @{Expression="Depth";Descending=$true}) { Remove-Item -LiteralPath $Subfolder.FullName -Recurse -Force }
    
    # Then remove the folder itself.  The -Recurse switch is sometimes needed despite the previous statements.
    Remove-Item -LiteralPath $FolderToDelete -Recurse -Force
    
    # Finally, give Windows some time to finish deleting the folder (try not to hurl)
    Start-Sleep -Seconds 4
    

    PowerShell中的Microsoft TechNet文章Using Calculated Properties对于获取按深度排序的子文件夹列表非常有帮助 .

    RD /S /Q 的类似可靠性问题可以通过两次运行_489308来解决 - 理想情况是两者之间有一个暂停(即使用 ping ,如下所示) .

    RD /S /Q "C:\Some\Folder\to\Delete" > nul
    if exist "C:\Some\Folder\to\Delete"  ping -4 -n 4 127.0.0.1 > nul
    if exist "C:\Some\Folder\to\Delete"  RD /S /Q "C:\Some\Folder\to\Delete" > nul
    
  • 1
    del <dir> -Recurse -Force # I prefer this, short & sweet
    

    要么

    remove-item <dir> -Recurse -Force
    

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

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

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

相关问题