PowerShell 2.0으로 전체 디렉토리를 재귀 적으로 삭제하는 방법은 무엇입니까?
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으로 파이프하는 다양한 예제를 보았지만 예제는 일반적으로 전체 디렉토리가 아닌 필터를 기반으로 일부 파일 세트를 제거합니다.
최소한의 코드를 사용하여 사용자 경고 메시지를 생성하지 않고 전체 디렉토리, 파일 및 하위 디렉토리를 제거하는 가장 깨끗한 방법을 찾고 있습니다. 하나의 라이너는 이해하기 쉽다면 좋을 것입니다.
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 마술과 관련하여 다음과 같은 다른 문제가 있습니다. https://superuser.com/q/212808
정말 간단합니다 :
remove-item -path <type in file or directory name>, press Enter
또 다른 유용한 트릭 :
동일하거나 유사한 이름 규칙을 가진 많은 파일을 찾으면 (예 : 접두사 이름이있는 mac 파일 ... 유명한 파일 풀링) 다음과 같이 powershell에서 한 줄로 쉽게 제거 할 수 있습니다.
ls -r .* | rm
이 줄은 현재 디렉토리 내에서 이름의 시작 부분에 점이있는 모든 파일과이 디렉토리 내의 다른 폴더 안에있는 동일한 환경의 모든 파일도 제거합니다. 사용할 때주의하십시오. :디
전체 폴더 트리를 삭제하면 때때로 작동하고 때로는 "비어 있지 않은 디렉토리"오류와 함께 실패합니다. 폴더가 여전히 존재하는지 확인하려고하면 "액세스 거부"또는 "무단 액세스"오류가 발생할 수 있습니다. 이 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는 실행에 의해 해결 될 수 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"
'Programing' 카테고리의 다른 글
Java 8 IntStream을 List로 어떻게 변환합니까? (0) | 2020.03.30 |
---|---|
Lambda / Linq를 사용하여 객체에 대한 목록 정렬 (0) | 2020.03.30 |
jquery를 사용하여 iFrame 상위 페이지에 액세스하는 방법은 무엇입니까? (0) | 2020.03.30 |
if와 foreach에서 벗어나 다 (0) | 2020.03.30 |
SSH 비밀번호를 확인 / 확인 / 테스트 / 확인하는 방법은 무엇입니까? (0) | 2020.03.30 |