배치가 있지만 폴더가없는 경우에만 폴더를 만듭니다.


440

아무도 Windows 배치 스크립트에서 다음을 수행하는 방법을 말해 줄 수 있습니까? ( *.bat) :

  • 폴더가없는 경우에만 폴더를 만듭니다.

더 자세하게 VTSC:\드라이브에 이름이 지정된 폴더를 만들고 싶지만 해당 폴더가없는 경우에만 해당합니다. 폴더가 이미 있고 배치가 실행되는 경우 폴더의 내용을 덮어 쓰고 싶지 않습니다.


2
이건 어때요 ? if not exist "%Folder%" mkdir "%New-Folder%"
scientist_7

답변:


622

당신은 이것을 사용합니다 : if not exist "C:\VTS\" mkdir C:\VTS폴더가 존재하지 않는 경우에만 디렉토리를 생성합니다.

이 존재 테스트는 VTS가 존재하고 디렉토리 인 경우에만 true를 리턴합니다. 존재하지 않거나 파일로 존재하면 mkdir 명령이 실행되어 오류가 발생합니다. VTS가 파일로 존재하는지 확인하고 싶을 수도 있습니다.


7
그게 틀렸어. NUL 장치를 확인해야합니다. 그렇지 않으면 작동하지 않습니다. 이보다 3 년 일찍 내 대답을보십시오.
Martin Schapendonk

@MartinSchapendonk 이것은 테스트에서 알 수있는 한 Windows 7 및 Windows Server 2012에서 작동하며 XP에서 Windows 10까지 다시 작동하지 않으면 매우 놀랍습니다. 이 작동하지 않습니다?
jpmc26

12
NUL에 대한 @ jpmc26 테스트는 디렉토리를 테스트하는 것입니다. 그렇지 않으면 조건이 일반 파일 인 경우에도 조건이 true로 평가 될 수 있습니다. 그 차이입니다.
Martin Schapendonk

3
@MartinSchapendonk 그 뒤에 슬래시를 추가하는 것으로 충분합니까? 파일과 디렉토리를 올바르게 구별하는 것처럼 보이지만 파일이 감지되지 않으면 디렉토리 작성에 실패한다는 약점이 있습니다. NUL이것도 테스트에 문제가 있다고 생각합니다 .
jpmc26

6
@ jpmc26 맞습니다. 슬래시가 작업을 수행하며 따옴표로 작업하기 때문에 실제로 선호됩니다 (따라서 디렉토리 경로에 공백이있을 수 있음). 파일 / 디렉토리를 구별하기 위해 다음과 같이 작동 if exist "a" if not exist "a\" (echo "it's a file") else (echo "it's a dir")합니다. 마지막 문장에 대해서는 다른 곳의 배치 파일에 문제가 있다고 생각합니다.
Marc.2377

221
if exist C:\VTS\NUL echo "Folder already exists"

if not exist C:\VTS\NUL echo "Folder does not exist"

참조 https://support.microsoft.com/en-us/kb/65994

(2018 년 3 월 7 일 업데이트; Microsoft 기사가 다운되었습니다 ( https://web.archive.org/web/20150609092521/https://support.microsoft.com/en-us/kb/65994에 보관 )


12
개인적으로 dir이 이미 존재할 때 % errorlevel %를 설정하지 않기 때문에 이것을 선호합니다 (Agent_9191의 답변이 오류 코드 1을 반환 함)
csauve

1
또한 훌륭하고 일반적이며 조건부로 수행하려는 다른 모든 작업에 적용될 수 있습니다. :)
John Humphreys-w00te

3
@YouHaveaBigEgo는 NUL하나 L. 함께
마틴 Schapendonk

1
링크가 더 이상 작동하지 않지만 인터넷 아카이브에 사본이 있습니다
fernio

3
실제로이 답변은 훌륭하지만 "디렉토리 만들기"라는 질문에 대한 답변은 아닙니다. :)
Jean-Francois T.

55

mkdir C:\VTS뭐든간에 전화하십시오 . 하위 디렉토리가 이미 존재한다고보고합니다.

편집 : 다른 사람들이 지적했듯이 폴더가 이미 존재하면 % ERRORLEVEL %을 설정합니다. 배치 (또는 호출하는 프로세스)가 오류 수준을 신경 쓰지 않으면이 방법이 효과적입니다. 질문은 오류 수준을 피하는 것에 대해 언급하지 않았 으므로이 대답은 완벽하게 유효합니다. 폴더가 존재하지 않으면 폴더를 만들 필요가 있으며 기존 폴더의 내용을 덮어 쓰지 않습니다. 그렇지 않으면 Martin Schapendonk의 답변을 따르십시오 .


20
예기치 않은 오류 메시지 / 경고로 인해 잘못된 동작입니다.
SeriousM

11
모범 사례를 위반할 때 "완벽하게 유효한"것을 호출하는 것은 지적 부정직합니다. 또 다른 예 : 누군가 특정 보안 문제를 피하는 방법을 물을 때 질문에 최소 보안 영향을 전제 조건으로 명시 적으로 지정하지 않은 경우에도 "컴퓨터를 관리자로 실행"해서는 안됩니다. :-)
Jouni Heikniemi 2016 년

