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.
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.
@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.
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)
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
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>
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 ) ) )
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
)
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
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"; } }