Como verificar se existe um diretório no Windows?


59

Gostaria de traduzir esse script Linux / Bash para o shell do Windows:

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

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


3
O comando real linux / bash seria simplesmente: mkdir -p myDirName. Depois de passar dias tentando traduzir scripts bash relativamente simples em batch-sh * t (atribuindo o resultado de uma função a uma variável?), Decidi fazer as pessoas instalarem o cygwin.
30513 Michael

Respostas:


73
@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 específica, o título diz sobre o teste especificamente para um diretório. O comentário de Phogg usando if exist mydirname\ao invés de if exist mydirnameé o caminho. Algumas respostas usaram \ nul, mas \ nul é problemático no NT. Não incluir uma barra invertida à direita testará um arquivo ou um diretório. Portanto, para um diretório, inclua a barra invertida à direita.


23
Isso está correto para testar a existência do arquivo, mas como você sabe que é um diretório? A resposta mais simples é if exist mydirname\ e o resto, como você diz. Como alternativa, você pode obter um testbinário e usá-lo no Windows.
Phdd #

@phogg: No contexto desta questão específica: se ela existe, mas é um arquivo, você ainda não pode mkdir.
grawity

@ grrawity: se existir, mas for um arquivo, o script provavelmente falhará mais tarde ao tentar usá-lo como um diretório, o que provavelmente não é o que você deseja.
Phogg 06/12/11

como posso verificar se não existe?
Sungguk Lim

11
@sunglim escrevendo `Se não existe myDirName \` da mesma forma if not 1==1 echo hmm ou se existe myDirName \ ELSE blahblahblah
barlop

20

Aqui está o que eu 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 existirá.

IF exist myDirName/nul ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)

2
+1 - isso funciona em todas as versões do Windows e do MS-DOS, diferente da simples, if exist dirnameque parece específica do Windows NT.
grawity

esse foi um código estúpido comparado ao linux mkdir -p myDirName: p
Kit Ho

6
Deve ser uma barra invertida, não uma barra invertida.
Nathan Garabedian

@rawrawity O que você acha disso, aparentemente, algum problema em fazer \ nul? dostips.com/forum/viewtopic.php?f=3&t=4913
barlop

@ Barlop: Eu acho que o cmd.exe é uma das piores linguagens de script existentes e que você deve usar o PowerShell ou outras alternativas, se possível. Quanto \nul, não é necessário no Windows NT mais, simples if exist "C:\Program Files (x86)"deve funcionar (a menos que você ainda está targetting Windows 98 ...)
grawity

11

Use uma barra invertida, não a barra: myDirName\nulnãomyDirName/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
- barra é um arquivo
- xyz não existe

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


5

Alguns sugeriram fazer \ nul, mas isso não parece funcionar de maneira 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>

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

4

Gostaria de saber por que Joe teve um voto negativo, pois eu estava enfrentando o mesmo tipo de problema no Windows 7, a saber:

SE EXISTIR nome do arquivo \ NUL

estava retornando VERDADEIRO para arquivos e diretórios. Encontrei uma solução alternativa em www.robvanderwoude.com/battech_ifexistfolder.php e criei uma versão revisada do loop FOR do 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 ) ) )

Essa foi a única solução que funcionou, obrigado. Adicionei "2> NUL" para evitar a mensagem de erro e alterei os valores de eco para 1 (o diretório existe), 0 (o diretório não existe), -1 (existe um arquivo com o mesmo nome) FOR% A IN (" C: \ temp \ foo \ HELLO WORLD5 ") DO @ (PUSHD"% A "2> NUL && (POPD & ECHO 1) || (SE EXISTIR% A (ECHO -1) OUTROS (ECHO 0
Christoph

(desculpe, eu não consegui formatar o código como código na resposta, apesar de ter tentado muitas coisas :-( até editar o comentário expirou após 5 minutos :-() #
Christoph

1

Vejo que muitos têm problemas com a diferenciação entre arquivos e pastas. Alguém tentou simplesmente entrar nele depois de verificar se existe? Então o cd terá êxito 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
)

(1) Se você for usar uma variável, use a variável Todas as ocorrências MyDirapós a primeira linha devem ser %MyDir%. (2) O cd ..não fará o que você deseja se %MyDir%for um nome de caminho em vários níveis (por exemplo, Pictures\cats) ou mesmo um nome de caminho absoluto (por exemplo, \Windows). Considere usar pushd/ popde / ou setlocal.
Scott

0
exist myDirName/nul

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


11
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>não sou fã de \ nul no NT, mas não é. Você deveria ter dado alguma saída.
barlop

-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] é uma pasta \ n";
      $ dir = $ ARGV [$ cnt];
      pausa;
   } outro {
      print "argv [$ cnt] = $ ARGV [$ cnt] não é uma pasta \ n";
   }
}

Eu não entendi
Pierre.Vriens
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.