Como verificar se existe um diretório no Windows?

55

Eu gostaria de traduzir este script Linux / Bash para o shell do Windows:

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

Ele testa se um diretório existe e, se não, cria-o.

    
por Pietro 06.12.2010 / 17:36

8 respostas

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

Adicionado por Barlop

Enquanto o acima funciona para esta situação particular, o título diz sobre o teste especificamente para um diretório. O comentário de Phogg usando if exist mydirname\ em vez de if exist mydirname é o caminho. Algumas respostas usaram \ nul mas \ nul é problemático no NT. Não incluir uma barra invertida no final testará um arquivo ou diretório. Então, para um diretório, inclua a barra invertida.

    
por 06.12.2010 / 17:47
20

Aqui está o que acabei de descobrir:

Você pode testar se existe um arquivo nul; se o diretório existir, ele conterá um arquivo nul, se o arquivo nul não existir, o diretório não existe.

IF exist myDirName/nul ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)
    
por 06.12.2011 / 12:52
11

Use uma barra invertida, não uma barra: myDirName\nul não 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 é um diretório
- bar é um arquivo
- xyz não existe

edit: isso só funciona se o nome do diretório não contiver espaços

    
por 12.05.2012 / 17:36
5

Alguns sugeriram fazer \ nul, mas isso não parece funcionar de forma confiável no NT

C:\blah>md abc

C:\blah>if exist abc\nul echo yes
yes

C:\blah>if exist "abc\nul" echo yes

C:\blah>

link

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 a questão

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>
    
por 03.06.2014 / 13:10
4

Eu me perguntei por que o joe tinha um downvote, já que eu estava passando pelo mesmo tipo de problema no Windows 7, ou seja,

SE EXIST nome_do_arquivo \ NUL

estava retornando TRUE para arquivos e diretórios. Eu encontrei uma solução alternativa em www.robvanderwoude.com/battech_ifexistfolder.php e surgiu com uma versão revisada do laço 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 ) ) )
    
por 11.10.2013 / 13:29
1

Eu vejo muitos problemas com a diferenciação entre arquivos e pastas. Alguém tentou simplesmente fazer um cd nele depois de verificar se ele existe? Em seguida, o cd será bem-sucedido ou falhará.

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
)
    
por 03.06.2014 / 11:50
0
exist myDirName/nul

também é verdadeiro se myDirName for um arquivo, whis não é a funcionalidade pesquisada

    
por 04.05.2012 / 12:41
-1

Encontrar uma pasta não deve ser tão difícil. Minha solução, use 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";
   }
}
    
por 24.08.2018 / 20:31