foxidrive가 게시 한 단일 명령 줄을 제외 하고 2018-06-01에 게시 된 답변 은 실제로 모든 파일과 모든 폴더 / 디렉토리를 삭제했습니다 %PathToFolder%
. 이것이 매우 간단한 단일 명령 줄로 하나 이상의 답변을 게시하여 폴더의 모든 파일과 하위 폴더를 삭제하고 DEL을 사용하여 2018-06-01에 게시 된 다른 모든 답변을 설명하는 더 복잡한 솔루션이있는 배치 파일을 배치하는 이유입니다 및 FOR 와 RD는 완전히 폴더를 정리하지 못했습니다.
배치 파일로도 사용할 수있는 간단한 단일 명령 줄 솔루션 :
pushd "%PathToFolder%" 2>nul && ( rd /Q /S "%PathToFolder%" 2>nul & popd )
이 명령 행에는 차례로 실행되는 세 개의 명령이 있습니다.
첫 번째 명령 PUSHD 는 스택에서 현재 디렉토리 경로를 푸시 한 다음 %PathToFolder%
명령 프로세스를 실행하기 위해 현재 디렉토리를 만듭니다 .
명령 확장이 기본적으로 활성화되어 있기 때문에 기본적으로 UNC 경로 에서도 작동합니다 .이 경우 PUSHD 는 지정된 네트워크 리소스를 가리키는 임시 드라이브 문자를 만든 다음 새로 정의 된 드라이브 문자를 사용하여 현재 드라이브와 디렉토리를 변경합니다.
지정된 디렉토리가 전혀 존재하지 않는 경우 PUSHD 는 STDERR 을 처리하기 위해 다음 오류 메시지를 출력 합니다.
시스템이 지정된 경로를 찾을 수 없습니다.
이 오류 메시지는 2>nul
장치 NUL 로 리디렉션하여 억제됩니다 .
다음 명령 RD 는 현재 명령 프로세스의 현재 디렉토리를 지정된 디렉토리로 변경 한 경우에만 실행됩니다. 즉, 지정된 디렉토리가 존재합니다.
명령 RD 옵션과 /Q
및 /S
디렉토리를 제거 조용히 모든과 하위 디렉토리 지정된 디렉토리가 숨김 속성을 가진 또는 읽기 전용 속성 세트로 파일이나 폴더가 포함 된 경우에도 마찬가지입니다. 시스템 속성은 파일이나 폴더의 삭제를 막지 않습니다.
삭제되지 않은 부분은 다음과 같습니다.
실행중인 프로세스의 현재 디렉토리로 사용되는 폴더. 폴더가 실행중인 프로세스의 현재 디렉토리로 사용되는 경우 해당 폴더에 대한 전체 폴더 트리를 삭제할 수 없습니다.
실행중인 응용 프로그램 / 프로세스에서 열린 파일을 삭제하지 못하도록 파일 열기 권한이 파일 열기에서 설정된 상태로 실행중인 프로세스가 현재 연 파일 이러한 열린 파일은 열린 파일에 대한 전체 폴더 트리의 삭제도 방지합니다.
현재 사용자가 파일 / 폴더를 삭제하는 데 필요한 (NTFS) 권한이없는 파일 / 폴더는이 파일 / 폴더에 대한 폴더 트리의 삭제도 방지합니다.
폴더를 삭제하지 않는 첫 번째 이유는이 명령 행에서 폴더 자체가 아닌 지정된 폴더의 모든 파일 및 하위 폴더를 삭제하는 데 사용됩니다. 폴더는 명령 프로세스를 실행하기 위해 현재 디렉토리로 일시적으로 만들어 져서 폴더 자체의 삭제를 방지합니다. 물론 이것은 명령 RD에 의해 오류 메시지를 출력합니다 .
프로세스가 다른 프로세스에서 파일을 사용 중이므로 파일에 액세스 할 수 없습니다.
실제로 폴더는 다른 프로세스, 명령 RD 를 실행 한 현재 명령 프로세스에서 사용하고 있으므로 파일 은 잘못된 용어 입니다. 실제로, 폴더는 파일 시스템의 파일 속성 디렉토리 가 있는 특수 파일 이며이 오류 메시지를 설명합니다. 그러나 파일 시스템 관리에 너무 깊이 들어가고 싶지 않습니다.
위에서 언급 한 세 가지 이유로 인해 발생할 수있는 다른 모든 오류 메시지와 같이이 오류 메시지 2>nul
는 핸들 STDERR 에서 디바이스 NUL 로 경로 재지 정하여 억제됩니다 .
세 번째 명령 인 POPD 는 명령 RD 의 종료 값과 독립적으로 실행 됩니다.
POPD 는 스택에서 PUSHD에 의해 푸시 된 디렉토리 경로를 팝하고 명령 프로세스를 실행하기 위해 현재 디렉토리를이 디렉토리로 변경합니다. 즉, 초기 현재 디렉토리를 복원합니다. POPD 는 UNC 폴더 경로의 경우 PUSHD 에 의해 생성 된 임시 드라이브 문자를 삭제합니다 .
참고 : 초기 현재 디렉토리가 더 이상 존재하지 않는 정리할 디렉토리의 하위 디렉토리 인 경우 POPD 가 초기 현재 디렉토리를 자동으로 복원하지 못할 수 있습니다. 이 특별한 경우 %PathToFolder%
현재 디렉토리로 남아 있습니다. 따라서 하위 디렉토리가 아닌 위의 명령 줄을 실행하는 것이 좋습니다 %PathToFolder%
.
한 가지 더 흥미로운 사실 :C:\Temp
공유 이름으로
로컬 디렉토리 를 공유 Temp
하고 Windows 7 \\%COMPUTERNAME%\Temp\CleanTest
에서 환경 변수 PathToFolder
에 할당 된 UNC 경로를 사용하여 UNC 경로를 사용하여 명령 줄을 시도했습니다. 명령 줄 을 실행하는 현재 디렉토리가 공유 로컬의 하위 디렉토리 인 경우 즉, UNC 경로를 사용하여 액세스 폴더 C:\Temp\CleanTest\Subfolder1
, Subfolder1
삭제되는 RD , 옆 POPD는 제작에 자동으로 실패 C:\Temp\CleanTest\Subfolder1
를 다시 결과 현재 디렉토리에 Z:\CleanTest
실행 명령 프로세스의 현재 디렉토리로 남아있다. 매우 특별한 경우에 임시 드라이브 문자는 현재 디렉토리가 다음과 같이 변경 될 때까지 남아 있습니다.cd /D %SystemRoot%
실제로 존재하는 로컬 디렉토리에. 불행히도 POPD는초기 현재 디렉토리를 복원하지 못하면 0보다 큰 값으로 종료하지 않고 POPD 의 종료 코드 만 사용하여이 특별한 오류 조건을 감지 할 수 없습니다 . 그러나 UNC 경로는 일반적으로 로컬 파일 및 폴더에 액세스하는 데 사용되지 않으므로이 특별한 오류가 발생하는 사람은 없다고 가정 할 수 있습니다.
사용 된 명령을 더 잘 이해하려면 명령 프롬프트 창을 열고 다음 명령을 실행 한 다음 각 명령에 대해 표시된 도움말을주의해서 읽으십시오.
Windows 배치 파일을 사용하여 여러 명령을 단일 라인 연산자 설명 &&
과 &
여기에 사용합니다.
다음으로 DEL 명령을 사용하여 파일을 삭제 %PathToFolder%
하고 FOR 및 RD 를 사용하여 하위 폴더를 삭제하는 배치 파일 솔루션을 살펴 보겠습니다 %PathToFolder%
.
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Clean the folder for temporary files if environment variable
rem PathToFolder is not defined already outside this batch file.
if not defined PathToFolder set "PathToFolder=%TEMP%"
rem Remove all double quotes from folder path.
set "PathToFolder=%PathToFolder:"=%"
rem Consisted the folder path only of double quotes?
if not defined PathToFolder goto EndCleanFolder
rem Remove a backslash at end of folder path.
if "%PathToFolder:~-1%" == "\" set "PathToFolder=%PathToFolder:~0,-1%"
rem Consisted folder path only of a backslash (with one or more double quotes)?
if not defined PathToFolder goto EndCleanFolder
rem Delete all files in specified folder including files with hidden
rem or read-only attribute set, except the files currently opened by
rem a running process which prevents deletion of the file while being
rem opened by the application, or on which the current user has not
rem the required permissions to delete the file.
del /A /F /Q "%PathToFolder%\*" >nul 2>nul
rem Delete all subfolders in specified folder including those with hidden
rem attribute set recursive with all files and subfolders, except folders
rem being the current directory of any running process which prevents the
rem deletion of the folder and all folders above, folders containing a file
rem opened by the application which prevents deletion of the file and the
rem entire folder structure to this file, or on which the current user has
rem not the required permissions to delete a folder or file in folder tree
rem to delete.
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul
:EndCleanFolder
endlocal
배치 파일은 먼저 환경 변수 PathToFolder
가 큰 따옴표없이 백 슬래시없이 폴더 경로로 실제로 정의되도록합니다. 끝에있는 백 슬래시는 문제가되지 않지만 PathToFolder
배치 파일 실행 중 값이 다른 문자열과 연결되어 있기 때문에 폴더 경로의 큰 따옴표는 문제가 될 수 있습니다 .
두 줄이 중요합니다.
del /A /F /Q "%PathToFolder%\*" >nul 2>nul
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul
DEL 명령 은 지정된 디렉토리의 모든 파일을 삭제하는 데 사용됩니다.
- 옵션
/A
은 옵션 을 사용하지 않고 DEL 이 무시할 숨겨진 속성을 가진 파일을 포함하여 실제로 모든 파일을 처리하는 데 필요합니다 /A
.
/F
읽기 전용 속성이 설정된 파일을 강제로 삭제하려면 이 옵션 이 필요합니다.
/Q
여러 파일을 실제로 삭제해야 할 경우 사용자에게 알리지 않고 여러 파일을 자동으로 삭제하려면 이 옵션 이 필요합니다.
>nul
STDOUT 을 처리하기 위해 작성된 파일 이름의 출력을 파일이 현재 열려 있거나 사용자가 파일을 삭제할 권한이 없기 때문에 삭제할 수없는 장치 NUL 로 장치 를 리디렉션하는 데 필요 합니다.
2>nul
STDERR 핸들에서 삭제할 수없는 각 파일에 대한 오류 메시지 출력 을 디바이스 NUL 로 리디렉션하는 데 필요합니다 .
FOR 및 RD 명령 은 지정된 디렉토리에서 모든 서브 디렉토리를 제거하는 데 사용됩니다. 그러나 FOR의 경우 숨겨진 속성이 설정된 하위 디렉토리를 무시 for /D
하기 때문에 사용되지 않습니다 . 이러한 이유로 백그라운드에서 시작된 별도의 명령 프로세스에서 다음 명령 행을 실행하는 데 사용됩니다 .for /F
%ComSpec% /c
dir "%PathToFolder%\*" /AD /B 2>nul
DIR/B
은 속성 이 있는 디렉토리 항목 D
, 즉 경로가없는 숨겨진 속성과 같은 다른 속성에 독립적으로 지정된 디렉토리의 모든 하위 디렉토리 이름 으로 인해 베어 형식으로 출력됩니다 . STDERR 핸들에서 발견 된 디렉토리가없는 디렉토리에서 DIR 에 2>nul
의해 오류 메시지 출력 을 디바이스 NUL 로 재지 정하는 데 사용됩니다 .
리디렉션 연산자 >
캐럿 문자로 이스케이프해야합니다, ^
상의, 대한의 명령 줄 Windows 명령 인터프리터가 명령을 실행하기 전에이 명령 줄을 처리하는 리터럴 문자로 해석 될 FOR 하는 임베디드 실행한다 dir
별도의 명령 과정에서 명령 줄 시작 백그라운드에서.
FOR 는 경로가없는 서브 디렉토리의 이름이며 큰 따옴표로 묶지 않은 시작된 명령 프로세스의 STDOUT 을 처리하기 위해 작성된 캡처 된 출력을 처리 합니다.
옵션이 /F
있는 FOR 는 옵션 이없는 DIR 이 /B
빈 줄을 출력 하지 않기 때문에 여기서 발생하지 않는 빈 줄을 무시합니다 .
또한 FOR 는 기본 줄 끝 문자 인 세미콜론으로 시작하는 줄을 무시합니다. 디렉토리 이름은 세미콜론으로 시작할 수 있습니다. 이러한 이유로 eol=|
수직 막대 문자를 디렉토리 또는 파일 이름으로 가질 수없는 행 끝 문자로 정의하는 데 사용됩니다.
FOR 는 공백과 가로 탭을 구분 기호로 사용하여 행을 하위 문자열로 분할하고 지정된 루프 변수에 첫 번째 공백 / 탭 구분 문자열 만 할당합니다 I
. 디렉토리 이름으로 인해 하나 이상의 공백이 포함될 수 있으므로이 분할 동작은 원하지 않습니다. 따라서 delims=
행 분리 동작을 사용하지 않고 I
항상 완전한 디렉토리 이름 인 루프 변수에 지정되도록 빈 분리 문자 목록을 정의하는 데 사용됩니다 .
명령 에 대한 명령 실행 RD 온 이유입니다 경로없이 각 디렉토리 이름을 RD의 하위 폴더 이름으로 연결됩니다 명령 줄 폴더 경로를 다시 한 번 지정해야합니다.
사용 된 명령과 작동 방식을 이해하려면 명령 프롬프트 창을 열고 다음 명령을 실행 한 다음 각 명령에 대해 표시된 모든 도움말 페이지를주의 깊게 읽으십시오.
del /?
dir /?
echo /?
endlocal /?
for /?
goto /?
if /?
rd /?
rem /?
set /?
setlocal /?