Crea una cartella con batch ma solo se non esiste già


441

Qualcuno può dirmi come fare quanto segue in uno script batch di Windows? ( *.bat):

  • Crea una cartella solo se non esiste già

Più in dettaglio, voglio creare una cartella denominata VTSsul C:\disco, ma solo se tale cartella non esiste già. Non voglio sovrascrivere il contenuto della cartella se esiste già e il batch viene eseguito.


2
Cosa ne pensi di questo ? if not exist "%Folder%" mkdir "%New-Folder%"
scientist_7,

Risposte:


622

Basta usare questo: if not exist "C:\VTS\" mkdir C:\VTScreerà una directory solo se la cartella non esiste.

Si noti che questo test di esistenza tornerà vero solo se VTS esiste ed è una directory. Se non è presente o è presente come file, verrà eseguito il comando mkdir e dovrebbe causare un errore. Potresti voler verificare se VTS esiste anche come file.


7
Solo che è sbagliato. Devi controllare il dispositivo NUL, altrimenti non funzionerà. Vedi la mia risposta tre anni prima di questa.
Martin Schapendonk,

@MartinSchapendonk Funziona su Windows 7 e Windows Server 2012 per quanto ne so dai test e sarei molto sorpreso se non funzionasse almeno su XP e fino a Windows 10. Puoi fornire le condizioni quando questo non funziona?
jpmc26

12
@ test jpmc26 per NUL è assicurarsi di provare per una directory. Altrimenti la condizione potrebbe essere considerata vera, anche se si tratta di un file normale. Questa è la differenza
Martin Schapendonk,

3
@MartinSchapendonk È sufficiente aggiungere una barra finale? Ciò sembra distinguere correttamente tra file e directory, ma c'è una debolezza nel fatto che se il file non viene rilevato, la creazione della directory fallirà. Sospetto che anche questo sia un problema con i test NUL.
jpmc26,

6
@ jpmc26 Hai ragione, una barra finale fa il lavoro ed è effettivamente preferibile poiché funziona con le virgolette (permettendoti così di avere spazi nel percorso della directory). Per distinguere tra una file / directory, questo funzionerà: if exist "a" if not exist "a\" (echo "it's a file") else (echo "it's a dir"). Circa la tua ultima frase, sospetto che qualcosa non vada nel tuo file batch altrove.
Marc.2377,

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

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

Vedi anche https://support.microsoft.com/en-us/kb/65994

(Aggiornamento del 7 marzo 2018; articolo di Microsoft non disponibile, archivio su https://web.archive.org/web/20150609092521/https://support.microsoft.com/en-us/kb/65994 )


12
Personalmente preferirei questo poiché non imposta% errorlevel% quando dir esiste già (la risposta di Agent_9191 restituisce un codice di errore di 1)
csauve,

1
È anche bello e generico e può essere applicato a qualsiasi altra azione che si desidera eseguire in modo condizionale :)
John Humphreys - w00te

3
@YouHaveaBigEgo NULè con una L.
Martin Schapendonk,

1
Il link non funziona più, ma ce n'è una copia nell'archivio Internet
Fernando

3
In realtà, sebbene questa risposta sia ottima, non risponde alla domanda di "creare una directory" :)
Jean-Francois T.

55

Chiama mkdir C:\VTSqualunque cosa. Riferirà semplicemente che la sottodirectory esiste già.

Modifica: come altri hanno notato, questo imposta% ERRORLEVEL% se la cartella esiste già. Se il batch (o qualsiasi processo che lo chiama) non si preoccupa del livello di errore, questo metodo funziona bene. Poiché la domanda non ha fatto menzione dell'evitare il livello di errore, questa risposta è perfettamente valida. Soddisfa le esigenze di creazione della cartella se non esiste e non sovrascrive il contenuto di una cartella esistente. Altrimenti segui la risposta di Martin Schapendonk .


20
si tratta di un comportamento errato a causa di un messaggio / avviso di errore imprevisto.
SeriousM

11
Definire qualcosa di "perfettamente valido" quando viola le migliori pratiche è intellettualmente disonesto. Come altro esempio: quando qualcuno ti chiede come evitare un determinato problema di sicurezza, la tua risposta non dovrebbe essere "eseguire il computer come amministratore" anche se la domanda non specifica esplicitamente l'impatto minimo sulla sicurezza come prerequisito. :-)
Jouni Heikniemi,

2
@JouniHeikniemi s / best practice / Preferenze personali di Jouni
dss539

4
Niente di sbagliato in Errorlevel o errno. Sono paradigmi di messaggistica di errore specifici della piattaforma e funzionano per lo scopo per cui sono stati creati. Indipendentemente dalla piattaforma o dall'approccio alla messaggistica, non consiglierei il modello "prova a farlo e ripristina se fallisce" quando puoi facilmente evitare - e quindi documentare in modo leggibile - il caso di errore comune. Quindi, trovo superiori gli approcci in stile "se non esiste". Ma non voglio né mi interessa approfondire troppo il dibattito sulla formazione delle migliori pratiche. Non avevo intenzione di offendere nessuno, volevo solo chiarire il mio voto negativo.
Jouni Heikniemi,

4
Il problema semplicemente ignorando l'errore è che non sai perché non è riuscito. Potrebbe non aver funzionato perché la directory esisteva già, perché l'utente non disponeva delle autorizzazioni per quella directory, perché il percorso padre non esisteva o perché il disco non funzionava. "Crea se non esiste" dovrebbe fallire in tutti i casi tranne il primo. Questa risposta provoca comunque un errore in tutti i casi. Ecco perché non è adatto per uno script batch. -1
jpmc26

38
mkdir C:\VTS 2> NUL

creare una cartella chiamata VTSe l'output A subdirectory or file TEST already existsin NUL.

o

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

cambiare la lettera dell'unità C:, mkdir, uscita Error su NULed eseguire il comando successivo.


C'è un modo per farlo funzionare in PowerShell? Non sembra supportare NULcome file di output.
Aaron Franke

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

1
Come altri hanno sottolineato e potresti aver visto nella risposta più votata, questo non funziona se hai un file chiamato log. È una differenza sottile, ma porterà a bug difficili da trovare nei tuoi script.
Abel,

20

Uso questo modo, dovresti mettere una barra rovesciata alla fine del nome della directory per evitare che il posto esista in un file senza estensione con lo stesso nome della directory specificata, non usare mai "C: \ VTS" perché può un file esiste con il nome "VTS" salvato nella partizione "C:" , il modo corretto è usare "C: \ VTS \" , controllare la barra rovesciata dopo il VTS , quindi è il modo giusto.

@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
Ciò che è particolarmente interessante della tua soluzione è che usi !errorlevel!, ad esempio, l'espansione ritardata. Altrimenti, la variabile ERRORLEVELverrebbe analizzata prima di inserire la prima if(cioè al momento dell'analisi). Ora viene analizzato al momento dell'esecuzione, quindi può catturare il risultato di mkdir. Sei anche corretto in questo, anche se testerai l'esistenza, dovresti comunque testare il successo (pensa: accesso negato errore, per esempio). Ottima soluzione rispetto alle altre, +10 !!!
Abele,

17

Puoi usare:

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

È inoltre possibile espandere il codice per sostituire eventuali file previsti mancanti.

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

0

l'ho creato per la mia sceneggiatura che uso nel mio lavoro per 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\"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.