Buat folder dengan batch tetapi hanya jika belum ada


440

Adakah yang bisa memberitahu saya bagaimana melakukan hal berikut dalam skrip batch Windows? ( *.bat):

  • Buat folder hanya jika belum ada

Secara lebih rinci, saya ingin membuat folder bernama VTSdi C:\drive, tetapi hanya jika folder itu belum ada. Saya tidak ingin menimpa isi folder jika sudah ada dan batch dijalankan.


2
Bagaimana dengan ini ? if not exist "%Folder%" mkdir "%New-Folder%"
scientist_7

Jawaban:


622

Anda hanya menggunakan ini: if not exist "C:\VTS\" mkdir C:\VTSia akan membuat direktori hanya jika folder tidak ada.

Perhatikan bahwa tes keberadaan ini akan mengembalikan true hanya jika VTS ada dan merupakan direktori. Jika tidak ada di sana, atau ada sebagai file, perintah mkdir akan berjalan, dan harus menyebabkan kesalahan. Anda mungkin ingin memeriksa apakah VTS juga ada sebagai file.


7
Kecuali itu salah. Anda harus memeriksa perangkat NUL, jika tidak, perangkat itu tidak akan berfungsi. Lihat jawaban saya tiga tahun lebih awal dari yang ini.
Martin Schapendonk

@MartinSchapendonk Ini berfungsi pada Windows 7 dan Windows Server 2012 sejauh yang saya tahu dari pengujian, dan saya akan sangat terkejut jika tidak bekerja setidaknya kembali ke XP dan hingga Windows 10. Dapatkah Anda memberikan kondisi saat ini tidak berhasil?
jpmc26

12
@ jpmc26 menguji untuk NUL adalah untuk memastikan Anda menguji direktori. Kalau tidak, syaratnya mungkin bernilai true, bahkan itu adalah file biasa. Itulah bedanya.
Martin Schapendonk

3
@ MartinSchapendonk Apakah menambahkan garis miring cukup untuk itu? Itu tampaknya membedakan antara file dan direktori dengan benar, tetapi ada kelemahan bahwa jika file tidak terdeteksi, pembuatan direktori akan gagal. Saya menduga ini juga masalah dengan pengujian NUL.
jpmc26

6
@ jpmc26 Anda benar, garis miring melakukan pekerjaan dan sebenarnya lebih disukai karena bekerja dengan tanda kutip (sehingga memungkinkan Anda memiliki spasi di jalur direktori). Untuk membedakan antara baik file / direktori, ini akan bekerja: if exist "a" if not exist "a\" (echo "it's a file") else (echo "it's a dir"). Tentang kalimat terakhir Anda, saya curiga ada yang salah dengan file batch Anda di tempat lain.
Marc.2377

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

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

Lihat juga https://support.microsoft.com/en-us/kb/65994

(Pembaruan 7 Maret 2018; Artikel Microsoft sedang down, arsipkan di https://web.archive.org/web/20150609092521/https://support.microsoft.com/en-us/kb/65994 )


12
Secara pribadi saya lebih suka ini karena tidak mengatur% errorlevel% ketika dir sudah ada (jawaban Agent_9191 mengembalikan kode kesalahan 1)
csauve

1
Ini juga bagus dan generik dan dapat diterapkan untuk setiap tindakan lain yang ingin Anda lakukan secara kondisional :)
John Humphreys - w00te

3
@YouHaveaBigEgo NULbersama satu L.
Martin Schapendonk

1
Tautan tidak lagi berfungsi, tetapi ada salinan di Internet Archive
fernio

3
Sebenarnya, meskipun jawaban ini bagus, itu tidak menjawab pertanyaan untuk "membuat direktori" :)
Jean-Francois T.

55

Panggil saja mkdir C:\VTSapa pun yang terjadi. Ini hanya akan melaporkan bahwa subdirektori sudah ada.

Sunting: Seperti yang telah dicatat orang lain, ini tidak mengatur% ERRORLEVEL% jika folder sudah ada. Jika kumpulan Anda (atau proses apa pun menyebutnya) tidak peduli dengan tingkat kesalahan, metode ini berfungsi dengan baik. Karena pertanyaan tidak menyebutkan menghindari tingkat kesalahan, jawaban ini sangat valid. Ini memenuhi kebutuhan membuat folder jika tidak ada, dan itu tidak menimpa isi folder yang ada. Kalau tidak, ikuti jawaban Martin Schapendonk .


