Windows'ta bir dizin olup olmadığını nasıl kontrol edebilirim?


59

Bu Linux / Bash komut dosyasını Windows kabuğuna çevirmek istiyorum:

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

Bir dizinin olup olmadığını test eder ve içermiyorsa onu oluşturur.


3
Gerçek linux / bash komut basitçe şöyle olacaktır: mkdir -p myDirName. Görece basit bash betiğini bat-sh * t (bir fonksiyonun sonucunu bir değişkene atama?) 'Ya çevirmeye çalışarak geçen günleri harcadıktan sonra, insanların sadece cygwin'i kurmasına karar verdim.
Michael,

Yanıtlar:


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

Barlop tarafından eklendi

Yukarıdakiler bu özel durum için çalışsa da, başlık özellikle bir dizin için test etme hakkında diyor. Phogg'un yorumunu kullanmak if exist mydirname\yerine kullanmaktır if exist mydirname. Bazı cevaplar \ nul kullandı ama \ nul NT'de problemli. Son bir ters eğik çizgi dahil değil bir dosyayı veya dizini test eder. Bu nedenle, bir dizin için sondaki ters eğik çizgiyi ekleyin.


23
Bu, dosya varlığını sınamak için doğru, ancak bunun bir dizin olduğunu nereden biliyorsunuz? En basit cevap, if exist mydirname\ söylediğiniz gibi. Alternatif olarak, aslında bir testikili dosya alıp Windows'ta kullanabilirsiniz.
gör phogg

@ phogg: Bu özel soru bağlamında: eğer varsa fakat bir dosya ise, yine de yapamazsınız mkdir.
Grawity

@grawity: Varsa ancak bir dosyaysa, komut dosyası daha sonra bir dizin olarak kullanmaya çalıştığınızda muhtemelen başarısız olacak, muhtemelen istediğiniz şey değildir.
gör phogg

var olup olmadığını nasıl kontrol edebilirim?
Sungguk Lim

1
@sunglim 'MyDirName \ yoksa \' yazısını benzer şekilde if not 1==1 echo hmm yazabilirsiniz ya da varsa myDirName \ ELSE blahblahblah
barlop

20

İşte şimdi öğrendiklerim:

Bir boş dosya olup olmadığını test edebilirsiniz; Eğer dizin varsa, bir nul dosyası içerecektir, eğer nul dosyası yoksa o zaman dizin yoktur.

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

2
+1 - Bu, tüm Windows ve MS-DOS sürümlerinde çalışır, if exist dirnameWindows NT'ye özgü görünüyor.
Grawity

Bu linux mkdir ile karşılaştırmak aptalca bir kod oldu -p myDirName: p
Kit Ho

6
Ters eğik çizgi olmalı, eğik çizgi değil.
Nathan Garabedian

@grawity Bu konuda ne düşünüyorsunuz, görünüşte \ nul ile ilgili bir sorun mu var? dostips.com/forum/viewtopic.php?f=3&t=4913
barlop

@ barlop: Bence cmd.exe var olan en kötü betik dillerinden biri ve mümkünse PowerShell veya diğer alternatifleri kullanması gerektiğini düşünüyorum. Gelince \nul, artık Windows NT'de gerekli değil, düz if exist "C:\Program Files (x86)"çalışmalı (hala Windows 98'i hedeflemediğiniz sürece ...)
Grawity

11

Bir eğik çizgi kullanın, eğik çizgi değil: myDirName\nuldeğilmyDirName/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 bir dizindir
- çubuk bir dosyadır
- xyz mevcut değil

düzenleme: bu yalnızca dizin adı boşluk içermiyorsa çalışır


5

Bazıları bunu yapmayı önerdi, ama bu NT'de güvenilir bir şekilde çalışmıyor gibi görünüyor

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

Soru yeniden

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

Windows 7'de de aynı problemi yaşamaya başladığımda, Joe'nun neden bir oyu olmadığını merak ettim.

Var ise dosya adı \ NUL

hem dosyalar hem de dizinler için TRUE döndürüyordu. Www.robvanderwoude.com/battech_ifexistfolder.php adresinde alternatif bir çözüm buldum ve DVF'nin FOR döngüsünün gözden geçirilmiş bir versiyonunu gördüm :

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

İşe yarayan tek çözüm buydu, teşekkürler. Hata mesajından kaçınmak için "2> NUL" ekledim ve yankı değerlerini 1 (dizin var), 0 (dizin yok), -1 (aynı ada sahip bir dosya var) olarak değiştirdim. FOR% A IN (" C: \ temp \ foo \ HELLO WORLD5 ") DO @ (PUSHD"% A "2> NUL && (POPD ve ECHO 1) || (% A varsa (ECHO -1) ELSE (ECHO 0
Christoph

(üzgünüm, cevapta kod olarak biçimlendirmeyi başaramadım, ancak çok şey denedim :-( 5 dakika sonra zaman aşımına uğrayan yorumu düzenlemeye kadar :-()
Christoph

1

Birçoğunun dosya ve klasörleri ayırt etmede problemleri olduğunu gördüm. Biri var olup olmadığını kontrol ettikten sonra basitçe cd yazmayı denemiş mi? Sonra cd ya başarılı veya başarısız olacaktır.

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) Bir değişken kullanacaksanız, değişkeni kullanın. MyDirİlk satırdan sonraki tüm oluşumlar olmalıdır %MyDir%. (2) Çok seviyeli bir yol adı (örneğin ) veya mutlak bir yol adı (örneğin ) cd ..ise %MyDir%, istediğiniz şeyi yapmayacaktır . / Ve / veya kullanarak düşünün . Pictures\cats\Windowspushdpopdsetlocal
Scott

0
exist myDirName/nul

Ayrıca myDirName bir dosya ise doğrudur, aranan işlevsellik değildir whis


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>NT'de \ 'nin hayranı değilim ama değil. Bazı çıktı vermeliydin.
barlop

-1

Bir klasör bulmak bu kadar zor olmamalı. Benim çözümüm perl kullanın:

($ cnt = $ # ARGV; $ cnt> = 0; - $ cnt) için
{
   if (-d "$ ARGV [$ cnt]") { 
      print "argv [$ cnt] = $ ARGV [$ cnt] bir klasördür \ n";
      $ dir = $ ARGV [$ cnt];
      break;
   } Başka {
      print "argv [$ cnt] = $ ARGV [$ cnt] bir klasör değil \ n";
   }
}

Ben alamadım
Pierre.Vriens
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.