Crie uma pasta com lote, mas apenas se ainda não existir


440

Alguém pode me dizer como fazer o seguinte em um script em lote do Windows? ( *.bat):

  • Crie uma pasta apenas se ela ainda não existir

Em mais detalhes, desejo criar uma pasta chamada VTSna C:\unidade, mas apenas se essa pasta ainda não existir. Não quero substituir o conteúdo da pasta, se ela já existir, e o lote for executado.


2
Que tal agora ? if not exist "%Folder%" mkdir "%New-Folder%"
scientist_7

Respostas:


622

Você apenas usa isto: if not exist "C:\VTS\" mkdir C:\VTSele criará um diretório apenas se a pasta não existir.

Observe que esse teste de existência retornará verdadeiro somente se o VTS existir e for um diretório. Se não estiver lá, ou como um arquivo, o comando mkdir será executado e deverá causar um erro. Convém verificar se o VTS também existe como um arquivo.


7
Exceto que está errado. Você precisa verificar o dispositivo NUL, caso contrário ele não funcionará. Veja minha resposta três anos antes desta.
Martin Schapendonk

@MartinSchapendonk Isso funciona no Windows 7 e no Windows Server 2012, tanto quanto posso constatar nos testes, e ficaria muito surpreso se não funcionasse pelo menos no XP e no Windows 10. Você pode fornecer as condições quando isso não funciona?
Jpmc26 10/03/16

12
@ jpmc26 testar NUL é garantir que você teste um diretório. Caso contrário, a condição poderá ser avaliada como verdadeira, mesmo que seja um arquivo regular. Essa é a diferença.
Martin Schapendonk 13/03

3
@MartinSchapendonk A adição de uma barra final é suficiente para isso? Isso parece fazer a distinção entre arquivos e diretórios corretamente, mas há um ponto fraco: se o arquivo não for detectado, a criação do diretório falhará. Suspeito que também seja um problema com os testes NUL.
Jpmc26 13/03/19

6
@ jpmc26 Você está certo, uma barra final faz o trabalho e é realmente preferível, pois trabalha com aspas (permitindo assim que você tenha espaços no caminho do diretório). Para distinguir entre um ou outro arquivo / diretório, isso vai funcionar: if exist "a" if not exist "a\" (echo "it's a file") else (echo "it's a dir"). Sobre sua última frase, suspeito que algo esteja errado com seu arquivo em lotes em outro lugar.
Marc.2377

221
if exist C:\VTS\NUL echo "Folder already exists"

if not exist C:\VTS\NUL echo "Folder does not exist"

Consulte também https://support.microsoft.com/en-us/kb/65994

(Atualização em 7 de março de 2018; Artigo da Microsoft em baixo, arquivo em https://web.archive.org/web/20150609092521/https://support.microsoft.com/en-us/kb/65994 )


12
Pessoalmente eu prefiro este, uma vez que não define% errorlevel% quando dir já existe (resposta de Agent_9191 retorna um código de erro de 1)
csauve

1
Também é bom e genérica e pode ser aplicado a qualquer outra ação que você quer fazer condicionalmente :)
John Humphreys - w00te

3
@YouHaveaBigEgo NULis with one L.
Martin Schapendonk

1
O link não funciona mais, mas há uma cópia no Internet Archive
fernio 6/18

3
Na verdade, embora esta resposta é grande, ele não responde à pergunta de "criar um diretório" :)
Jean-François T.

55

Basta ligar, mkdir C:\VTSnão importa o quê. Ele simplesmente informa que o subdiretório já existe.

Editar: como outros observaram, isso define o% ERRORLEVEL% se a pasta já existir. Se o seu lote (ou qualquer processo chamado) não se importar com o nível de erro, esse método funcionará bem. Como a pergunta não fez menção de evitar o nível de erro, esta resposta é perfeitamente válida. Ele atende às necessidades de criação da pasta, se ela não existir, e não substitui o conteúdo de uma pasta existente. Caso contrário, siga a resposta de Martin Schapendonk .


20
este é um mau comportamento devido a uma mensagem de erro / aviso inesperado.
precisa saber é o seguinte

