PowerShell 2.0으로 전체 디렉토리를 재귀 적으로 삭제하는 방법은 무엇입니까?


308

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으로 파이프하는 다양한 예제를 보았지만 예제는 일반적으로 전체 디렉토리가 아닌 필터를 기반으로 일부 파일 세트를 제거합니다.

최소한의 코드를 사용하여 사용자 경고 메시지를 생성하지 않고 전체 디렉토리, 파일 및 하위 디렉토리를 제거하는 가장 깨끗한 방법을 찾고 있습니다. 하나의 라이너는 이해하기 쉽다면 좋을 것입니다.


2
powershell, 알아요.RD /S /Q
Rubens Farias가


나는 그것이 중복이라고 생각하지 않습니다. 게시하기 전에 1667145를 검토했습니다. 사용자 지정 PowerShell 공급자의 Remove-Item 메서드 구현을 호출 할 때 PowerShell이 ​​Recurse bool 매개 변수를 올바르게 설정하지 않는 이유를 묻습니다. 내장 파일 시스템 공급자와 관련된 Remove-Item 동작에 대해 묻고있었습니다.
매트 스프 래들리

2
"RD / S / Q"가 PowerShell에서 작동하지 않는 것 같습니다. "Remove-Item : '/ q'인수를 허용하는 위치 매개 변수를 찾을 수 없습니다."
BrainSlugs83

5
rdRemove-Itempowershell 의 별칭입니다 . cmd /c "rd /s /q"그래도 작동합니다.
codekaizen

답변:


510
Remove-Item -Recurse -Force some_dir

여기에 광고 된대로 실제로 작동합니다.

rm -r -fo some_dir

작동하는 속기 별칭입니다.

내가 이해 -Recurse하는 한 필터링 된 파일 세트를 재귀 적으로 삭제하려고 하면 매개 변수가 올바르게 작동하지 않습니다. 하나의 dir과 그 아래의 모든 것을 죽이면 잘 작동하는 것 같습니다.


5
당신이 맞다고 생각합니다. " '일부 디렉토리'에서 사용중인 항목을 제거 할 수 없습니다."라는 메시지가 표시됩니다. 오류가 발생하여 재귀 알고리즘에 문제가 있다고 가정하고 해결 방법을 검색했습니다. 대상 디렉토리에서 작업중 인 스크립트에서 이전에 해고 된 프로세스가 있음이 밝혀졌습니다. 다른 프로세스를 기다리도록 스크립트를 변경하면 "Remove-Item -Recurse -Force"명령이 작동합니다. 항상 거울을 먼저보십시오 :)
Matt Spradley

15
하위 디렉토리를 포함하는 디렉토리에서 실행할 때 이것을 두 번 실행해야한다는 것을 알았습니다. 처음에는 "디렉토리가 비어 있지 않습니다"라는 오류가 많이 발생합니다. 두 번째로 오류없이 완료됩니다.
Kristopher Johnson

5
Kristopher Johnson, Windows 7의 다양한 도구에서 유사한 오류가 발생합니다. 파일 또는 폴더보다 이전에 삭제 호출이 반환되면 실제로 문제가 발생하는 것 같습니다. 이것은 Explorer, Far, cmd 및 PowerShell에서 발생하는 것으로 보입니다.
Joey

2
@Joey "파일이나 폴더가 실제로 삭제되기 전에 삭제 호출이 반환되어 문제가 발생할 수 있습니다." -> 설명을 위해 : 상위 폴더가 삭제되지 않고 다음 오류가 발생합니다. "[parent 폴더]는 비어 있지 않기 때문에 제거 할 수 없습니다." 나는 이것이 (느린) 네트워크 드라이브에서 지속적으로 발생하는 것을 본다. 유일한 해결책은 다음 cmd /c rd과 같습니다.
Davor Josipovic

6
"디렉토리가 비어 있지 않습니다"오류는 무엇입니까? serverfault.com/questions/199921/powershell-remove-force 아마도 더 나은 get-childitem * -include * .csv -recurse | 모르겠어요. 참조 stackoverflow.com/a/1668471/206730
Kiquenet

39

나는 사용했다 :

rm -r folderToDelete

이것은 매력처럼 작동합니다 (우분투에서 훔쳤습니다).


