จะตรวจสอบได้อย่างไรว่ามีไดเรกทอรีอยู่ใน Windows


59

ฉันต้องการแปลสคริปต์ Linux / Bash นี้เป็น Windows เชลล์:

if test -d myDirName; then echo "ok"; else mkdir myDirName; fi

มันจะทดสอบว่ามีไดเรกทอรีอยู่หรือไม่และไม่สร้างขึ้นมาหรือไม่


3
คำสั่งลินุกซ์ / mkdir -p myDirNameทุบตีที่เกิดขึ้นจริงเพียงแค่จะเป็น: หลังจากใช้เวลาหลายวันในการพยายามแปลสคริปต์ทุบตีแบบง่ายๆให้เป็น batch-sh * t (กำหนดผลลัพธ์ของฟังก์ชันให้กับตัวแปรหรือไม่) ฉันตัดสินใจที่จะทำให้คนติดตั้ง cygwin
michael

คำตอบ:


73
@echo off
IF exist myDirName ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)

เพิ่มโดย Barlop

ในขณะที่การทำงานด้านบนใช้ได้กับสถานการณ์เฉพาะนี้ชื่อกล่าวเกี่ยวกับการทดสอบเฉพาะสำหรับไดเรกทอรี ความคิดเห็นของ Phogg ใช้if exist mydirname\มากกว่าif exist mydirnameเป็นวิธี คำตอบบางคำใช้ \ nul แต่ \ nul เป็นปัญหาใน NT ไม่รวมเครื่องหมายแบ็กสแลชต่อท้ายจะทดสอบไฟล์หรือไดเรกทอรี ดังนั้นสำหรับไดเรกทอรีให้รวมเครื่องหมายแบ็กสแลชต่อท้าย


23
สิ่งนี้ถูกต้องสำหรับการทดสอบการมีอยู่ของไฟล์ แต่คุณจะรู้ได้อย่างไรว่ามันเป็นไดเรกทอรี คำตอบที่ง่ายที่สุดคือif exist mydirname\ และส่วนที่เหลือตามที่คุณพูด อีกวิธีหนึ่งคุณอาจได้รับtestไบนารีและใช้งานบน Windows
phogg

@phogg: ในบริบทของคำถามเฉพาะนี้: ถ้ามันมีอยู่ แต่เป็นไฟล์ที่คุณยังคงไม่สามารถmkdirมัน
grawity

@grawity: ถ้ามีอยู่ แต่เป็นไฟล์สคริปต์อาจล้มเหลวในภายหลังเมื่อพยายามใช้เป็นไดเรกทอรีซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ
phogg

ฉันจะตรวจสอบได้อย่างไรถ้าไม่มีอยู่?
Sungguk Lim

