ฉันต้องการแปลสคริปต์ Linux / Bash นี้เป็น Windows เชลล์:
if test -d myDirName; then echo "ok"; else mkdir myDirName; fi
มันจะทดสอบว่ามีไดเรกทอรีอยู่หรือไม่และไม่สร้างขึ้นมาหรือไม่
ฉันต้องการแปลสคริปต์ Linux / Bash นี้เป็น Windows เชลล์:
if test -d myDirName; then echo "ok"; else mkdir myDirName; fi
มันจะทดสอบว่ามีไดเรกทอรีอยู่หรือไม่และไม่สร้างขึ้นมาหรือไม่
คำตอบ:
@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 ไม่รวมเครื่องหมายแบ็กสแลชต่อท้ายจะทดสอบไฟล์หรือไดเรกทอรี ดังนั้นสำหรับไดเรกทอรีให้รวมเครื่องหมายแบ็กสแลชต่อท้าย
if exist mydirname\
และส่วนที่เหลือตามที่คุณพูด อีกวิธีหนึ่งคุณอาจได้รับtest
ไบนารีและใช้งานบน Windows
mkdir
มัน
if not 1==1 echo hmm
หรือถ้ามีอยู่ myDirName \ ELSE blahblahblah
นี่คือสิ่งที่ฉันเพิ่งค้นพบ:
คุณสามารถทดสอบว่าไฟล์ nul มีอยู่หรือไม่ หากมีไดเร็กทอรีอยู่ไฟล์นั้นจะมีไฟล์ nul หากไฟล์ nul ไม่มีอยู่ไดเร็กทอรีนั้นจะไม่มีอยู่
IF exist myDirName/nul ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)
if exist dirname
ซึ่งดูเหมือนจะเฉพาะกับ Windows NT
\nul
มันไม่จำเป็นใน Windows NT อีกต่อไปธรรมดาif exist "C:\Program Files (x86)"
ควรทำงาน (เว้นแต่คุณจะยังคงกำหนดเป้าหมายเป็น Windows 98 ... )
ใช้แบ็กสแลชไม่ใช่ฟอร์เวิร์ดสแลช: 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 ไม่มีอยู่
แก้ไข: ใช้งานได้เฉพาะในกรณีที่ชื่อไดเรกทอรีไม่มีช่องว่าง
มีบางคนแนะนำให้ทำ \ 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>
ฉันสงสัยว่าทำไม 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 ) ) )
ฉันเห็นหลายคนมีปัญหากับการแยกความแตกต่างระหว่างไฟล์และโฟลเดอร์ มีใครพยายามที่จะเพียงแค่ซีดีลงในมันหลังจากตรวจสอบมันมีอยู่? จากนั้น 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
)
MyDir
%MyDir%
(2) ตัวเลือกcd ..
จะไม่ทำสิ่งที่คุณต้องการหาก %MyDir%
เป็นชื่อพา ธ หลายระดับ (เช่นPictures\cats
) หรือแม้กระทั่งชื่อพา ธ สัมบูรณ์ (เช่น\Windows
) พิจารณาใช้pushd
/ และpopd
/ หรือ setlocal
exist myDirName/nul
ก็เป็นจริงเช่นกันหาก myDirName เป็นไฟล์ซึ่งไม่ใช่ฟังก์ชันการค้นหา
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 แต่ไม่ใช่ คุณควรให้ผลลัพธ์บางอย่าง
การค้นหาโฟลเดอร์ไม่ควรเป็นเรื่องยาก ทางออกของฉันใช้ Perl:
สำหรับ ($ cnt = $ # ARGV; $ cnt> = 0; - $ cnt) { ถ้า (-d "$ ARGV [$ cnt]") { พิมพ์ "argv [$ cnt] = $ ARGV [$ cnt] เป็นโฟลเดอร์ \ n"; $ dir = $ ARGV [$ cnt]; หยุดพัก; } อื่น { พิมพ์ "argv [$ cnt] = $ ARGV [$ cnt] ไม่ใช่โฟลเดอร์ \ n"; } }
mkdir -p myDirName
ทุบตีที่เกิดขึ้นจริงเพียงแค่จะเป็น: หลังจากใช้เวลาหลายวันในการพยายามแปลสคริปต์ทุบตีแบบง่ายๆให้เป็น batch-sh * t (กำหนดผลลัพธ์ของฟังก์ชันให้กับตัวแปรหรือไม่) ฉันตัดสินใจที่จะทำให้คนติดตั้ง cygwin