cygwin, git 또는 Windows에서 bash 쉘을 시뮬레이트 할 수있는 다른 도구가 필요하지 않습니까?
Pete

19
@Pete, 아니요. PowerShell 외에는 아무것도 필요하지 않습니다. PowerShell의 기본 구성에 rm대한 별칭입니다 Remove-Item. Get-Alias rm자세한 내용 은 출력을 확인 하십시오. 는 -r매개 변수를 PowerShell을의 부분 일치하는 행동을 이용하고있다. 이후 Remove-Item만이 하나 개의 매개 변수가있는 'R'로 시작, 즉 -Recurse, -r그 일치한다. 따라서, 모든 다음은 동일하게 작동합니다 : rm -r, rm -re, Remove-Item -Recurse. (모두 rm -rfrm -r -f작동 하지 않지만 rm -r -fo의지는 -rf매개 변수와 -f일치 하지 않으며 둘 이상 과 일치합니다.)
chwarr

1
어떻게에 대한. "Remove-Item -Recurse -Force some_dir"에 대한 Powershell rm 별명은 remove-item을 직접 사용하는 것보다 낫습니다. " '일부 디렉토리'에서 항목을 제거 할 수 없습니다. 같은 오류가 발생했습니다. 오류없이 remove-item에서 rm -r로 전환했습니다!?
Greg

흥미 롭군 상자에 cygwin 도구가 있고 시도했지만 rm -rf folder물론 실패했습니다. 나는 우분투라고 말했기 때문에 처음에 답을 투표했다. @chwarr의 의견 덕분에 나는없이 그것을 시도했고 frm 바이너리 대신 별칭을 선택했습니다. 나는 투안은 투안이 별칭 알았거나 정말 유닉스 RM ;-)라고 생각하지 않도록 경우 (자신의 소스를 업데이트 텐데
여호수아 볼

2
아마도 내가 -R대신 -rPowerShell을 사용하는 경우 (Windows PowerShell은 대소 문자를 구분하지 않는 나머지 Windows와 유사하므로 차이를 만들지 않아야 함) 대신 삭제하려는 폴더가 있다는 오류가 발생했을 수 있습니다. 비어 있지 않습니다.
rbaleksandar

25

간단한 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

1
TFS 빌드 스크립트에서 PowerShell을 사용하여 문제를 해결하는 동안 정답이었습니다.
rcabr

이것은 나에게도 해결책입니다. 내 좋은 사람에게 몇 가지 요점을 알려주세요!
Jammer

나를 위해 일했다. 폴더 내용을 재귀 적으로 삭제할 수는 없지만 솔루션이 효과적이었습니다. 감사
SheldonH

이것은 매우 강력한 솔루션입니다
Max Young

왜 받아 들여진 대답이 그렇게 많은 표를 받았는지 잘 모르겠습니다 remove-item -recurse. Powershell v5에서 개인적으로 여전히 간헐적 인 오류가 발생 하므로이 솔루션이 가장 좋습니다.
JonoB


11

이 예제를 시도하십시오. 디렉토리가 존재하지 않으면 오류가 발생하지 않습니다. PowerShell v3.0이 필요할 수 있습니다.

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

7

구식 DOS 명령을 사용하십시오.

rd /s <dir>

이것이 스크립트의 일부인 경우, /q(Quiet 모드, / S를 사용하여 디렉토리 트리를 제거해도 괜찮은지 묻지 마십시오) 를 사용해야 합니다.
wildeyes

6

어떤 이유로 John Rees의 대답이 때때로 제 경우에는 효과가 없었습니다. 그러나 그것은 다음과 같은 방향으로 나를 이끌었습니다. 먼저 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
        }
    }
}

기능을 실행할 때 오류를 재현 할 수 있습니까? 개선 할 수 있도록 알고 싶습니다.
John Rees

정확한 설정을 기억하지 마십시오. : / 여러 하위 디렉토리가 관련된 경우라고 생각합니다. "Remove-Item -force -recurse"에 대한 호출이 모든 파일을 삭제하지는 않았으며이 경우 디렉토리가 비어 있지 않아 마지막 Remove-Tree가 실패했습니다. 이것이 바로 버그가있는 내장 버전 (-force)을 먼저 시도한 다음 각 디렉토리로 수동으로 내려 가서 남은 것을 "수동으로"삭제하는 새로운 솔루션을 만든 이유입니다. 이 버전은 정기적으로 사용 중이며 지금까지 작동하고 있습니다. 프로그램이 여전히 디렉토리에 대한 핸들을 보유 할 때 실패한 유일한 원인입니다.
jdoose

