Замена переменной внутри цикла в сценарии командной строки Batch

Замена переменной внутри цикла в сценарии командной строки Batch
Замена переменной внутри цикла в сценарии командной строки Batch - dariuszsankowski @ Unsplash

Замена переменной внутри цикла в сценарии командной строки Batch. Сценарий 1 успешно выводит число 1, тогда как Сценарий 2 последовательно выводит 0.

Язык командной строки Batch является одним из самых распространенных и удобных средств автоматизации задач в операционной системе Windows. Однако, иногда возникают ситуации, когда требуется внести изменения в существующий сценарий, чтобы он корректно выполнял нужные задачи. В данной статье мы рассмотрим проблему замены переменной внутри цикла в Batch-сценарии и предоставим решение для её избежания.

Сценарий 1: Вывод числа 1

Давайте рассмотрим первый сценарий, который успешно выводит число 1:

@echo off
set number=1
for /L %%i in (1,1,1) do (
    echo %number%
)

Этот сценарий инициализирует переменную "number" с значением 1. Затем цикл for выполняет одну итерацию с помощью опции /L, указывающей начальное, конечное и шаговое значения. В данном случае, цикл выполняется один раз с единственным значением "1". Внутри цикла выполняется команда "echo", которая выводит значение переменной "number". Результатом работы этого сценария будет вывод в консоль числа 1.

Сценарий 2: Постоянный вывод числа 0

Теперь перейдем к проблемному сценарию, который выводит число 0 вместо ожидаемого значения 1:

@echo off
set number=1
for /L %%i in (1,1,1) do (
    set number=0
    echo %number%
)

В этом сценарии также инициализируется переменная "number" с значением 1. Однако, внутри цикла происходит замена значения переменной на 0 перед каждым выводом. Это происходит из-за особенностей командной строки Batch, которая выполняет экспансию переменных перед выполнением всей команды. В данном случае, переменная "number" расширяется на этапе парсинга, до выполнения самого цикла, и поэтому для каждой итерации цикла будет использовано старое значение переменной.

Решение проблемы

Для решения этой проблемы требуется использовать внутренние переменные цикла. Вот модифицированный сценарий, который выводит ожидаемый результат:

@echo off
setlocal enabledelayedexpansion
set number=1
for /L %%i in (1,1,1) do (
    set number=0
    echo !number!
)

Ключевым моментом здесь является использование команды "setlocal enabledelayedexpansion", которая включает задержанный синтаксис расширения переменных. При использовании восклицательных знаков вместо процентных, переменная "number" будет расширена только на этапе выполнения цикла, а не на этапе парсинга. Это позволяет всегда использовать актуальное значение переменной внутри цикла.

Примечание: Если внутри цикла используются другие переменные, которые требуют задержанного расширения, их также необходимо использовать с использованием восклицательных знаков.

Теперь, при запуске этого сценария, вы получите ожидаемый результат – вывод числа 0 на каждой итерации.

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


NevaDev, 20 августа 2023 г., 21:48