¿Cómo verificar si existe un directorio en Windows?


59

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 existe, lo crea.


3
El comando real Linux / bash sería simplemente: mkdir -p myDirName. Después de pasar días tratando de traducir bash-scripts relativamente simples a batch-sh * t (¿asignar el resultado de una función a una variable?), He decidido hacer que la gente instale cygwin.
michael

Respuestas:


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

Añadido por Barlop

Si bien lo anterior funciona para esta situación particular, el título dice acerca de las pruebas específicas para un directorio. El comentario de Phogg usando en if exist mydirname\lugar de if exist mydirnamees el camino. Algunas respuestas han usado \ nul pero \ nul es problemático en NT. Si no se incluye una barra diagonal inversa posterior, se probará un archivo o un directorio. Entonces, para un directorio, incluya la barra invertida final.


23
Esto es correcto para probar la existencia del archivo, pero ¿cómo sabe que es un directorio? La respuesta más simple es if exist mydirname\ y el resto como dices. Alternativamente, podría obtener un testbinario y usarlo en Windows.
phogg

@phogg: en el contexto de esta pregunta específica: si existe pero es un archivo, aún no puede mkdirhacerlo.
Grawity

@grawity: si existe pero es un archivo, el script probablemente fallará más tarde cuando intente usarlo como un directorio, lo que probablemente no sea lo que desea.
phogg

¿Cómo puedo verificar si no existe?
Sungguk Lim

1
@sunglim escribiendo `Si no existe myDirName \` de manera similar if not 1==1 echo hmm o si existe myDirName \ ELSE blahblahblah
barlop

20

Esto es lo que acabo de descubrir:

Puede 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)

2
+1: esto funciona en todas las versiones de Windows y MS-DOS, a diferencia del simple if exist dirnameque parece ser específico de Windows NT.
Grawity

eso fue un código estúpido en comparación con Linux mkdir -p myDirName: p
Kit Ho

66
Debería ser una barra diagonal inversa, no una barra diagonal.
Nathan Garabedian

@grawity ¿Qué piensas de esto, aparentemente, algún problema con hacer \ nul? dostips.com/forum/viewtopic.php?f=3&t=4913
barlop

@barlop: Creo que cmd.exe es uno de los peores lenguajes de scripting que existen, y que uno debería usar PowerShell u otras alternativas si es posible. En cuanto a \nul, ya no es necesario en Windows NT, simplemente if exist "C:\Program Files (x86)"debería funcionar (a menos que todavía esté apuntando a Windows 98 ...)
Grawity

11

Utilice una barra diagonal inversa, no barra diagonal: 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 es un directorio
- la barra es un archivo
- xyz no existe

editar: esto solo funciona si el nombre del directorio no contiene espacios


5

Algunos han sugerido hacer \ nul, pero eso no parece funcionar de manera confiable 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>

4

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

SI EXISTEN nombre de archivo \ NUL

estaba devolviendo VERDADERO para ambos archivos y directorios. Encontré una solución alternativa en www.robvanderwoude.com/battech_ifexistfolder.php y se me ocurrió una versión revisada del bucle FOR de 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 ) ) )

Esa fue la única solución que funcionó, gracias. Agregué un "2> NUL" para evitar el mensaje de error y cambié los valores de eco a 1 (el directorio existe), 0 (el directorio no existe), -1 (existe un archivo con el mismo nombre) PARA% A IN (" C: \ temp \ foo \ HELLO WORLD5 ") DO @ (PUSHD"% A "2> NUL && (POPD & ECHO 1) || (IF EXIST% A (ECHO -1) ELSE (ECHO 0
Christoph

(lo siento, no pude formatear el código como código en la respuesta, aunque intenté muchas cosas :-( hasta que edité el comentario en 5 minutos :-()
Christoph

1

Veo que muchos tienen problemas para diferenciar entre archivos y carpetas. ¿Alguien ha intentado simplemente cd en él después de comprobar que existe? Entonces 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
)

(1) Si va a usar una variable, use la variable. Todas las ocurrencias MyDirposteriores a la primera línea deben ser %MyDir%. (2) cd ..No hará lo que quiera si %MyDir%es un nombre de ruta de varios niveles (por ejemplo, Pictures\cats) o incluso un nombre de ruta absoluto (por ejemplo, \Windows). Considere usar pushd/ popdy / o setlocal.
Scott

0
exist myDirName/nul

también es cierto si myDirName es un archivo, whis no es la funcionalidad buscada


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>No soy fanático de \ nul en NT pero no lo es. Deberías haber dado alguna salida.
barlop

-1

Encontrar una carpeta no debería ser tan difícil. Mi solución, usa perl:

para ($ cnt = $ # ARGV; $ cnt> = 0; - $ cnt)
{
   if (-d "$ ARGV [$ cnt]") { 
      print "argv [$ cnt] = $ ARGV [$ cnt] es una carpeta \ n";
      $ dir = $ ARGV [$ cnt];
      rotura;
   } más {
      print "argv [$ cnt] = $ ARGV [$ cnt] no es una carpeta \ n";
   }
}

No lo entiendo
Pierre.Vriens
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.