สร้างโฟลเดอร์ด้วยแบทช์ แต่ถ้ายังไม่มีอยู่


440

ใครช่วยบอกวิธีการดังต่อไปนี้ในสคริปต์ชุดงาน Windows ( *.bat):

  • สร้างโฟลเดอร์เฉพาะหากยังไม่มีอยู่

ในรายละเอียดเพิ่มเติมฉันต้องการสร้างโฟลเดอร์ที่มีชื่อVTSในC:\ไดรฟ์ แต่ถ้าไม่มีโฟลเดอร์นั้นอยู่แล้ว ฉันไม่ต้องการเขียนทับเนื้อหาของโฟลเดอร์หากมีอยู่แล้วและดำเนินการแบทช์


2
แล้วเรื่องนี้ล่ะ? if not exist "%Folder%" mkdir "%New-Folder%"
scientist_7

คำตอบ:


622

คุณเพียงแค่ใช้สิ่งนี้if not exist "C:\VTS\" mkdir C:\VTSมันจะสร้างไดเรกทอรีเฉพาะในกรณีที่ไม่มีโฟลเดอร์อยู่

โปรดทราบว่าการทดสอบการมีอยู่นี้จะส่งคืนจริงถ้า VTS มีอยู่และเป็นไดเรกทอรี หากไม่มีอยู่หรือมีเป็นไฟล์คำสั่ง mkdir จะทำงานและควรทำให้เกิดข้อผิดพลาด คุณอาจต้องการตรวจสอบว่ามี VTS เป็นไฟล์ด้วยหรือไม่


7
ยกเว้นว่ามันผิด คุณต้องตรวจสอบอุปกรณ์ NUL มิฉะนั้นจะไม่ทำงาน ดูคำตอบของฉันเมื่อสามปีก่อนหน้านี้
Martin Schapendonk

@MartinSchapendonk สิ่งนี้ใช้ได้กับ Windows 7 และ Windows Server 2012 เท่าที่ฉันสามารถบอกได้จากการทดสอบและฉันประหลาดใจมากถ้ามันไม่ทำงานอย่างน้อยกลับไปเป็น XP และ Windows 10 คุณสามารถระบุเงื่อนไขเมื่อ มันใช้ไม่ได้เหรอ
jpmc26

12
การทดสอบ @ jpmc26 สำหรับ NUL คือการทำให้แน่ใจว่าคุณทดสอบไดเรกทอรี มิฉะนั้นเงื่อนไขอาจประเมินเป็นจริงแม้ว่าจะเป็นไฟล์ปกติ นั่นคือความแตกต่าง
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

(อัปเดต 7 มีนาคม 2018 บทความ Microsoft หยุดทำงานเก็บถาวรในhttps://web.archive.org/web/20150609092521/https://support.microsoft.com/en-us/kb/65994 )


12
ส่วนตัวฉันชอบสิ่งนี้เพราะมันไม่ได้ตั้ง% errorlevel%% เมื่อ dir มีอยู่แล้ว (คำตอบของ Agent_9191 ส่งคืนรหัสข้อผิดพลาดที่ 1)
csauve

1
นอกจากนี้ยังเป็นเรื่องที่ดีและทั่วไปและสามารถนำไปใช้กับการกระทำอื่น ๆ ที่คุณต้องการทำตามเงื่อนไข :)
John Humphreys - w00te

3
@YouHaveaBigEgo NULอยู่กับหนึ่ง L.
Martin Schapendonk

1
ลิงก์ใช้งานไม่ได้อีกต่อไป แต่มีสำเนาอยู่ที่ Internet Archive
fernio

3
จริงๆแล้วถึงแม้ว่าคำตอบนี้ยอดเยี่ยม แต่ก็ไม่ได้ตอบคำถามที่ว่า "สร้างไดเรกทอรี" :)
Jean-Francois T.

55

เพียงแค่โทรหาmkdir C:\VTSไม่ว่าอะไรจะเกิดขึ้น มันจะรายงานว่าไดเรกทอรีย่อยนั้นมีอยู่แล้ว

แก้ไข:ตามที่คนอื่น ๆ ระบุไว้นี่เป็นการตั้งค่า% ERRORLEVEL% หากโฟลเดอร์นั้นมีอยู่แล้ว หากแบทช์ของคุณ (หรือกระบวนการใด ๆ เรียกมันว่า) ไม่สนใจระดับข้อผิดพลาดวิธีนี้จะทำงานได้ดี เนื่องจากคำถามไม่ได้กล่าวถึงการหลีกเลี่ยงระดับข้อผิดพลาดคำตอบนี้จึงสมบูรณ์ มันตอบสนองความต้องการในการสร้างโฟลเดอร์หากไม่มีอยู่และจะไม่เขียนทับเนื้อหาของโฟลเดอร์ที่มีอยู่ มิฉะนั้นทำตามคำตอบมาร์ติน Schapendonk ของ


