Bagaimana cara memeriksa apakah direktori ada di Windows?


59

Saya ingin menerjemahkan skrip Linux / Bash ini ke shell Windows:

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

Ini menguji apakah direktori ada, dan jika tidak menciptakannya.


3
Sebenarnya perintah linux / bash hanya akan: mkdir -p myDirName. Setelah menghabiskan berhari-hari mencoba menerjemahkan bash-script yang relatif sederhana ke dalam batch-sh * t (menugaskan hasil fungsi ke variabel?), Saya memutuskan untuk membuat orang menginstal cygwin.
michael

Jawaban:


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

Ditambahkan oleh Barlop

Sementara hal di atas berfungsi untuk situasi khusus ini, judulnya mengatakan tentang pengujian khusus untuk direktori. Komentar Phogg menggunakan if exist mydirname\bukan if exist mydirnamecaranya. Beberapa jawaban telah menggunakan \ nul tetapi \ nul bermasalah di NT. Tidak termasuk garis miring terbalik akan menguji file atau direktori. Jadi, untuk direktori, sertakan trailing backslash.


23
Ini benar untuk menguji keberadaan file, tetapi bagaimana Anda tahu itu adalah direktori? Jawaban paling sederhana adalah if exist mydirname\ dan sisanya seperti yang Anda katakan. Sebagai alternatif, Anda sebenarnya bisa mendapatkan testbiner dan menggunakannya di Windows.
phogg

@phogg: Dalam konteks pertanyaan khusus ini: jika ada tetapi merupakan file, Anda tetap tidak mkdirbisa.
grawity

@grawity: Jika ada tetapi merupakan file, skrip mungkin akan gagal nanti ketika mencoba menggunakannya sebagai direktori, yang mungkin bukan yang Anda inginkan.
phogg

bagaimana saya bisa mengecek jika tidak ada?
Sungguk Lim

1
@sunglim dengan menulis `Jika tidak ada myDirName \` sama if not 1==1 echo hmm atau jika ada myDirName \ ELSE blahblahblah
barlop

20

Inilah yang baru saya ketahui:

Anda dapat menguji apakah ada file nul; jika direktori itu ada akan berisi file nul, jika file nul tidak ada maka direktori tidak ada.

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

2
+1 - ini berfungsi di semua versi Windows dan MS-DOS, tidak seperti biasa if exist dirnameyang tampaknya khusus untuk Windows NT.
grawity

itu adalah kode bodoh dibandingkan dengan linux mkdir -p myDirName: p
Kit Ho

6
Itu harus berupa garis miring terbalik, bukan garis miring ke depan.
Nathan Garabedian

@grawity Apa pendapat Anda tentang hal ini, rupanya ada masalah dengan melakukan \ nul? dostips.com/forum/viewtopic.php?f=3&t=4913
barlop

@barlop: Saya pikir cmd.exe adalah salah satu bahasa skrip terburuk yang ada, dan seseorang harus menggunakan PowerShell atau alternatif lain jika memungkinkan. Adapun \nul, tidak perlu di Windows NT lagi, polos if exist "C:\Program Files (x86)"harus bekerja (kecuali Anda masih menargetkan Windows 98 ...)
grawity

11

Gunakan backslash, bukan forward slash: myDirName\nulnotmyDirName/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 adalah direktori
- bar adalah file
- xyz tidak ada

sunting: ini hanya berfungsi jika nama direktori tidak mengandung spasi


5

Beberapa menyarankan melakukan \ nul, tetapi itu tampaknya tidak bekerja dengan baik di 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

Kembali pertanyaannya

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

Saya bertanya-tanya mengapa joe memiliki downvote karena saya mengalami masalah yang sama pada Windows 7, yaitu itu

JIKA ADA nama file \ NUL

mengembalikan TRUE untuk file dan direktori. Saya menemukan solusi alternatif di www.robvanderwoude.com/battech_ifexistfolder.php dan muncul dengan versi revisi dari loop 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 ) ) )

Itu satu-satunya solusi yang berhasil, terima kasih. Saya menambahkan "2> NUL" untuk menghindari pesan kesalahan dan mengubah nilai gema menjadi 1 (direktori ada), 0 (direktori tidak ada), -1 (file dengan nama yang sama ada) UNTUK% A IN (" C: \ temp \ foo \ HELLO WORLD5 ") DO @ (PUSHD"% A "2> NUL && (POPD & ECHO 1) || (JIKA ADA% A (ECHO -1) ELSE (ECHO 0
Christoph

(maaf, saya tidak berhasil memformat kode sebagai kode di balasan walaupun saya sudah mencoba banyak hal :-( sampai mengedit komentar habis setelah 5 menit :-()
Christoph

1

Saya melihat banyak masalah dengan membedakan antara file dan folder. Adakah yang mencoba untuk melakukan cd ke dalamnya setelah memeriksanya? Maka cd akan berhasil atau gagal.

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) Jika Anda akan menggunakan variabel, gunakan variabel. Semua kemunculan MyDirsetelah baris pertama seharusnya %MyDir%. (2) The cd ..tidak akan melakukan apa yang Anda inginkan jika %MyDir%pathname multi-level (misalnya, Pictures\cats) atau bahkan pathname absolut (misalnya, \Windows). Pertimbangkan untuk menggunakan pushd/ popddan / atau setlocal.
Scott

0
exist myDirName/nul

juga benar jika myDirName adalah file, bukan fungsi yang dicari


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>Saya bukan penggemar NT di NT tetapi tidak. Anda seharusnya memberikan beberapa output.
barlop

-1

Menemukan folder seharusnya tidak sesulit ini. Solusi saya, gunakan perl:

untuk ($ cnt = $ # ARGV; $ cnt> = 0; - $ cnt)
{
   if (-d "$ ARGV [$ cnt]") { 
      print "argv [$ cnt] = $ ARGV [$ cnt] adalah folder \ n";
      $ dir = $ ARGV [$ cnt];
      istirahat;
   } lain {
      print "argv [$ cnt] = $ ARGV [$ cnt] Bukan folder \ n";
   }
}

Saya tidak mengerti
Pierre.Vriens
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.