Как ни крути, а cmd.exe и command.com - это останки MS DOS, поэтому я так и озаглавил эту запись.
Итак, server 2008, cmd.exe, батник, цикл... Что я хочу сделать? Я хочу вывести числа от 1 до 20, причем числа меньше 10 должны выводиться с ведущими нулями. Способов для этого много, но все они упираются в присвоение какой-то переменной текущего значения счетчика цикла.
Чтобы не мудрить с проверками, я решил использовать наиболее универсальный способ: прибавляю к числу 100 и из полученного значения беру 2 правых символа. Можно прибавлять что угодно, главное, чтобы справа было нужное число нулей, чтобы не исказить само значение.
Итак, server 2008, cmd.exe, батник, цикл... Что я хочу сделать? Я хочу вывести числа от 1 до 20, причем числа меньше 10 должны выводиться с ведущими нулями. Способов для этого много, но все они упираются в присвоение какой-то переменной текущего значения счетчика цикла.
Чтобы не мудрить с проверками, я решил использовать наиболее универсальный способ: прибавляю к числу 100 и из полученного значения беру 2 правых символа. Можно прибавлять что угодно, главное, чтобы справа было нужное число нулей, чтобы не исказить само значение.
for /L %%a in (1,1,20) do (
set /A b=100+%%a
set b=%b:~-2%
echo a=[%%a] b=[%b%]
)По идее у меня должно напечататься 20 строк вида:
a=[x] b=[zy]где x - значение переменной счетчика цикла, y=x, а z - ведущий ноль, если он есть.
Однако, вместо этого печатаются строчки вида:
a=[x] b=[]Я перепробовал все варианты, какие только смог придумать. Увы, все команды работают с %%a нормально, кроме команды присвоения. Вариант с
setlocal EnableDelayedExpansion тоже не помог. Пришлось выкручиваться. Частично решение, саму идею, нашел здесь.for /L %%a in (1,1,20) do ( call :MySub %%a
echo a=[%%a] b=[%b%])exit /b 0:MySub
set /A b=100+%~1
set b=%b:~-2% exit /b 0После этого всё заработало.
Вывод: если надо что-то сделать со значением счетчика цикла, сложнее чем вывести его значение на экран, то для этого лучше передать его как параметр в подпрограмму.




Недавно решал подобную задачу, попалось решение на ответы.мэйл.ру.
ОтветитьУдалитьЧуть побился (не совсем понимаю до сих пор) и вывел решение:
@echo off
setlocal EnableDelayedExpansion
for /L %%a in (1,1,20) do (
set /a b=100+%%a
set b=!b!
set c=!b:~-2!
echo a=[%%a] b=[!c!]
)
P.S. Код не оптимизировал, точно что-то лишнее осталось.
Спасибо, удачи!
Да, спасибо.
УдалитьИспользование восклицательных знаков вместо процентов я нашел позже - всё же этой записи уже 8 лет.
Извините, но опубликовал чтобы ищущие могли найти при поиске решение, не для хвастовства.
УдалитьПомню свой вариант решения, "как у всех". Два цикла делал, в одном формировал от 01 до 09, а во втором с 10 по 20.
Изредка был вариант для трёх знаков, то есть уже третий цикл.
Ваше опубликованное решение прекрасно, жаль поздновато нашёл.
Спасибо, удачи!
Это была не претензия, а пояснение. Всё в порядке.
Удалить