20
นี่เป็นพฤติกรรมที่ไม่ดีเนื่องจากมีข้อความ / คำเตือนที่ไม่คาดคิดเกิดขึ้น
SeriousM

11
การเรียกบางสิ่งบางอย่าง "ถูกต้องสมบูรณ์" เมื่อละเมิดแนวทางปฏิบัติที่ดีที่สุดนั้นไม่สุจริตทางสติปัญญา เป็นอีกตัวอย่างหนึ่ง: เมื่อมีคนถามคุณถึงวิธีหลีกเลี่ยงปัญหาความปลอดภัยที่เฉพาะเจาะจงคำตอบของคุณไม่ควร "เรียกใช้คอมพิวเตอร์ในฐานะผู้ดูแลระบบ" แม้ว่าคำถามนั้นจะไม่ได้ระบุถึงผลกระทบด้านความปลอดภัยขั้นต่ำอย่างชัดเจน :-)
Jouni Heikniemi

2
@JouniHeikniemi s / best practice / การตั้งค่าส่วนตัวของ Jouni
dss539

4
ไม่มีอะไรผิดพลาดกับ Errorlevel หรือ errno พวกเขาเป็นกระบวนทัศน์การส่งข้อความข้อผิดพลาดเฉพาะแพลตฟอร์มและพวกเขาทำงานเพื่อวัตถุประสงค์ที่พวกเขาได้รับการสร้างขึ้น แต่ไม่ว่าแพลตฟอร์มหรือวิธีการส่งข้อความคืออะไรฉันจะไม่แนะนำรูปแบบ "ลองทำและกู้คืนถ้ามันล้มเหลว" เมื่อคุณสามารถหลีกเลี่ยงได้อย่างง่ายดาย - และทำให้เอกสารชัดเจน - กรณีข้อผิดพลาดทั่วไป ดังนั้นฉันจะหา "ถ้าไม่มี" รูปแบบวิธีการที่เหนือกว่า แต่ฉันไม่ต้องการหรือไม่สนใจที่จะอภิปรายอย่างลึกซึ้งเกี่ยวกับการก่อตัวของแนวปฏิบัติที่ดีที่สุด ฉันไม่ได้ตั้งใจจะทำร้ายใครเลยแค่อยากจะอธิบาย downvote ของฉัน
Jouni Heikniemi

4
ปัญหาของการละเลยข้อผิดพลาดก็คือคุณไม่รู้ว่าทำไมมันถึงล้มเหลว อาจล้มเหลวเนื่องจากมีไดเรกทอรีอยู่แล้วเนื่องจากผู้ใช้ไม่มีสิทธิ์ในไดเรกทอรีนั้นเนื่องจากไม่มีเส้นทางพาเรนต์หรือดิสก์ล้มเหลว "สร้างถ้าไม่มี" ควรล้มเหลวในทุกกรณียกเว้นกรณีแรก คำตอบนี้ส่งผลให้เกิดข้อผิดพลาดในทุกกรณี นั่นเป็นเหตุผลว่าทำไมจึงไม่เหมาะกับสคริปต์แบบแบตช์ -1
jpmc26

38
mkdir C:\VTS 2> NUL

สร้างโฟลเดอร์ที่เรียกว่าVTSและการส่งออกไปยังA subdirectory or file TEST already existsNUL

หรือ

(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เป็นคนอื่นได้ชี้ให้เห็นและคุณอาจได้เห็นในคำตอบที่ชั้นนำจัดอันดับนี้ไม่ได้ทำงานหากคุณมีไฟล์ชื่อ มันแตกต่างกันเล็กน้อย แต่จะนำไปสู่ข้อบกพร่องที่หายากในสคริปต์ของคุณ
อาเบล

20

ฉันใช้วิธีนี้คุณควรใส่แบ็กสแลชที่ส่วนท้ายของชื่อไดเรกทอรีเพื่อหลีกเลี่ยงสถานที่นั้นในไฟล์โดยไม่มีนามสกุลที่มีชื่อเดียวกับไดเรกทอรีที่คุณระบุห้ามใช้"C: \ VTS"เพราะสามารถใช้ไฟล์ได้ มีอยู่ด้วยชื่อ"VTS" ที่บันทึกในพาร์ทิชัน"C:"วิธีที่ถูกต้องคือใช้"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

ฉันสร้างสิ่งนี้สำหรับสคริปต์ของฉันฉันใช้ในงานของฉันสำหรับดวงตา

: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.