Respostas:
@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.
if exist mydirname\
e o resto, como você diz. Como alternativa, você pode obter um test
binário e usá-lo no Windows.
mkdir
.
if not 1==1 echo hmm
ou se existe myDirName \ ELSE blahblahblah
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)
if exist dirname
que parece específica do Windows NT.
\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 ...)
Use uma barra invertida, não a barra: myDirName\nul
nã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
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>
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 ) ) )
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
)
MyDir
apó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
/ popd
e / ou setlocal
.
exist myDirName/nul
também é verdadeiro se myDirName for um arquivo, whis não é a funcionalidade pesquisada
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.
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"; } }
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.