Criando pasta numerada se já existir um com o mesmo nome usando um arquivo de lote

0

Atualmente, estou escrevendo um arquivo em lote do Windows que precisa verificar se existe uma pasta com o nome atual do computador. Se isso não acontecer, ele grava a pasta com o nome, mas se ela já estiver lá, ela anexa um número no final para que, no final, eu tenha uma pasta contendo nomes de pastas como essa

G:\logs\computer-1
G:\logs\computer-2
G:\logs\computer-3
G:\logs\...

até agora, eu tentei usar este pedaço de código

set usb=G:
SET logdir="%usb%\logs\%computername%"
FOR /L %%F IN (1,1,25) DO (
IF NOT EXIST "%usb%\logs\%computername%-%%F" (
md "%usb%\logs\%computername%-%%F"
SET logdir=%usb%\logs\%computername%-%%F)
goto :eof
)
ECHO %logdir%

mas tudo que consigo fazer é sair do loop, não é algo que eu queira fazer.

    
por Flaver-D 30.06.2017 / 21:48

2 respostas

1
setlocal

set dir=G:\logs\%computername%

set n=0
md "%dir%"||call :a %n%

rem rest of your script    

exit

rem the a label is set after the exit function to prevent it from
rem running in the actual script when it's not required.

:a
set /a n+=1
md "%dir%-%n%"||goto a
exit /b

Este script criará pastas numeradas da maneira que você descreveu.

Em lote, a sintaxe para set é set "foo=bar" . As cotações são necessárias quando as variáveis incluem caracteres de quebra de sintaxe, como & ou |. Espaços não exigem citações ao declarar variáveis. set foo="bar" define foo para "bar" .

    
por 30.06.2017 / 22:56
0

Opção 1 - Criando todas as pastas de uma vez

Com base no código inicial da sua pergunta, isso produzirá uma pasta com uma extensão (1 a max ), se ela ainda não existir em uma chamada:

SET usb=G:

SET logdir="%usb%\logs"

SET max=25

FOR /L %%F IN (1,1,%max%) DO (
    IF NOT EXIST "%logdir%\%computername%-%%F" ( 
    md "%logdir%\%computername%-%%F")
    )

Ex.

Opção2-Criandopastasincrementalmente

Comosegundaopção,asoluçãoabaixoadicionaráumaextensãodearquivoincrementalumavezporchamada(combasenonúmerototaldepastasnodiretório).Damesmaforma,desconsideraaspastasexistentes:

SETusb=G:SETlogdir="%usb%\logs"

FOR /f %%A IN ('dir /b /ad %logdir%^|find /c /v "" ') DO SET fcount=%%A

SET /a fcount+=1

IF NOT EXIST "%logdir%\%computername%-%%A" (
    MD "%logdir%\%computername%-%fcount%")

Ex.

Advertências

  • A primeira solução irá sempre produzir as pastas 1 até max .

  • A segunda solução tem uma fraqueza no fato de usar a contagem total de pastas em um diretório. Portanto, embora ele produza pastas com extensões numéricas e com nomes semelhantes, as sequências ordenadas verdadeiras sem intervalos (por exemplo, -1, -2, -3, -4 ...) exigem:

    • todos os nomes de pasta em um diretório precisam ser os mesmos.
    • quaisquer pastas adicionais (por exemplo, aquelas adicionadas manualmente) mantêm esta seqüência (ou seja, se computador-6 existir, a próxima pasta manualmente adicionada deve ser computer-7 ). / li>
por 01.07.2017 / 06:05