2
@JouniHeikniemi s / 모범 사례 / Jouni의 개인 취향
dss539

4
Errorlevel 또는 errno에 문제가 없습니다. 이들은 플랫폼 별 오류 메시징 패러다임이며, 원래의 목적에 맞게 작동합니다. 그러나 플랫폼 또는 메시징 접근 방식이 무엇이든, 일반적인 오류 사례를 쉽게 피할 수 있고 쉽게 문서화 할 수있을 때 "이 작업을 수행하고 실패하면 복구"패턴을 사용하지 않는 것이 좋습니다. 따라서 "존재하지 않는 경우"스타일 접근 방식이 더 우수하다는 것을 알았습니다. 그러나 모범 사례의 형성에 대한 토론에 너무 깊이 들어가고 싶지는 않습니다. 나는 누군가의 기분을 상하게 할 의도가 없었고, 단지 나의 downvote를 명확히하고 싶었다.
Jouni Heikniemi

4
단순히 오류를 무시하는 문제는 오류가 발생한 이유를 모른다는 것입니다. 디렉토리가 이미 존재하거나, 사용자에게 해당 디렉토리에 대한 권한이 없거나, 상위 경로가 존재하지 않거나, 디스크에 장애가 발생하여 실패했을 수 있습니다. "존재하지 않으면 작성"이 첫 번째를 제외한 모든 경우에 실패해야합니다. 그러나이 답변은 모든 경우에 오류가 발생합니다. 이것이 배치 스크립트에 적합하지 않은 이유입니다. -1
jpmc26

38
mkdir C:\VTS 2> NUL

이라는 폴더를 만들고에 VTS출력 A subdirectory or file TEST already exists합니다 NUL.

또는

(C:&(mkdir "C:\VTS" 2> NUL))&

드라이브 문자를 C:,, mkdir출력 오류로 변경하고 NUL다음 명령을 실행하십시오.


PowerShell 에서이 작업을 수행 할 수있는 방법이 있습니까? NUL출력 파일 로 지원하지 않는 것 같습니다 .
Aaron Franke

30
set myDIR=LOG
IF not exist %myDIR% (mkdir %myDIR%)

1
다른 사람들이 지적하고 최고 등급의 답변에서 보았을 수도 있지만라는 파일이 있으면 작동하지 않습니다 log. 미묘한 차이이지만 스크립트에서 찾기 어려운 버그로 이어질 것입니다.
Abel

20

이 방법을 사용 하면 디렉토리 이름 끝에 백 슬래시를 넣어서 지정한 디렉토리와 이름이 같은 확장자가없는 파일에 파일이 존재하지 않도록해야합니다. "C : \ VTS" 는 파일을 사용할 수 있으므로 "C :" 파티션에 저장된 "VTS" 라는 이름으로 존재 하는 올바른 방법은 "C : \ VTS \" 를 사용 하고 VTS 뒤의 백 슬래시를 확인하는 것이므로 올바른 방법입니다.

@echo off
@break off
@title Create folder with batch but only if it doesn't already exist - D3F4ULT
@color 0a
@cls

setlocal EnableDelayedExpansion

if not exist "C:\VTS\" (
  mkdir "C:\VTS\"
  if "!errorlevel!" EQU "0" (
    echo Folder created successfully
  ) else (
    echo Error while creating folder
  )
) else (
  echo Folder already exists
)

pause
exit

3
특히 솔루션의 흥미로운 점은 !errorlevel!지연된 확장 을 사용한다는 것 입니다. 그렇지 않으면 변수 ERRORLEVEL는 첫 번째 변수 를 입력하기 전에 if(즉, 구문 분석 시간에) 구문 분석됩니다. 이제 실행 시간에 구문 분석되므로의 결과를 캡처 할 수 있습니다 mkdir. 존재 여부를 테스트하더라도 성공을 테스트해야합니다 (예 : 액세스 거부 오류 등). 다른 것에 비해 매우 좋은 솔루션, +10 !!!
Abel

17

당신이 사용할 수있는:

if not exist "C:\VTS\" mkdir "C:\VTS"

누락 된 예상 파일을 대체하도록 코드를 확장 할 수도 있습니다.

if not exist "C:\VTS\important.file" echo. > "C:\VTS\important.file"

0

나는 eyebeam 작업에서 사용하는 스크립트를 위해 이것을 만들었습니다.

:CREATES A CHECK VARIABLE

set lookup=0

:CHECKS IF THE FOLDER ALREADY EXIST"

IF EXIST "%UserProfile%\AppData\Local\CounterPath\RegNow Enhanced\default_user\" (set lookup=1)

:IF CHECK is still 0 which means does not exist. It creates the folder

IF %lookup%==0 START "" mkdir "%UserProfile%\AppData\Local\CounterPath\RegNow Enhanced\default_user\"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.