Официальная возможность получить лицензионный софт бесплатно.
Giveaway of the Day
Это не реклама!

Щелкните для получения прогноза по Биробиджану


вторник, 2 мая 2017 г.

MS DOS: Обращение к счетчику цикла изнутри самого цикла

Как ни крути, а cmd.exe и command.com - это останки MS DOS, поэтому я так и озаглавил эту запись.

Итак, 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


После этого всё заработало.

Вывод: если надо что-то сделать со значением счетчика цикла, сложнее чем вывести его значение на экран, то для этого лучше передать его как параметр в подпрограмму.

Комментариев нет:

Отправить комментарий

Пожалуйста, воздержитесь от грубостей и персональных нападок.
Я не против матерщины, но она должна быть уместной и использоваться для выражения эмоций, а не в качестве основного средства выражения мыслей.