¿Cómo comprobar si existe un directorio en Windows?
Me gustaría traducir este script de Linux/Bash al shell de Windows:
if test -d myDirName; then echo "ok"; else mkdir myDirName; fi
Comprueba si existe un directorio y si no lo crea.
Me gustaría traducir este script de Linux/Bash al shell de Windows:
if test -d myDirName; then echo "ok"; else mkdir myDirName; fi
Comprueba si existe un directorio y si no lo crea.
@echo off
IF exist myDirName ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)
Añadido por Barlop
Mientras que lo anterior funciona para esta situación particular, el título dice sobre la prueba específicamente para un directorio. El comentario de Phogg usando if exist mydirname
@echo off
IF exist myDirName ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)
`
Añadido por Barlop
Mientras que lo anterior funciona para esta situación particular, el título dice sobre la prueba específicamente para un directorio. El comentario de Phogg usando en lugar de if exist mydirname
es el camino. Algunas respuestas han usado ¹nulo pero ¹nulo es problemático en NT. Sin incluir una barra invertida, se probará para un archivo o un directorio. Así que, para un directorio, incluye la barra invertida.
Esto es lo que acabo de descubrir:
Puedes probar si existe un archivo nul; si el directorio existe contendrá un archivo nul, si el archivo nul no existe entonces el directorio no existe.
IF exist myDirName/nul ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)
Usa una barra invertida, no una barra adelante: myDirName\nul
no 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 es un directorio – bar es un archivo – xyz no existe
editar: esto solo funciona si el nombre del directorio no contiene espacios
Algunos han sugerido hacer \ ~ - nul, pero eso no parece funcionar de manera fiable en 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
Re la pregunta
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>
Me preguntaba por qué Joe tenía un voto negativo ya que estaba experimentando el mismo tipo de problema en Windows 7, a saber que
IF EXISTEN filename\NUL
estaba devolviendo VERDADERO tanto para los archivos como para los directorios. Encontré una solución alternativa en www.robvanderwoude.com/battech_ifexistfolder.php y encontré una versión revisada del bucle FOR del 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 ) ) )
Veo que muchos tienen problemas para diferenciar entre archivos y carpetas. ¿Alguien ha intentado simplemente grabar un CD después de comprobar que existe? Entonces el cd tendrá éxito o fallará.
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
)
Prefiero usar 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
Para crear si existe o no y para ignorar el error…
2>nul mkDir myDirName
También …
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
Encontrar una carpeta no debería ser tan difícil. Mi solución, usa 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"; } }