Câu trả lời:
@echo off
IF exist myDirName ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)
Được thêm bởi Barlop
Trong khi các cách trên hoạt động cho tình huống cụ thể này, tiêu đề nói về việc kiểm tra cụ thể cho một thư mục. Nhận xét của Phogg sử dụng if exist mydirname\
chứ không phải if exist mydirname
là cách. Một số câu trả lời đã sử dụng \ nul nhưng \ nul có vấn đề trong NT. Không bao gồm dấu gạch chéo ngược sẽ kiểm tra tệp hoặc thư mục. Vì vậy, đối với một thư mục, bao gồm dấu gạch chéo ngược.
if exist mydirname\
và phần còn lại như bạn nói. Thay phiên, bạn thực sự có thể có được một test
nhị phân và sử dụng nó trên Windows.
mkdir
.
if not 1==1 echo hmm
hoặc nếu tồn tại myDirName \ ELSE blahblahblah
Đây là những gì tôi vừa tìm ra:
Bạn có thể kiểm tra nếu một tệp nul tồn tại; Nếu thư mục tồn tại, nó sẽ chứa tệp nul, nếu tệp nul không tồn tại thì thư mục không tồn tại.
IF exist myDirName/nul ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)
if exist dirname
dành riêng cho Windows NT.
\nul
, nó không còn cần thiết trong Windows NT nữa, if exist "C:\Program Files (x86)"
nên hoạt động bình thường (trừ khi bạn vẫn nhắm mục tiêu Windows 98 ...)
Sử dụng dấu gạch chéo ngược, không chuyển tiếp dấu gạch chéo: myDirName\nul
khôngmyDirName/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 là một thư mục
- thanh là một tệp
- xyz không tồn tại
chỉnh sửa: điều này chỉ hoạt động nếu tên thư mục không chứa dấu cách
Một số người đã đề nghị làm \ nul, nhưng điều đó dường như không hoạt động đáng tin cậy trong 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
Trả lời câu hỏi
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>
Tôi đã tự hỏi tại sao joe có một downvote khi tôi gặp phải vấn đề tương tự trên Windows 7, cụ thể là
NẾU tên tập tin EXIST \ NUL
đã trả về TRUE cho cả tệp và thư mục. Tôi đã tìm thấy một giải pháp thay thế tại www.robvanderwoude.com/battech_ifexistfolder.php và đưa ra một phiên bản sửa đổi của vòng lặp FOR của 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 ) ) )
Tôi thấy nhiều vấn đề với sự khác biệt giữa các tập tin và thư mục. Có ai đã cố gắng đơn giản cd vào nó sau khi kiểm tra nó tồn tại? Sau đó, cd sẽ thành công hoặc thất bại.
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
sau dòng đầu tiên nên được %MyDir%
. (2) cd ..
Sẽ không làm những gì bạn muốn nếu %MyDir%
là một tên đường dẫn đa cấp (ví dụ Pictures\cats
:) hoặc thậm chí là một tên đường dẫn tuyệt đối (ví dụ \Windows
:). Cân nhắc sử dụng pushd
/ popd
và / hoặc setlocal
.
exist myDirName/nul
cũng đúng nếu myDirName là một tệp, thì whis không phải là chức năng tìm kiếm
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>
Tôi không phải là fan hâm mộ của \ nul ở NT nhưng không phải vậy. Bạn nên có một số đầu ra.
Tìm một thư mục không nên khó khăn này. Giải pháp của tôi, sử dụng perl:
cho ($ cnt = $ # ARGV; $ cnt> = 0; - $ cnt) { if (-d "$ ARGV [$ cnt]") { in "argv [$ cnt] = $ ARGV [$ cnt] là một thư mục \ n"; $ dir = $ ARGV [$ cnt]; phá vỡ; } khác { in "argv [$ cnt] = $ ARGV [$ cnt] không phải là thư mục \ n"; } }
mkdir -p myDirName
. Sau nhiều ngày cố gắng dịch các tập lệnh bash tương đối đơn giản thành batch-sh * t (gán kết quả của hàm cho một biến?), Tôi đã quyết định chỉ bắt mọi người cài đặt cygwin.