Toplu olarak ancak yalnızca yoksa klasör oluşturun


440

Biri bana bir Windows toplu komut dosyasında aşağıdakileri nasıl yapacağımı söyleyebilir mi? ( *.bat):

  • Yalnızca mevcut değilse bir klasör oluşturun

Daha ayrıntılı olarak, ben adında bir klasör oluşturmak istediğiniz VTSüzerine C:\sürücüye, ama sadece o klasör zaten yok. Klasör zaten varsa ve toplu iş yürütülürse, içeriğinin üzerine yazmak istemiyorum.


2
Buna ne dersin ? if not exist "%Folder%" mkdir "%New-Folder%"
scientist_7

Yanıtlar:


622

Sadece if not exist "C:\VTS\" mkdir C:\VTSbunu kullanın: sadece klasör yoksa bir dizin oluşturur.

Bu varlık testinin yalnızca VTS varsa ve bir dizinse true değerini döndüreceğini unutmayın. Orada yoksa veya bir dosya olarak varsa, mkdir komutu çalışır ve hataya neden olur. VTS'nin bir dosya olarak da var olup olmadığını kontrol etmek isteyebilirsiniz.


7
Bunun dışında yanlış. NUL cihazını kontrol etmelisiniz, aksi takdirde çalışmaz. Cevabımı bundan üç yıl önce gör.
Martin Schapendonk

@MartinSchapendonk Bu, testten anlayabildiğim kadarıyla Windows 7 ve Windows Server 2012'de çalışıyor ve en azından XP'ye ve Windows 10'a kadar çalışmazsa çok şaşırırdım. bu çalışmıyor mu?
jpmc26

12
NUL için @ jpmc26 testi, bir dizini test ettiğinizden emin olmaktır. Aksi takdirde, normal bir dosya olsa bile koşul true olarak değerlendirilebilir. Aradaki fark bu.
Martin Schapendonk

3
@MartinSchapendonk Bunun için bir eğik çizgi eklemek yeterli mi? Bu, dosyalar ve dizinler arasında doğru bir şekilde ayrım yapıyor gibi görünüyor, ancak dosya algılanmazsa, dizinin oluşturulması başarısız olacaktır. Bunun test için de bir sorun olduğundan şüpheleniyorum NUL.
13:16

6
@ jpmc26 Haklısınız, sondaki eğik çizgi işi yapar ve tırnak işaretleri ile çalıştığı için tercih edilir (böylece dizin yolunda boşluklar olmasını sağlar). Her iki dosya / dizini ayırt etmek, işe yarayacak: if exist "a" if not exist "a\" (echo "it's a file") else (echo "it's a dir"). Son cümleniz hakkında, başka bir yerde toplu iş dosyanızla ilgili bir sorun olduğundan şüpheleniyorum.
Marc.2377

221
if exist C:\VTS\NUL echo "Folder already exists"

if not exist C:\VTS\NUL echo "Folder does not exist"

Ayrıca bkz. Https://support.microsoft.com/en-us/kb/65994

(Güncelleme 7 Mart 2018; Microsoft makalesi kapalı, https://web.archive.org/web/20150609092521/https://support.microsoft.com/tr-tr/kb/65994 adresinde arşivleyin )


12
Şahsen, dir zaten mevcut olduğunda% errorlevel% değerini ayarlamadığı için bunu tercih ederim (Agent_9191'in cevabı 1 hata kodu döndürür)
csauve

1
Aynı zamanda güzel ve geneldir ve şartlı olarak yapmak istediğiniz her eyleme uygulanabilir :)
John Humphreys - w00te

3
@YouHaveaBigEgo NULbir L. ile
Martin Schapendonk

1
Bağlantı artık çalışmıyor, ancak İnternet Arşivinde bir kopya
fernio

3
Aslında, bu cevap harika olmasına rağmen, "bir dizin oluşturmak" sorusuna cevap vermiyor :)
Jean-Francois T.

55

Sadece çağrı mkdir C:\VTSNe olursa olsun. Sadece alt dizinin zaten var olduğunu rapor edecektir.

Düzenleme: Diğerleri belirttiği gibi, bu zaten klasör varsa% ERRORLEVEL% ayarlar. Toplu işiniz (veya onu çağıran herhangi bir işlem) hata düzeyini umursamıyorsa, bu yöntem iyi çalışır. Soru, hata seviyesinden kaçınmaktan bahsetmediğinden, bu cevap tamamen geçerlidir. Klasör yoksa, klasör oluşturma gereksinimlerini karşılar ve mevcut bir klasörün içeriğinin üzerine yazmaz. Aksi takdirde Martin Schapendonk'un cevabını takip edin .


20
bu, beklenmeyen bir hata iletisi / uyarısı nedeniyle kötü bir davranıştır.
SeriousM