10
Chamar algo de "perfeitamente válido" quando viola as melhores práticas é intelectualmente desonesto. Como outro exemplo: quando alguém lhe pergunta como evitar um determinado problema de segurança específico, sua resposta não deve ser "execute o computador como administrador", mesmo que a pergunta não especifique explicitamente o impacto mínimo na segurança como pré-requisito. :-)
Jouni Heikniemi 12/06

2
/ Melhores práticas @JouniHeikniemi s / preferências pessoais de Jouni
dss539

4
Nada de errado com Errorlevel ou errno. Eles são paradigmas de mensagens de erro específicos da plataforma e trabalham para o propósito para o qual foram criados. Mas não importa qual seja a plataforma ou a abordagem de mensagens, eu não recomendaria o padrão "tente fazer isso e recupere se falhar" quando você puder evitar facilmente - e, assim, documentar de maneira legível - o caso de erro comum. Portanto, acho que o estilo "se não existe" é superior. Mas não quero nem me importo em aprofundar um debate sobre a formação de melhores práticas. Eu não tinha intenção de ofender ninguém, só queria esclarecer meu voto negativo.
Jouni Heikniemi

4
O problema de simplesmente ignorar o erro é que você não sabe por que ele falhou. Pode ter falhado porque o diretório já existia, porque o usuário não tem permissões nesse diretório, porque o caminho pai não existia ou porque o disco falhou. "Criar se não existir" deve falhar em todos os casos, exceto no primeiro. Esta resposta resulta em um erro em todos os casos, no entanto. É por isso que não é adequado para um script em lote. -1
jpmc26

38
mkdir C:\VTS 2> NUL

crie uma pasta chamada VTSe faça a saída A subdirectory or file TEST already existspara NUL.

ou

(C:&(mkdir "C:\VTS" 2> NUL))&

alterar a letra de unidade para C:, mkdir, erro de saída para NULe executar o próximo comando.


Existe uma maneira de fazer isso funcionar no PowerShell? Parece não suportar NULcomo um arquivo de saída.
Aaron Franke

30
set myDIR=LOG
IF not exist %myDIR% (mkdir %myDIR%)

1
Como outros já apontaram e você pode ter visto na resposta mais votada, isso não funcionará se você tiver um arquivo nomeado log. É uma diferença sutil, mas levará a erros difíceis de encontrar nos seus scripts.
Abel

20

Eu uso dessa maneira, você deve colocar uma barra invertida no final do nome do diretório para evitar que exista um local em um arquivo sem extensão com o mesmo nome que o diretório especificado, nunca use "C: \ VTS" porque pode ser um arquivo existe com o nome "VTS" salvo na partição "C:" , a maneira correta é usar "C: \ VTS \" , verifique a barra invertida após o VTS , assim é o caminho certo.

@echo off
@break off
@title Create folder with batch but only if it doesn't already exist - D3F4ULT
@color 0a
@cls

setlocal EnableDelayedExpansion

if not exist "C:\VTS\" (
  mkdir "C:\VTS\"
  if "!errorlevel!" EQU "0" (
    echo Folder created successfully
  ) else (
    echo Error while creating folder
  )
) else (
  echo Folder already exists
)

pause
exit

3
O que é particularmente interessante para sua solução é que você usa !errorlevel!, ou seja, expansão atrasada. Caso contrário, a variável ERRORLEVELseria analisada antes de inserir a primeira if(ou seja, no momento da análise). Agora ele é analisado no tempo de execução, para capturar o resultado de mkdir. Você também está correto nisso, mesmo que teste a existência, ainda deve testar o sucesso (pense: erro de acesso negado, por exemplo). Solução muito boa em comparação com as outras, +10 !!!
Abel

17

Você pode usar:

if not exist "C:\VTS\" mkdir "C:\VTS"

Você também pode expandir o código para substituir os arquivos esperados ausentes.

if not exist "C:\VTS\important.file" echo. > "C:\VTS\important.file"

0

Eu criei isso para o meu script que eu uso no meu trabalho para eyebeam.

:CREATES A CHECK VARIABLE

set lookup=0

:CHECKS IF THE FOLDER ALREADY EXIST"

IF EXIST "%UserProfile%\AppData\Local\CounterPath\RegNow Enhanced\default_user\" (set lookup=1)

:IF CHECK is still 0 which means does not exist. It creates the folder

IF %lookup%==0 START "" mkdir "%UserProfile%\AppData\Local\CounterPath\RegNow Enhanced\default_user\"
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.