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

3

Estou escrevendo um arquivo em lotes para fazer algumas operações em computadores remotos no meu prédio. Eles são todos nomeados com o mesmo prefixo, mas o número no final muda (01–65). Eu tentei seguir um tutorial on-line para criar um loop de arquivo em lote com base em números e surgiu com isso:

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

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

    
por Canadian Luke 27.10.2014 / 18:58

4 respostas

8

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 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 momento da execução.

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

Agora, prefixar com 0, conforme necessário.

Como você nunca precisa de mais do que um único 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 for maior que 2 dígitos. Uma solução mais geral é adicionar uma sequência de zeros n com o comprimento desejado e, em seguida, usar uma operação de substring para manter os dígitos n mais à 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 facilmente estender essa solução para praticamente qualquer número de zeros iniciais.

    
por 27.10.2014 / 19:12
0

Eu faria assim:

  • Adicione "0" a cada número (assim, "01", mas também "065")
  • Substring últimos 2 caracteres desta string

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

SET string=abcd 
echo %string% 
SET string2=%string:~-2%
echo %string2%
    
por 27.10.2014 / 19:04
0

Usando o ZtreeWin , navegue até o diretório correto pressionando \ e, em seguida, pressione Enter para entrar no diretório onde você pode Ctrl T marcar os arquivos que deseja renomear e então Ctrl R para renomeá-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 será permanecem inalterados.

Marcando seus arquivos:

Renomeandoseusarquivos:

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

    
por 23.08.2016 / 18:38
0

Nada de novo na resposta do @dbenham, apenas fizemos algumas das variáveis de valores coletadas da linha de comando e colocando aqui para facilitar a cópia e a colagem - o crédito é tudo @ dbenham's 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!
)
    
por 13.07.2017 / 20:24