배치 스크립트에서 rmdir 명령을 실행할 때 "디렉토리가 비어 있지 않습니다"오류를 해결하는 방법은 무엇입니까?


92

배치 스크립트를 만들고 있으며 스크립트의 일부가 디렉토리와 모든 하위 디렉토리를 제거하려고합니다. 비어 있지 않은 하위 디렉토리에 대한 간헐적 인 오류가 발생합니다. 색인 생성이 범인이라는 기사를 읽었습니다. WSearch를 비활성화했지만 결국 다시 오류가 발생했습니다. 다음은 명령입니다.

rmdir /S /Q "C:\<dir>\"

Windows에서 경고하는 파일 유형에 대한 정보를 물어볼 수 있습니까? 나에게 이것은 PDF 파일을 이동 / 복사 한 직후에만 발생합니다.
Jake Stevens-Haas

답변:


88

나는 Harry Johnston이 언급 한 것과 동일한 문제를 경험했습니다. 당신을 위해 비우기 위해 의도 rmdir /s /q되었지만 디렉토리가 비어 있지 않다고 불평 /s합니다! 개인적으로 Windows의 버그라고 생각합니다.

내 해결 방법은 del디렉토리 자체를 삭제하기 전에 디렉토리의 모든 것입니다.

del /f /s /q mydir 1>nul
rmdir /s /q mydir

( 그렇지 않으면 삭제하는 모든 단일 파일을 나열하기 때문에 1>nul의 표준 출력을 숨 깁니다 del.)


일부 하위 디렉터리에서 mydir동일한 "비어 있지 않음"오류가 발생 하는 시나리오가 발생했습니다. 나는에 있었다 그래서 cd으로 mydir하고 수행 del하는 각 디렉토리뿐만 아니라의 파일에. 궁극적으로 효과가 있었지만 다른 하위 수준에서이 과정을 세 번 반복해야했다면 꽤 패배했다고 느꼈을 것입니다.
gfullam

@gfullam 내가 기억하는 한, 내 방법은 모든 깊이에 대해 재귀 하위 디렉토리에서도 작동해야합니다. 그게 무슨 일이야 del /s.
BoffinBrain

탐색기 (아마도 mkdir => NO!)를 사용하여 폴더를 추가 (및 이름 변경)하여 rd /s /q mydir명령 만 사용하여 제거 작업을 완료합니다 .
Master DJon 2019

1
좋아, 창을 삭제하고 Linux로 이동하는
것이이

1
@RajnishCoder Windows와 함께 사는 것은 기본적으로 해결 방법의 세계입니다. 이 특정 문제는 Windows 10의 다른 문제와 비교할 때 아무것도 아닙니다!
BoffinBrain 2019

47

이 문제에 대해 잘 알고 있습니다. 가장 간단한 해결 방법은 작업을 조건부로 반복하는 것입니다. 나는 그것이 실제로 열린 파일이나 권한 문제가 아니라면 두 번 연속으로 실패하는 것을 본 적이 없습니다!

rd /s /q c:\deleteme
if exist c:\deleteme rd /s /q c:\deleteme

11
이런 몰리, 이건 말도 안 돼 아직 효과가 있었어 무슨 #! % # @! microsoft
Sam B

IF EXIST가죽 Access is denied및 기타 상황. 나는 DIR c:\deleteme모든 것보다 먼저 검사하는 것과 같은 것을 추가했습니다 .
it3xl

