3

Я пишу командный файл для выполнения некоторых операций на удаленных компьютерах в моем здании. Все они названы с одинаковым префиксом, но номер в конце меняется (01–65). Я попытался следовать интерактивному руководству по созданию цикла пакетного файла на основе чисел и придумал следующее:

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

Это прекрасно работает после того, как он достигает 10, а затем это две цифры. Мне нужно, чтобы числа 1-9 отображались как 01-09 , поскольку это соответствует нашей схеме именования. По сути, мне нужна единственная цифра ведущего нуля для первых 9 итераций. Как я могу сделать это с помощью пакетных файлов Windows?

4 ответа4

8

Ваш опубликованный код не может работать, потому что %HOSTNAMETOUSE% раскрывается при синтаксическом анализе оператора, а весь заключенный в скобки блок анализируется за один проход до выполнения цикла. Таким образом, расширенное значение является постоянным для всех итераций.

Вы должны использовать отложенное расширение, чтобы получить значение по времени выполнения.

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

Теперь префикс с 0 по мере необходимости.

Поскольку вам не нужно больше одного 0, вы можете использовать оператор 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!
)

Но это не удобно, если ширина вашего номера превышает 2 цифры. Более общее решение состоит в том, чтобы добавить строку из n нулей желаемой длины, а затем использовать операцию с подстрокой, чтобы оставить n правых большинства цифр.

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

Вы можете легко расширить это решение практически до любого числа ведущих нулей.

0

Ничего нового в ответе @ dbenham, просто сделал несколько переменных значений, собранных из командной строки и выложенных здесь для простоты копирования и вставки - кредит - это все @ 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!
)
0

Используя ZtreeWin, перейдите к правильному каталогу, нажав \, затем нажмите Enter, чтобы войти в каталог, где вы можете Ctrl T, чтобы пометить файлы, которые вы хотите переименовать, и затем Ctrl R, чтобы переименовать их в ????<0>*.*

Например:

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

В приведенном выше примере ???? представляет первые 4 символа (foo-), <0> вставляет ноль в 5-ю позицию, а *.* представляет остаток имени файла (-bar.jpg), который останется неизменным.

Пометка ваших файлов:

Переименование ваших файлов:

ZTreeWin - это мощный 32- битный и 64- битный диспетчер файлов и каталогов в текстовом режиме, созданный по образцу легендарного XTreeGold(tm), но улучшенный для современных популярных операционных систем.

0

Я бы сделал это так:

  • Добавьте «0» к каждому номеру (например, «01», но также и «065»)
  • Подстрока последних 2 символов из этой строки

Как вы подстрока в пакетном файле (2 последних символа):

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .