Я пишу пакетный файл для выполнения некоторых операций на удаленных компьютерах в моем здании. Они все названы с одинаковым префиксом, но номер в конце меняется (01–65). Я попытался следовать онлайн-руководству по созданию цикла пакетного файла на основе чисел и пришел к следующему:
FOR /l %%N in (1,1,65) do (
set HOSTNAMETOUSE=prefix-%%N
ECHO %HOSTNAMETOUSE%
)
Это отлично работает после того, как он достигает 10, так как тогда это две цифры. Мне нужно, чтобы числа 1-9
отображались как 01-09
, так как это соответствует нашей схеме именования. По сути, мне нужна одна цифра начального нуля для первых 9 итераций.Как это сделать с помощью пакетных файлов Windows?
решение1
Ваш опубликованный код не может работать, поскольку %HOSTNAMETOUSE%
он расширяется при разборе оператора, а весь заключенный в скобки блок разбирается за один проход, до выполнения цикла. Таким образом, расширенное значение является постоянным для всех итераций.
Для получения значения во время выполнения необходимо использовать отложенное расширение.
@echo off
setlocal enableDelayedExpansion
FOR /l %%N in (1,1,65) do (
set HOSTNAMETOUSE=prefix-%%N
ECHO !HOSTNAMETOUSE!
)
Теперь при необходимости добавляем префикс 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 цифр. Более общее решение — добавить строкуннули нужной вам длины, а затем используйте операцию подстроки, чтобы сохранитьнсамые правые цифры.
@echo off
setlocal enableDelayedExpansion
FOR /l %%N in (1,1,65) do (
set "n=00%%N"
set "HOSTNAMETOUSE=!n:~-2!
ECHO !HOSTNAMETOUSE!
)
Вы можете легко расширить это решение практически до любого количества начальных нулей.
решение2
Я бы сделал это так:
- Добавьте «0» к каждому числу (то есть «01», но также и «065»).
- Подстрока последних 2 символов из этой строки
Как сделать подстроку в пакетном файле (2 последних символа):
SET string=abcd
echo %string%
SET string2=%string:~-2%
echo %string2%
решение3
Ничего нового в ответе @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!
)
решение4
С использованиемZtreeWin, перейдите в нужный каталог, нажав \, затем нажмите Enter, чтобы войти в каталог, в котором вы можете CtrlTпометить файлы, которые вы хотите переименовать, а затем CtrlRпереименовать их в????<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>
вставляет ноль на пятую позицию и *.*
представляет оставшуюся часть имени файла (-bar.jpg), которая останется неизменной.
Пометка ваших файлов:
Переименование файлов:
ZTreeWin— мощный 32- и 64-битный текстовый файловый и каталоговый менеджер, созданный по образцу легендарного XTreeGold(tm), но усовершенствованный для современных популярных операционных систем.