¿Cómo puedo rellenar con ceros los números en un bucle FOR por lotes?

¿Cómo puedo rellenar con ceros los números en un bucle FOR por lotes?

Estoy escribiendo un archivo por lotes para realizar algunas operaciones en computadoras remotas de mi edificio. Todos se nombran con el mismo prefijo, pero el número al final cambia (01–65). Intenté seguir un tutorial en línea para crear un bucle de archivos por lotes basado en números y se me ocurrió esto:

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

Esto funciona muy bien después de llegar a 10, ya que entonces son dos dígitos. Lo que necesito es que los números 1-9aparezcan como 01-09, ya que coincide con nuestro esquema de nomenclatura. Básicamente, necesito el dígito único del cero inicial para las primeras 9 iteraciones.¿Cómo puedo lograr esto con los archivos por lotes de Windows?

Respuesta1

Es posible que el código publicado no funcione porque %HOSTNAMETOUSE%se expande cuando se analiza la declaración y todo el bloque entre paréntesis se analiza de una sola vez, antes de ejecutar el bucle. Entonces el valor expandido es constante para todas las iteraciones.

Debe utilizar la expansión retrasada para obtener el valor en el momento de la ejecución.

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

Ahora prefije 0 según sea necesario.

Como nunca necesitas más de un 0, puedes usar una declaración 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!
)

Pero eso no es conveniente si el ancho de su número tiene más de 2 dígitos. Una solución más general es agregar una cadena denorteceros con la longitud deseada y luego use una operación de subcadena para mantener lanortederecha la mayoría de los dígitos.

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

Puede ampliar fácilmente esta solución a prácticamente cualquier número de ceros a la izquierda.

Respuesta2

Yo haría esto así:

  • Agregue '0' a cada número (es decir, '01' pero también '065')
  • Subcadena los últimos 2 caracteres de esta cadena

¿Cómo se crea una subcadena en un archivo por lotes (2 últimos caracteres)?

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

Respuesta3

No hay nada nuevo en la respuesta de @dbenham, solo creé algunas de las variables de valores recopiladas de la línea de comando y las puse aquí para facilitar copiar y pegar; el crédito es todo lo anterior de @dbenham:

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!
)

Respuesta4

UsandoZtreeWin, navegue hasta el directorio correcto presionando \, luego presione Enterpara ingresar al directorio donde puede CtrlTetiquetar los archivos que desea cambiar de nombre y luego CtrlRcambiarles el nombre a????<0>*.*

Por ejemplo:

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

En el ejemplo anterior, ????representa los primeros 4 caracteres (foo-), <0>inserta un cero en la quinta posición y *.*representa el resto del nombre del archivo (-bar.jpg) que permanecerá sin cambios.

Etiquetando sus archivos:

ingrese la descripción de la imagen aquí

Cambiar el nombre de sus archivos:

ingrese la descripción de la imagen aquí

ZTreeWines un potente administrador de archivos y directorios en modo texto de 32 y 64 bits, inspirado en el legendario XTreeGold(tm), pero mejorado para los sistemas operativos más populares de la actualidad.

información relacionada