1
@ Sunglim โดยการเขียน `หากไม่มี myDirName \` ที่คล้ายกันif not 1==1 echo hmm หรือถ้ามีอยู่ myDirName \ ELSE blahblahblah
barlop

20

นี่คือสิ่งที่ฉันเพิ่งค้นพบ:

คุณสามารถทดสอบว่าไฟล์ nul มีอยู่หรือไม่ หากมีไดเร็กทอรีอยู่ไฟล์นั้นจะมีไฟล์ nul หากไฟล์ nul ไม่มีอยู่ไดเร็กทอรีนั้นจะไม่มีอยู่

IF exist myDirName/nul ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)

2
+1 - ใช้ได้กับ Windows และ MS-DOS ทุกรุ่นซึ่งแตกต่างจากแบบธรรมดาif exist dirnameซึ่งดูเหมือนจะเฉพาะกับ Windows NT
grawity

นั่นเป็นรหัสโง่เปรียบเทียบกับ linux mkdir -p myDirName: p
Kit Ho

6
มันควรเป็นแบ็กสแลชไม่ใช่สแลชต่อไป
นาธานการาเบเดียน

@grawity คุณคิดอย่างไรเกี่ยวกับเรื่องนี้ แต่ดูเหมือนว่ามีปัญหาในการทำ \ nul? dostips.com/forum/viewtopic.php?f=3&t=4913
barlop

@barlop: ฉันคิดว่า cmd.exe เป็นหนึ่งในภาษาสคริปต์ที่เลวร้ายที่สุดที่มีอยู่และควรใช้ PowerShell หรือทางเลือกอื่น ๆ หากเป็นไปได้ สำหรับ\nulมันไม่จำเป็นใน Windows NT อีกต่อไปธรรมดาif exist "C:\Program Files (x86)"ควรทำงาน (เว้นแต่คุณจะยังคงกำหนดเป้าหมายเป็น Windows 98 ... )
grawity

11

ใช้แบ็กสแลชไม่ใช่ฟอร์เวิร์ดสแลช: myDirName\nulไม่myDirName/nul

md foo 
echo.>bar 
for %I in (foo bar xyz) do @( 
  if exist %I ( 
    if exist %I\nul ( 
      echo -- %I is a directory 
    ) else ( 
      echo -- %I is a file 
    ) 
  ) else ( 
    echo -- %I does not exist 
  ) 
)

- foo เป็นไดเรกทอรี
- bar เป็นไฟล์
- xyz ไม่มีอยู่

แก้ไข: ใช้งานได้เฉพาะในกรณีที่ชื่อไดเรกทอรีไม่มีช่องว่าง


5

มีบางคนแนะนำให้ทำ \ n แต่ดูเหมือนจะไม่สามารถทำงานได้อย่างน่าเชื่อถือใน NT

C:\blah>md abc

C:\blah>if exist abc\nul echo yes
yes

C:\blah>if exist "abc\nul" echo yes

C:\blah>

http://www.dostips.com/forum/viewtopic.php?f=3&t=4913

foxidrive writes-

The trick with nul worked in pre NT versions of windows.

Now you would use this, with a trailing backslash.

if exist "C:\abcde\" echo the folder exists

ตอบคำถาม

C:\blah>if exist "abcd\" (echo yes) else (echo no && mkdir abcd)
no

C:\blah>if exist "abcd\" (echo yes) else (echo no && mkdir abcd)
yes

C:\blah>

4

ฉันสงสัยว่าทำไม Joe มี downvote เนื่องจากฉันพบปัญหาแบบเดียวกันใน Windows 7 นั่นคือ

หากมีชื่อไฟล์อยู่ \ NUL

กำลังส่งคืน TRUE สำหรับทั้งไฟล์และไดเรกทอรี ฉันพบโซลูชันทางเลือกที่www.robvanderwoude.com/battech_ifexistfolder.phpและเกิดขึ้นกับ FOR FOR รุ่น DVF ที่ปรับปรุงแล้ว:

FOR %I in (foo bar xyz) DO @( PUSHD %I && (POPD & echo -- %I is a directory) || ( IF exist %I ( echo -- %I is a file ) ELSE ( echo -- %I does not exist ) ) )

นั่นเป็นทางออกเดียวที่ได้ผลขอบคุณ ฉันเพิ่ม "2> NUL" เพื่อหลีกเลี่ยงข้อความแสดงข้อผิดพลาดและเปลี่ยนค่า echo เป็น 1 (มีอยู่ในไดเรกทอรี), 0 (ไม่มีไดเรกทอรี), -1 (ไฟล์ที่มีชื่อเดียวกันมีอยู่) สำหรับ% A IN (" C: \ temp \ foo \ HELLO WORLD5 ") DO @ (PUSHD"% A "2> NUL && (POPD & ECHO 1) || (ถ้ามีอยู่% A (ECHO -1) ELSE (ECHO 0
Christoph

(ขออภัยฉันไม่สามารถจัดรูปแบบรหัสเป็นรหัสในการตอบแม้ว่าฉันจะลองหลายสิ่งหลายอย่าง :-( จนกว่าจะแก้ไขความคิดเห็นหมดเวลาหลังจาก 5 นาที :-()
Christoph

1

ฉันเห็นหลายคนมีปัญหากับการแยกความแตกต่างระหว่างไฟล์และโฟลเดอร์ มีใครพยายามที่จะเพียงแค่ซีดีลงในมันหลังจากตรวจสอบมันมีอยู่? จากนั้น cd จะประสบความสำเร็จหรือล้มเหลว

set MyDir = "MyTestDir"
IF exist MyDir (
    cd MyDir 
    IF ERRORLEVEL NEQ 0 (
        echo "Error: %MyDir% already exists, but it is a file!"
        exit 1
    ) else (
        # Do not forget to cd back
        cd ..
    )
) else (
   # Did not exist yet, so create it.
   mkdir MyDir
)

(1) ถ้าคุณจะใช้ตัวแปรให้ใช้ตัวแปร เหตุการณ์ที่เกิดขึ้นทั้งหมดหลังจากบรรทัดแรกที่ควรจะเป็นMyDir %MyDir%(2) ตัวเลือกcd ..จะไม่ทำสิ่งที่คุณต้องการหาก %MyDir%เป็นชื่อพา ธ หลายระดับ (เช่นPictures\cats) หรือแม้กระทั่งชื่อพา ธ สัมบูรณ์ (เช่น\Windows) พิจารณาใช้pushd/ และpopd / หรือ setlocal
สกอตต์

0
exist myDirName/nul

ก็เป็นจริงเช่นกันหาก myDirName เป็นไฟล์ซึ่งไม่ใช่ฟังก์ชันการค้นหา


1
C:\blah>touch abe<ENTER>C:\blah>if exist abe\nul echo err<ENTER> C:\blah>if exist abe/nul echo err<ENTER>C:\blah>ฉันไม่มีแฟนของ \ nul ใน NT แต่ไม่ใช่ คุณควรให้ผลลัพธ์บางอย่าง
barlop

-1

การค้นหาโฟลเดอร์ไม่ควรเป็นเรื่องยาก ทางออกของฉันใช้ Perl:

สำหรับ ($ cnt = $ # ARGV; $ cnt> = 0; - $ cnt)
{
   ถ้า (-d "$ ARGV [$ cnt]") { 
      พิมพ์ "argv [$ cnt] = $ ARGV [$ cnt] เป็นโฟลเดอร์ \ n";
      $ dir = $ ARGV [$ cnt];
      หยุดพัก;
   } อื่น {
      พิมพ์ "argv [$ cnt] = $ ARGV [$ cnt] ไม่ใช่โฟลเดอร์ \ n";
   }
}

ฉันไม่เข้าใจ
Pierre.Vriens
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.