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.