Como verificar se existe um directório no Windows?
Gostaria de traduzir este script Linux/Bash para o Windows shell:
if test -d myDirName; then echo "ok"; else mkdir myDirName; fi
Testa se existe um directório e se não existe, e se não o cria.
Gostaria de traduzir este script Linux/Bash para o Windows shell:
if test -d myDirName; then echo "ok"; else mkdir myDirName; fi
Testa se existe um directório e se não existe, e se não o cria.
@echo off
IF exist myDirName ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)
Adicionado por Barlop
Embora o acima exposto funcione para esta situação específica, o título diz respeito a testes especificamente para um directório. O comentário de Phogg usando if exist mydirname
@echo off
IF exist myDirName ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)
`
Adicionado por Barlop
Embora o acima exposto funcione para esta situação específica, o título diz respeito a testes especificamente para um directório. O comentário de Phogg usando em vez de if exist mydirname
é o caminho. Algumas respostas têm usado \nul mas \nul é problemático no NT. A não inclusão de uma barra invertida de rastreio irá testar para um ficheiro ou directório. Portanto, para um directório, inclua a barra invertida.
Aqui está o que acabei de descobrir:
Pode testar se existe um ficheiro nul; se o directório existir conterá um ficheiro nul, se o ficheiro nul não existir então o directório não existe.
IF exist myDirName/nul ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)
Use uma barra invertida, não uma barra oblíqua frontal: 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 directório – bar é um ficheiro – xyz não existe
editar: isto só funciona se o nome do directório não contiver espaços
Alguns sugeriram fazer \nul, mas isso não parece funcionar de forma fiável em 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 the question
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>
Eu me perguntava por que Joe tinha um downvote porque eu estava tendo o mesmo tipo de problema no Windows 7, a saber, que
SE EXISTENTE nome de arquivo\NUL
estava devolvendo TRUE tanto para arquivos quanto para diretórios. Encontrei uma solução alternativa em www.robvanderwoude.com/battech_ifexistfolder.php e cheguei a uma versão revista dos DVF’s FOR loop:
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 ficheiros e pastas. Alguém já tentou simplesmente cditar para ele depois de verificar a sua existência? Então o cd terá sucesso 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
)
Prefiro 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 criar se existe ou não e para ignorar o erro…
2>nul mkDir myDirName
Também …
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 uma pasta não deve ser assim tão difícil. A 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"; } }