Làm thế nào để kiểm tra nếu một thư mục tồn tại trong Windows?


59

Tôi muốn dịch tập lệnh Linux / Bash này sang Windows shell:

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

Nó kiểm tra nếu một thư mục tồn tại, và nếu nó không tạo ra nó.


3
Lệnh linux / bash thực tế sẽ đơn giản là : 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.
michael

Câu trả lời:


73
@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 mydirnamelà 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.


23
Điều này là chính xác để kiểm tra sự tồn tại của tệp, nhưng làm thế nào để bạn biết rằng đó là một thư mục? Câu trả lời đơn giản nhất là 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 testnhị phân và sử dụng nó trên Windows.
phogg

@phogg: Trong ngữ cảnh của câu hỏi cụ thể này: nếu nó tồn tại nhưng là một tệp, bạn vẫn không thể mkdir.
grawity

@grawity: Nếu nó tồn tại nhưng là một tệp, tập lệnh có thể sẽ thất bại sau này khi cố gắng sử dụng nó làm thư mục, đây có thể không phải là điều bạn muốn.
phogg

Làm thế nào tôi có thể kiểm tra nếu không tồn tại?
Sungguk Lim

1
@sunglim bằng cách viết `Nếu không tồn tại myDirName \` tương tự if not 1==1 echo hmm hoặc nếu tồn tại myDirName \ ELSE blahblahblah
barlop

20

Đâ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)

2
+1 - điều này hoạt động trong tất cả các phiên bản Windows và MS-DOS, không giống như phiên bản đơn giản if exist dirnamedành riêng cho Windows NT.
grawity

đó là một mã ngu ngốc so với linux mkdir -p myDirName: p
Kit Ho

6
Nó nên là một dấu gạch chéo ngược, không phải là dấu gạch chéo về phía trước.
Nathan Garabedian

@grawity Bạn nghĩ gì về điều này mặc dù, rõ ràng có vấn đề với việc làm \ nul? dostips.com/forum/viewtopic.php?f=3&t=4913
barlop

@barlop: Tôi nghĩ rằng cmd.exe là một trong những ngôn ngữ kịch bản tồi tệ nhất đang tồn tại và người ta nên sử dụng PowerShell hoặc các lựa chọn thay thế khác nếu có thể. Về phần \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 ...)
grawity

11

Sử dụng dấu gạch chéo ngược, không chuyển tiếp dấu gạch chéo: myDirName\nulkhô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


5

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>

4

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 ) ) )

Đó là giải pháp duy nhất có hiệu quả, cảm ơn. Tôi đã thêm "2> NUL" để tránh thông báo lỗi và thay đổi giá trị echo thành 1 (thư mục tồn tại), 0 (thư mục không tồn tại), -1 (một tệp có cùng tên tồn tại) FOR% A IN (" C: \ temp \ foo \ HELLO WORLD5 ") DO @ (PUSHD"% A "2> NUL && (POPD & ECHO 1) || (NẾU EXIST% A (ECHO -1) ELSE (ECHO 0
Christoph

(xin lỗi, tôi đã không quản lý định dạng mã dưới dạng mã trong câu trả lời mặc dù tôi đã thử rất nhiều thứ :-( cho đến khi chỉnh sửa hết thời gian nhận xét sau 5 phút :-()
Christoph

1

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
)

(1) Nếu bạn sẽ sử dụng một biến, hãy sử dụng biến đó. Tất cả các lần xuất hiện MyDirsau 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/ popdvà / hoặc setlocal.
Scott

0
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


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

-1

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";
   }
}

Tôi không hiểu
Pierre.Vriens
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.