20
ini adalah perilaku buruk karena pesan / peringatan kesalahan yang tidak terduga.
SeriousM

11
Menyebut sesuatu "sah-sah saja" ketika melanggar praktik terbaik secara intelektual tidak jujur. Sebagai contoh lain: Ketika seseorang bertanya kepada Anda bagaimana menghindari masalah keamanan spesifik tertentu, jawaban Anda tidak boleh "menjalankan komputer sebagai administrator" bahkan jika pertanyaannya tidak secara eksplisit menentukan dampak keamanan minimum sebagai prasyarat. :-)
Jouni Heikniemi

2
@JouniHeikniemi s / best practices / Preferensi pribadi Jouni
dss539

4
Tidak ada yang salah dengan Errorlevel atau errno. Mereka adalah paradigma pesan kesalahan spesifik platform, dan mereka bekerja untuk tujuan yang telah mereka bangun. Tetapi apa pun pendekatan platform atau pengiriman pesannya, saya tidak akan merekomendasikan pola "coba lakukan ini dan pulihkan jika gagal" ketika Anda dapat dengan mudah menghindari - dan dengan demikian mendokumentasikan - kasus kesalahan umum. Oleh karena itu, saya menemukan pendekatan gaya "jika tidak ada" lebih unggul. Tapi, saya tidak ingin atau terlalu peduli untuk berdebat tentang pembentukan praktik terbaik. Saya tidak bermaksud menyinggung siapa pun, hanya ingin mengklarifikasi downvote saya.
Jouni Heikniemi

4
Masalah dengan hanya mengabaikan kesalahan adalah bahwa Anda tidak tahu mengapa itu gagal. Itu bisa saja gagal karena direktori sudah ada, karena pengguna tidak memiliki izin pada direktori itu, karena jalur induk tidak ada, atau karena disk gagal. "Buat jika tidak ada" harus gagal dalam semua kasus kecuali yang pertama. Namun, jawaban ini menghasilkan kesalahan dalam semua kasus. Itu sebabnya tidak cocok untuk skrip batch. -1
jpmc26

38
mkdir C:\VTS 2> NUL

membuat folder bernama VTSdan output A subdirectory or file TEST already existsuntuk NUL.

atau

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

mengubah huruf drive untuk C:, mkdir, kesalahan output ke NULdan menjalankan perintah selanjutnya.


Apakah ada cara untuk membuat ini berfungsi di PowerShell? Tampaknya tidak mendukung NULsebagai file keluaran.
Aaron Franke

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

1
Seperti yang telah ditunjukkan orang lain dan Anda mungkin telah melihat jawaban berperingkat teratas, ini tidak berfungsi jika Anda memiliki file dengan nama log. Perbedaannya sangat tipis, tetapi akan menyebabkan bug yang sulit ditemukan di skrip Anda.
Abel

20

Saya menggunakan cara ini, Anda harus meletakkan backslash di akhir nama direktori untuk menghindari tempat itu ada dalam file tanpa ekstensi dengan nama yang sama dengan direktori yang Anda tentukan, jangan pernah gunakan "C: \ VTS" karena bisa file ada dengan nama "VTS" disimpan di "C:" partisi, cara yang benar adalah dengan menggunakan "C: \ VTS \" , periksa backslash setelah VTS , begitu juga cara yang benar.

@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
Apa yang sangat menarik dari solusi Anda, adalah bahwa Anda menggunakan !errorlevel!, yaitu, ekspansi tertunda. Jika tidak, variabel ERRORLEVELakan diuraikan sebelum memasukkan yang pertama if(yaitu, pada waktu parse). Sekarang diuraikan pada waktu eksekusi, sehingga dapat menangkap hasil mkdir. Anda juga benar dalam hal itu, meskipun Anda menguji keberadaan, Anda harus tetap menguji keberhasilan (pikirkan: akses ditolak kesalahan, misalnya). Solusi yang sangat bagus dibandingkan yang lain, +10 !!!
Abel

17

Kamu bisa menggunakan:

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

Anda juga dapat memperluas kode untuk mengganti file yang diharapkan hilang.

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

0

saya membuat ini untuk skrip saya gunakan dalam pekerjaan saya untuk eyebeam.

: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\"
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.