Come verificare se esiste una directory in Windows?


59

Vorrei tradurre questo script Linux / Bash nella shell di Windows:

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

Verifica se esiste una directory e, in caso contrario, la crea.


3
Il comando effettivo linux / bash sarebbe semplicemente: mkdir -p myDirName. Dopo aver trascorso giorni a cercare di tradurre bash-script relativamente semplici in batch-sh * t (assegnando il risultato di una funzione a una variabile?), Ho deciso di far installare cygwin alle persone.
michael

Risposte:


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

Aggiunto da Barlop

Mentre quanto sopra funziona per questa particolare situazione, il titolo dice del test specifico per una directory. Il commento di Phogg usando if exist mydirname\piuttosto che if exist mydirnameè il modo. Alcune risposte hanno usato \ nul ma \ nul è problematico in NT. Non includere una barra rovesciata finale per verificare un file o una directory. Quindi, per una directory, includere la barra rovesciata finale.


23
Questo è corretto per testare l'esistenza dei file, ma come fai a sapere che si tratta di una directory? La risposta più semplice è if exist mydirname\ e il resto come dici tu. In alternativa, potresti effettivamente ottenere un file testbinario e utilizzarlo su Windows.
Phogg

@phogg: nel contesto di questa domanda specifica: se esiste ma è un file, non è ancora possibile mkdir.
Grawity il

@grawity: se esiste ma è un file, lo script probabilmente fallirà in seguito quando si tenta di utilizzarlo come directory, che probabilmente non è quello che si desidera.
phogg,

come posso verificare se non esiste?
Sungguk Lim

1
@sunglim scrivendo `Se non esiste myDirName \` in modo simile if not 1==1 echo hmm o se esiste myDirName \ ELSE blahblahblah
barlop

20

Ecco cosa ho appena scoperto:

È possibile verificare se esiste un file nul; se la directory esiste, conterrà un file nul, se il file nul non esiste, la directory non esiste.

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

2
+1: funziona in tutte le versioni di Windows e MS-DOS, a differenza del semplice if exist dirnameche sembra essere specifico di Windows NT.
Grawity il

quello era un codice stupido paragonabile a Linux mkdir -p myDirName: p
Kit Ho

6
Dovrebbe essere una barra rovesciata, non una barra.
Nathan Garabedian,

@grawity Cosa ne pensi di questo, apparentemente qualche problema con fare \ nul? dostips.com/forum/viewtopic.php?f=3&t=4913
barlop

@barlop: Penso che cmd.exe sia uno dei peggiori linguaggi di scripting esistenti e che si dovrebbe usare PowerShell o altre alternative, se possibile. Per quanto riguarda \nul, non è più necessario in Windows NT, plain if exist "C:\Program Files (x86)"dovrebbe funzionare (a meno che non si stia ancora
prendendo di mira

11

Usa una barra rovesciata, non una barra rovesciata: myDirName\nulnomyDirName/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 è una directory
- la barra è un file
- xyz non esiste

modifica: funziona solo se il nome della directory non contiene spazi


5

Alcuni hanno suggerito di fare \ nul, ma questo non sembra funzionare in modo affidabile in 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

Per quanto riguarda la domanda

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

Mi chiedevo perché Joe avesse un downvote dato che stavo vivendo lo stesso tipo di problema su Windows 7, vale a dire quello

IF EXIST nomefile \ NUL

stava restituendo VERO sia per i file che per le directory. Ho trovato una soluzione alternativa su www.robvanderwoude.com/battech_ifexistfolder.php e ho trovato una versione rivista del ciclo FOR di 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 ) ) )

Questa è stata l'unica soluzione che ha funzionato, grazie. Ho aggiunto un "2> NUL" per evitare il messaggio di errore e ho cambiato i valori dell'eco in 1 (la directory esiste), 0 (la directory non esiste), -1 (esiste un file con lo stesso nome) FOR% A IN (" C: \ temp \ foo \ HELLO WORLD5 ") DO @ (PUSHD"% A "2> NUL && (POPD & ECHO 1) || (IF EXIST% A (ECHO -1) ELSE (ECHO 0
Christoph

(scusate, non sono riuscito a formattare il codice come codice nella risposta anche se ho provato tante cose :-( fino alla modifica del timeout del commento scaduto dopo 5 minuti :-()
Christoph

1

Vedo che molti hanno problemi con la differenziazione tra file e cartelle. Qualcuno ha provato a inserirlo semplicemente dopo aver verificato che esiste? Quindi il cd avrà esito positivo o negativo.

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) Se hai intenzione di usare una variabile, usa la variabile. Tutte le occorrenze di MyDirdopo la prima riga dovrebbero essere %MyDir%. (2) Il cd ..non farà quello che vuoi se %MyDir%è un nome di percorso multi-livello (ad es. Pictures\cats) O anche un nome di percorso assoluto (ad es \Windows.). Valuta di usare pushd/ popde / o setlocal.
Scott,

0
exist myDirName/nul

è vero anche se myDirName è un file, perché non è la funzionalità cercata


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>non sono un fan di \ nul in NT ma non lo è. Avresti dovuto dare un risultato.
barlop

-1

Trovare una cartella non dovrebbe essere così difficile. La mia soluzione, usa perl:

per ($ cnt = $ # ARGV; $ cnt> = 0; - $ cnt)
{
   if (-d "$ ARGV [$ cnt]") { 
      print "argv [$ cnt] = $ ARGV [$ cnt] è una cartella \ n";
      $ dir = $ ARGV [$ cnt];
      rompere;
   } altro {
      print "argv [$ cnt] = $ ARGV [$ cnt] non è una cartella \ n";
   }
}

Non capisco
Pierre.Vriens
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.