5

허용 된 응답의 "디렉토리가 비어 있지 않습니다"오류를 방지하려면 이전에 제안 된대로 이전의 DOS 명령을 사용하십시오. 복사 붙여 넣기 준비가 된 전체 PS 구문은 다음과 같습니다.

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

3
여전히 폴더에 "디렉토리가 비어 있지 않습니다"라는 오류가 발생합니다!?
Oncel Umut TURER

2

위의 @ 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


2
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 터미널에서 이것을 실행하면 완료되면 중지됩니다.


모니터링에 대한 아이디어는 유용 할 수 있지만, 일단 메시지가 완료되면 메시지를 인쇄하는 것과 거의 다르지 않으며 Remove-Item을 중지하는 데 문제가있는 경우 루프가 끝나지 않습니다.
Raúl Salinas-Monteagudo

@ RaúlSalinas-Monteagudo true이지만 확실하거나 무자비한 유스 케이스 시나리오입니다. 누군가가 이동 중에도 기억하고 입력 할 수있을 정도로 작아야 만 정교한 .ps1 파일을 디렉토리로 실행할 수 없습니다.
Gajendra D Ambi

2

전체 폴더 트리를 삭제하면 때때로 작동하고 때로는 "디렉토리가 비어 있지 않습니다"오류와 함께 실패합니다. 폴더가 여전히 존재하는지 확인하려고하면 "액세스 거부"또는 "무단 액세스"오류가 발생할 수 있습니다. 이 StackOverflow 게시 에서 약간의 통찰력을 얻을 수 있지만 왜 이런 일이 발생하는지 알 수 없습니다 .

폴더 내의 항목이 삭제되는 순서를 지정하고 지연을 추가하여 이러한 문제를 해결할 수있었습니다. 다음은 나에게 잘 어울립니다.

# 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 기사 는 하위 폴더 목록을 깊이별로 정렬하는 데 도움이되었습니다.

와 마찬가지로 신뢰성 문제 RD / S / Q는 실행에 의해 해결 될 수 DEL / F / S / Q를 종래에 RD / S / Q 앤드 실행 RD를 예하여 (이상적으로는, 일시 정지 사이에서 - 번째 필요 같이 이하).

DEL /F /S /Q "C:\Some\Folder\to\Delete\*.*" > nul
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

정말 간단합니다 :

remove-item -path <type in file or directory name>, press Enter

예제 실행도 제공해야합니다.
불가분 한

1

또 다른 유용한 트릭 :

동일하거나 유사한 이름 규칙을 가진 많은 파일을 찾으면 (예 : 접두사 이름이있는 mac 파일 ... 유명한 파일 풀링) 다음과 같이 powershell에서 한 줄로 쉽게 제거 할 수 있습니다.

ls -r .* | rm

이 줄은 현재 디렉토리 내에서 이름의 시작 부분에 점이있는 모든 파일과이 디렉토리 내의 다른 폴더 안에있는 동일한 환경의 모든 파일도 제거합니다. 사용시주의하십시오. :디


왜 사용하지 rm -rf .*않습니까? 테스트 할 Powershell이 ​​없지만 작동 할 것이라고 생각합니다.
Vini.g.fer

1
그것은 간단합니다; 명령에서 "| rm"을 제거하면 삭제할 항목의 전체 파노라마를 볼 수 있으며 확실하게 명령을 완료 할 수 있습니다.
다니엘 알베르토 레페 아얄라

cierto, quitar los archivos que empiecen con punto, (como los de mac) pero que tengan propiedad de oculto, pueses usar : ls -r -h. * | rm
Daniel Alberto Lepe Ayala

1

폴더 구조를 포함한 전체 내용을 삭제하려면

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

-recurse에 추가 remove-item대화 형 프롬프트가 비활성화됩니다 보장합니다.


-1
$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"
}

부모 디렉토리를 삭제하지 않고 일부 로그 파일을 정리하기 위해 위의 내용을 작성하면 완벽하게 작동합니다!


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.