2010-12-06 16:36:13 +0000 2010-12-06 16:36:13 +0000
64
64

Come verificare se una directory esiste in Windows?

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

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

Verifica se una directory esiste, e se non la crea.

Risposte (9)

79
79
79
2010-12-06 16:47:52 +0000
@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 parla di test specifici per una directory. Il commento di Phogg che usa if exist mydirname @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 parla di test specifici per una directory. Il commento di Phogg che usa piuttosto che if exist mydirname è il modo. Alcune risposte hanno usato \nul ma \nul è problematico in NT. Non includendo un backslash di coda, il test verrà eseguito per un file o una directory. Quindi, per una directory, includere il trailing backslash.

21
21
21
2011-12-06 11:52:52 +0000

Ecco cosa ho appena scoperto:

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

IF exist myDirName/nul ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)
11
11
11
2012-05-12 15:36:37 +0000

Usare una barra indietro, non in avanti barra: myDirName\nul non myDirName/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 – bar è un file – xyz non esiste

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

5
5
5
2014-06-03 11:10:57 +0000

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

Riguardo alla 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
4
4
2013-10-11 11:29:44 +0000

Mi sono chiesto perché Joe ha avuto un downvote mentre stavo sperimentando lo stesso tipo di problema su Windows 7, cioè che

SE ESISTENTE nome file\NUL

ritornava 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 riveduta del DVF FOR loop:

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 ) ) )
1
1
1
2014-06-03 09:50:53 +0000

Vedo che molti hanno problemi a distinguere tra file e cartelle. Qualcuno ha provato semplicemente a cdarci dentro dopo averne controllato l'esistenza? Allora il cd avrà successo o fallirà.

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
)
0
0
0
2019-11-09 14:56:24 +0000

Preferisco usare dir /d | findstr \[\.\.\]:

2>nul dir /d "myDirName" | findstr \[\.\.\] >nul && echo= "ok" || mkDir myDirName&&echo= Is NOT dir

2>nul dir /d "myDirName" | findstr \[\.\.\] >nul && echo= "ok" || mkDir myDirName

Per creare se esiste o meno e per ignorare l'errore …

2>nul mkDir myDirName

Anche …

if exist "myDirName\." (echo/"ok") else mkdir myDirName

rem :: or direct create myDirName hidden/ignoring error
       2>nul mkdir myDirName & if exist "myDirName\." echo/ exist 
rem :: output: exist
0
0
0
2012-05-04 10:41:48 +0000
exist myDirName/nul

è vero anche se myDirName è un file, che non è la funzionalità ricercata

-1
-1
-1
2018-08-24 18:31:30 +0000

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

for($cnt=$#ARGV; $cnt\>=0; --$cnt) { if ( -d "$ARGV[$cnt]" ) { print "argv[$cnt]=$ARGV[$cnt] is a folder\n"; $dir = $ARGV[$cnt]; break; } else { print "argv[$cnt]=$ARGV[$cnt] is Not a folder\n"; } }