11
En iyi uygulamaları ihlal ettiğinde "tamamen geçerli" bir şey söylemek entelektüel olarak sahtekârlıktır. Başka bir örnek olarak: Birisi size belirli bir güvenlik sorunundan nasıl kaçınacağınızı sorduğunda, soru açıkça önkoşul olarak minimum güvenlik etkisini belirtmemiş olsa bile cevabınız "bilgisayarı yönetici olarak çalıştır" olmamalıdır. :-)
Jouni Heikniemi

2
@JouniHeikniemi s / en iyi uygulamalar /
Jouni'nin

4
Errorlevel veya errno ile ilgili yanlış bir şey yok. Platforma özgü hata mesajlaşma paradigmalarıdır ve amaçlarına uygun olarak çalışırlar. Ancak platform veya mesajlaşma yaklaşımı ne olursa olsun, yaygın hata durumundan kolayca kaçınabileceğiniz ve böylece okunaklı olarak belgeleyebileceğiniz zaman "bunu yapmaya çalışın ve başarısız olursa kurtarın" şeklini önermem. Bu nedenle, "yoksa" tarzı yaklaşımları daha üstün buluyorum. Ancak, en iyi uygulamaların oluşumu ile ilgili bir tartışmaya fazla derin girmek istemiyorum ya da umursamıyorum. Kimseyi incitmek gibi bir niyetim yoktu, sadece oyumu netleştirmek istedim.
Jouni Heikniemi

4
Hatayı görmezden gelmeyle ilgili sorun, neden başarısız olduğunu bilmemenizdir. Dizin zaten var olduğu, kullanıcının bu dizin üzerinde izinleri olmadığı, üst yol olmadığı için veya disk başarısız olduğu için başarısız olabilir. "Varsa oluştur" seçeneği, ilk öğe dışındaki tüm durumlarda başarısız olur. Ancak bu cevap her durumda bir hata ile sonuçlanır. Bu yüzden toplu bir komut dosyası için uygun değildir. -1
jpmc26

38
mkdir C:\VTS 2> NUL

Bir adlandırılan klasör oluşturmak VTSve çıkış A subdirectory or file TEST already existsiçin NUL.

veya

(C:&(mkdir "C:\VTS" 2> NUL))&

sürücü harfini değiştirmek C:, mkdirçıkış hatası, NULve bir sonraki komutunu çalıştırın.


Bu PowerShell'de çalışmanın bir yolu var mı? NULBir çıktı dosyası olarak desteklenmiyor gibi görünüyor .
Aaron Franke

30
set myDIR=LOG
IF not exist %myDIR% (mkdir %myDIR%)

1
Diğerlerinin işaret ettiği ve en yüksek puanlı cevaba görebildiğiniz gibi, adında bir dosyanız varsa bu çalışmaz log. Bu ince bir farktır, ancak komut dosyalarınızda bulunması zor hatalara yol açacaktır.
Abel

20

Bu şekilde kullanıyorum, bu yerin belirttiğiniz dizinle aynı ada sahip uzantısız bir dosyada var olmasını önlemek için dizin adının sonuna ters eğik çizgi koymalısınız , çünkü "C: \ VTS" kullanmayın. adıyla bulunmaktadır "VTS" kaydedilen "C:" bölümü, doğru yolu kullanmaktır : "\ VTS \ C" , sonra ters eğik çizgi kontrol VTS çok doğru yoldur.

@echo off
@break off
@title Create folder with batch but only if it doesn't already exist - D3F4ULT
@color 0a
@cls

setlocal EnableDelayedExpansion

if not exist "C:\VTS\" (
  mkdir "C:\VTS\"
  if "!errorlevel!" EQU "0" (
    echo Folder created successfully
  ) else (
    echo Error while creating folder
  )
) else (
  echo Folder already exists
)

pause
exit

3
Çözümünüz için özellikle ilginç olan şey !errorlevel!, gecikmeli genişleme kullanmanızdır. Aksi takdirde, değişken ERRORLEVELbirinciye girmeden önce ayrıştırılır if(yani ayrıştırma zamanında). Şimdi yürütme zamanında ayrıştırılır, böylece sonucunu yakalayabilir mkdir. Varlığını test etseniz bile, yine de başarıyı test etmelisiniz (örneğin: erişim reddedildi hatası). Diğerlerine kıyasla çok iyi bir çözüm, +10 !!!
Abel

17

Kullanabilirsiniz:

if not exist "C:\VTS\" mkdir "C:\VTS"

Beklenen eksik dosyaları değiştirmek için kodu da genişletebilirsiniz.

if not exist "C:\VTS\important.file" echo. > "C:\VTS\important.file"

0

Bunu benim gözüm için kullandığım senaryom için yarattım.

:CREATES A CHECK VARIABLE

set lookup=0

:CHECKS IF THE FOLDER ALREADY EXIST"

IF EXIST "%UserProfile%\AppData\Local\CounterPath\RegNow Enhanced\default_user\" (set lookup=1)

:IF CHECK is still 0 which means does not exist. It creates the folder

IF %lookup%==0 START "" mkdir "%UserProfile%\AppData\Local\CounterPath\RegNow Enhanced\default_user\"
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.