Como posso zerar números em um loop Batch FOR?

Como posso zerar números em um loop Batch FOR?

Estou escrevendo um arquivo em lote para realizar algumas operações em computadores remotos do meu prédio. Todos eles são nomeados com o mesmo prefixo, mas o número no final muda (01–65). Tentei seguir um tutorial on-line para criar um loop de arquivo em lote baseado em números e descobri o seguinte:

FOR /l %%N in (1,1,65) do (
    set HOSTNAMETOUSE=prefix-%%N
    ECHO %HOSTNAMETOUSE%
)

Isso funciona muito bem depois de atingir 10, pois são dois dígitos. O que preciso é que os números 1-9apareçam como 01-09, pois isso corresponde ao nosso esquema de nomenclatura. Essencialmente, preciso de um dígito zero à esquerda para as primeiras 9 iterações.Como posso fazer isso com arquivos em lote do Windows?

Responder1

Seu código postado não pode funcionar porque %HOSTNAMETOUSE%é expandido quando a instrução é analisada, e todo o bloco entre parênteses é analisado em uma única passagem, antes que o loop seja executado. Portanto, o valor expandido é constante para todas as iterações.

Você deve usar a expansão atrasada para obter o valor no tempo de execução.

@echo off
setlocal enableDelayedExpansion
FOR /l %%N in (1,1,65) do (
    set HOSTNAMETOUSE=prefix-%%N
    ECHO !HOSTNAMETOUSE!
)

Agora, prefixe 0 conforme necessário.

Como você nunca precisa de mais do que um 0, você pode usar uma instrução IF.

@echo off
setlocal enableDelayedExpansion
FOR /l %%N in (1,1,65) do (
    if %%N lss 10 (set HOSTNAMETOUSE=prefix-0%%N) else set HOSTNAMETOUSE=prefix-%%N
    ECHO !HOSTNAMETOUSE!
)

Mas isso não é conveniente se a largura do seu número tiver mais de 2 dígitos. Uma solução mais geral é adicionar uma sequência denzeros com o comprimento desejado e, em seguida, use uma operação de substring para manter onmaioria dos dígitos à direita.

@echo off
setlocal enableDelayedExpansion
FOR /l %%N in (1,1,65) do (
    set "n=00%%N"
    set "HOSTNAMETOUSE=!n:~-2!
    ECHO !HOSTNAMETOUSE!
)

Você pode estender facilmente esta solução para praticamente qualquer número de zeros à esquerda.

Responder2

Eu faria assim:

  • Adicione '0' a cada número (então '01' mas também '065')
  • Substring últimos 2 caracteres desta string

Como você substring em arquivo em lote (2 últimos caracteres):

SET string=abcd 
echo %string% 
SET string2=%string:~-2%
echo %string2%

Responder3

Nada de novo na resposta de @dbenham, apenas criei algumas das variáveis ​​​​de valores coletadas na linha de comando e colocadas aqui para facilitar o copiar e colar - o crédito é todo do @dbenham acima:

set first=%1
set last=%2
set len=%3
setlocal EnableDelayedExpansion
FOR /l %%N in (%first%, 1, %last%) do (
    set "n=0000000000000%%N"
    set "padded=!n:~-%len%!
    echo !padded!
)

Responder4

UsandoZtreeWin, navegue até o diretório correto pressionando \e pressione Enterpara entrar no diretório onde você pode CtrlTmarcar os arquivos que deseja renomear e, em seguida, CtrlRrenomeá-los para????<0>*.*

Por exemplo:

foo-0-bar.jpg -> foo-00-bar.jpg
foo-1-bar.jpg -> foo-01-bar.jpg
foo-2-bar.jpg -> foo-02-bar.jpg
...

No exemplo acima, ????representa os primeiros 4 caracteres (foo-), <0>insere um zero na 5ª posição e *.*representa o restante do nome do arquivo (-bar.jpg) que permanecerá inalterado.

Marcando seus arquivos:

insira a descrição da imagem aqui

Renomeando seus arquivos:

insira a descrição da imagem aqui

ZTreeWiné um poderoso gerenciador de arquivos e diretórios em modo texto de 32 e 64 bits, modelado de perto no lendário XTreeGold(tm), mas aprimorado para os sistemas operacionais populares de hoje.

informação relacionada