하위 디렉토리에서 Windows 탐색기를 열거 나 다른 방법으로 찾아 보면 연속으로 두 번 실패합니다. 그러니 세 번째로 물어보세요 (실제로 효과가
Jake Stevens-Haas

사실이 있다 아무것도 열거 나 권한 문제없이 나에게 두 번 연속 발생했습니다. 내 기록은 일곱 번입니다. @BoffinbraiN의 접근 방식을 권장합니다.
Jake Stevens-Haas

첫 번째 명령 만 실행했습니다. 그런 다음 폴더를 마우스 오른쪽 버튼으로 클릭> 속성> '읽기 전용'속성 선택 취소> 적용. Viola !, 폴더가 마침내 사라졌습니다.
steven7mwesigwa

21

방금 동일한 문제가 발생했으며 일부 파일이 손실되거나 손상되었습니다. 문제를 해결하려면 디스크 검사를 실행하십시오.

chkdsk /F e:

검색 창 상자 또는 cmd 프롬프트에서 실행할 수 있습니다. 는 /F이 파일을 복구처럼 찾아 문제를 해결합니다. 이 실행이 완료되면 평소처럼 파일과 폴더를 삭제할 수 있습니다.


완벽한, 나는 반 시간 이후 시도하고 있었다
TREX

이것은 내 폴더에서 숨겨진 파일을 발견하여 삭제할 수있었습니다. 정말 불쾌한 😑
이길


7

비슷한 문제가 발생하여 Windows 탐색기를 통해 빈 폴더를 삭제하려고했습니다. 비어 있지 않은 오류를 표시했기 때문에 admin cmd를 통해 시도했지만 여기에 대한 답변이 도움이되지 않았습니다.

파일을 빈 폴더로 옮긴 후. 비어 있지 않은 폴더를 삭제할 수있었습니다


1
댓글로 작성 해주세요.
Virb

흥미 롭군. 하지만 OP 시나리오와는 관련이 없을 것입니다.
Harry Johnston

이런, 이것은 말 그대로 다른 모든 솔루션에서 효과가 있었던 유일한 생각이었습니다!
Seega

3

@gfullam이 @BoffinbraiN의 답변에 대한 주석에서 언급했듯이 <dir>삭제중인 파일이 파일을 포함하는 파일이 아닐 수 있습니다 <dir>. "디렉토리가 비어 있지 않습니다."라는 메시지를받는 하위 디렉토리가있을 수 있으며 유일한 해결책은 다음과 같습니다. 디렉토리를 재귀 적으로 반복하고 포함 된 모든 파일을 수동으로 삭제합니다. 결국 rmUNIX 의 포트를 사용하기로 결정했습니다 . rm.exeGit Bash, MinGW, Cygwin, GnuWin32 등이 함께 제공됩니다. PATH에 상위 디렉토리가 있고 UNIX 시스템에서와 같이 실행하기 만하면됩니다.

배치 스크립트 예 :

set PATH=C:\cygwin64\bin;%PATH%
rm -rf "C:\<dir>"

2

나를 위해 일한 것은 다음과 같습니다. RMDir 명령이 거의 항상 "디렉토리가 비어 있지 않습니다"를 실행하는 것처럼 보입니다.

:Cleanup_Temporary_Files_and_Folders

Erase /F /S /Q C:\MyDir

RMDir /S /Q C:\MyDir
If  Exist  C:\MyDir  GoTo Cleanup_Temporary_Files_and_Folders

2

"C : \ Users \ User Name \ OneDrive \ Fonts"가 있는데, "C : \ Windows \ Fonts"에 mklink (/ D)되어 있고 동일한 문제가 발생했습니다. 나의 경우에는

cd "C : \ Users \ 사용자 이름 \ OneDrive"

rd / s 글꼴

Y (동작 확인)

나를 도와 주었다. 나는 그것이 당신에게도 도움이되기를 바랍니다; D


2
일괄 처리를 실행할 때 확인이 필요하지 않도록 / q를 추가합니다.
Jonathan Rosenne 19 년

1

내 경우에는 폴더를 루트 디렉토리로 옮겼습니다.

move <source directory> c:\

그런 다음 명령을 실행하여 디렉토리를 제거하십시오.

rmdir c:\<moved directory> /s /q

2
rmdir c:\<moved directory> /s /q정답
lalengua

1
정답이 아닙니다. 루트에서 폴더를 삭제하면 동일한 메시지가 표시 될 수 있습니다. 폴더가 비어 있지 않습니다.
Gangnus

나는 이것이 오래된 스레드라는 것을 알고 있습니다. 그냥 ...이 나를 위해 일한 말하고 싶었다
마누엘 리베라에게

1

rd /s특정 파일 삭제를 거부하는 이유 는 디렉토리에있는 파일의 READONLY 파일 속성 때문일 가능성이 큽니다.

이 문제를 해결하는 올바른 방법은 먼저 모든 파일의 속성을 재설정하는 것입니다.

attrib -r %directory% /s /d
rd /s %directory%

숨겨진 파일이나 시스템 파일과 같은 다른 파일이있을 수 있으므로 안전하게 재생하려면 :

attrib -h -r -s %directory% /s /d
rd /s %directory%

0

Harry Johnston의 답변과 유사하게 작동 할 때까지 반복합니다.

set dirPath=C:\temp\mytest
:removedir
if exist "%dirPath%" (
    rd /s /q "%dirPath%" 
    goto removedir
)

0

Windows는 때때로 "설계에 의해 손상"되므로 빈 폴더를 만든 다음 "빈 폴더"를 백업 모드로 미러링하여 "깨진 폴더"를 미러링해야합니다.

robocopy - cmd copy utility

/copyall - copies everything
/mir deletes item if there is no such item in source a.k.a mirrors source with
destination
/b works around premissions shenanigans

다음과 같이 빈 디렉토리를 만듭니다.

mkdir empty

다음과 같이 빈 폴더로 깨진 폴더를 덮어 씁니다.

robocopy /copyall /mir /b empty broken

그런 다음 해당 폴더를 삭제하십시오.

rd broken /s
rd empty /s

그래도 도움이되지 않으면 다시 시작을 클릭 할 때 Shift 키를 누른 상태에서 복구 모드에서이 명령을 다시 실행하여 "명령 프롬프트가있는 복구 모드"에서 다시 시작해보십시오.


예, Robocopy는 실패한 작업을 자동으로 재 시도하기 때문에 OP 시나리오에서 작동 할 것이라고 생각합니다. /W:0불필요한 지연을 피하기 위해 지정할 수 있습니다. /b관리자 권한이 필요하기 때문에 원하지 않을 수도 있습니다 . 복구 모드는이 질문과 관련이 없습니다. 우리는 디렉토리를 수동으로 제거하려는 사람이 아니라 배치 스크립트에 대해 이야기하고 있기 때문입니다.
Harry Johnston

-1

가능한 원인은 다음과 같습니다.

  1. 더 높은 권한이 필요한 파일 또는 하위 디렉토리가 있습니다.
  2. WSearch뿐만 아니라 바이러스 스캐너 또는 기타 다른 파일이 사용중인 파일이 있습니다.

1.)의 runas /user:Administrator경우 더 높은 권한을 얻거나 상황에 맞는 메뉴를 통해 관리자로 배치 파일을 시작하기 위해 시도 할 수 있습니다 . 그래도 도움이되지 않으면 관리자도 권한이 없을 수 있습니다. 그런 다음 디렉토리의 소유권을 인수해야합니다.

2.) 다운로드 프로세스 탐색기의 경우를 클릭 Find/Find handle or DLL...하거나 누르고 Ctrl+F디렉토리 이름을 입력 한 다음 누가 사용하는지 확인합니다. 가능한 경우 디렉토리를 사용하는 응용 프로그램을 닫습니다.


머신은 관리자 계정이 비활성화되어 있습니다. 관리자 그룹에 속해 있지만 관리자 암호를 모릅니다. 권한 문제를 해결하기위한 다른 제안이 있습니까? 누군가가 배치에서 다른 프로그램 (예 : vba)을 호출한다고 언급했습니다.
Mayhem 2014

@Mayhem : 권한을 우회하는 것은 매우 어렵습니다 ... 암호없이이를 수행하려면 Windows의 버그에 대한 익스플로잇이 필요할 것입니다.
Thomas Weller 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.