How to recursively delete an entire directory with PowerShell 2.0?

前端 未结 18 2094
南旧
南旧 2020-12-07 07:26

What is the simplest way to forcefully delete a directory and all its subdirectories in PowerShell? I am using PowerShell V2 in Windows 7.

I have learned from severa

相关标签:
18条回答
  • 2020-12-07 07:49

    To avoid the "The directory is not empty" errors of the accepted answer, simply use the good old DOS command as suggested before. The full PS syntax ready for copy-pasting is:

    & cmd.exe /c rd /S /Q $folderToDelete
    
    0 讨论(0)
  • 2020-12-07 07:51
    $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"
    }
    

    Wrote the above to clean some logfiles without deleting the parent directory and this works perfectly!

    0 讨论(0)
  • 2020-12-07 07:53

    I took another approach inspired by @john-rees above - especially when his approach started to fail for me at some point. Basically recurse the subtree and sort files by their path-length - delete from longest to the shortest

    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
    

    Regarding the -LiteralPath magic, here's another gotchya that may be hitting you: https://superuser.com/q/212808

    0 讨论(0)
  • 2020-12-07 07:54

    When deleting files recursively using a simple Remove-Item "folder" -Recurse I sometimes see an intermittent error : [folder] cannot be removed because it is not empty.

    This answer attempts to prevent that error by individually deleting the files.

    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
    

    An important detail is the sorting of all the items with pspath -Descending so that the leaves are deleted before the roots. The sorting is done on the pspath parameter since that has more chance of working for providers other than the file system. The -Include parameter is just a convenience if you want to filter the items to delete.

    It's split into two functions since I find it useful to see what I'm about to delete by running

    Get-Tree some_dir | select fullname
    
    0 讨论(0)
  • 2020-12-07 07:55
    rm -r <folder_name>
    c:\>rm -r "my photos"
    
    0 讨论(0)
  • 2020-12-07 07:56

    For some reason John Rees' answer sometimes did not work in my case. But it led me in the following direction. First I try to delete the directory recursively with the buggy -recurse option. Afterwards I descend into every subdir that's left and delete all files.

    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
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题