문제

PowerShell의 디렉토리와 모든 하위 디렉토리를 강제로 삭제하는 가장 간단한 방법은 무엇입니까? Windows 7에서 PowerShell V2를 사용하고 있습니다.

나는 여러 출처에서 가장 명백한 명령을 배웠습니다. Remove-Item $targetDir -Recurse -Force, 올바르게 작동하지 않습니다. 여기에는 PowerShell V2 온라인 도움말 (사용을 찾았습니다. Get-Help Remove-Item -Examples) 그 말 :

...이 CMDLET의 Reburse 매개 변수에 결함이 있으므로 명령은 Get-ChildItem CMDLET를 사용하여 원하는 파일을 가져 오며 파이프 라인 연산자를 사용하여 제거 기능 CMDLET로 전달합니다.

나는 사용하는 다양한 예를 보았다 get-childitem 파이프로 파이프 제거-항목, 그러나 예제는 일반적으로 전체 디렉토리가 아닌 필터를 기반으로 일부 파일 세트를 제거합니다.

최소한의 코드를 사용하여 사용자 경고 메시지를 생성하지 않고 전체 디렉토리, 파일 및 하위 디렉토리를 날려 버릴 수있는 가장 깨끗한 방법을 찾고 있습니다. 이해하기 쉬운 경우 1 라이너가 좋을 것입니다.

도움이 되었습니까?

해결책

Remove-Item -Recurse -Force some_dir

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

rm -r -fo some_dir

효과가있는 속도 별명입니다.

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

다른 팁

나는 사용했다 :

rm -r folderToDelete

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

파일을 삭제할 때 간단한 것을 사용하여 재귀 적으로 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
rm -r ./folder -Force    

... 나를 위해 일했습니다

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

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

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

rd /s <dir>

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

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

어떤 이유로 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에서 영감을 얻은 또 다른 접근법을 취했습니다. 특히 그의 접근 방식이 어느 시점에서 나에게 실패하기 시작했을 때. 기본적으로 하위 트리와 파일을 경로 길이로 정렬합니다.

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 마술과 관련하여, 여기에 당신을 때릴 수있는 또 다른 Gotchya가 있습니다. https://superuser.com/q/212808

정말 간단 :

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

또 다른 유용한 트릭 :

동일하거나 유사한 이름 규칙을 가진 많은 파일 (DOT Prefix 이름이있는 Mac 파일 ... 유명한 파일 풀이)을 찾으면 PowerShell에서 한 줄로 쉽게 제거 할 수 있습니다.

ls -r .* | rm

이 줄은 현재 디렉토리 내부의 이름을 시작할 때 점에서 점이있는 모든 파일 과이 디렉토리 내부의 다른 폴더 내부에 동일한 상황을 가진 모든 파일을 제거합니다. 그것을 사용할 때 그것에 대해 알고 있어야합니다. :디

전체 폴더 트리를 삭제하면 때때로 작동하며 때로는 "Directory Not Not Not"오류로 실패합니다. 그 후 폴더가 여전히 존재하는지 확인하려고하면 "액세스 거부"또는 "승인되지 않은 액세스"오류가 발생할 수 있습니다. 나는 왜 이런 일이 일어나는지 모르겠지만, 약간의 통찰력이 얻을 수 있습니다. 이 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

Microsoft Technet 기사 계산 된 특성 사용 PowerShell에서는 깊이로 분류 된 하위 폴더 목록을 얻는 데 도움이되었습니다.

유사한 신뢰성 문제 RD /S /Q 달리기를 통해 해결할 수 있습니다 RD /S /Q 두 번 - 이상적으로는 (즉, 사용 아래 그림과 같이).

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

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

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

그만큼 -recurse 추가 remove-item 대화식 프롬프트가 비활성화되도록합니다.

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

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

상위 디렉토리를 삭제하지 않고 일부 로그 파일을 청소하기 위해 위의 내용을 작성했으며 이것은 완벽하게 작동합니다!

rm -r <folder_name>
c:\>rm -r "my photos"
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top