bomzzz

Platinum Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Цитата: На мой взгляд, с этим уже вполне можно жить. Но, как всегда, жизнь не так проста, как кажется. Есть одна проблема. Переменные, использующиеся в блоках then и else, раскрываются перед началом выполнения этих блоков, а не в процессе выполнения. В приведенном примере это не вызывает никаких проблем, однако в следующем вызовет: if "%BUILDMODE%" == "debug" ( echo INFO: Устанавливаем debug-режим окружения set OPTFLAGS=/Od set CCFLAGS=%OPTFLAGS% /MDd /Z7 ) else ( echo INFO: Устанавливаем release-режим окружения set OPTFLAGS=/O2 set CCFLAGS=%OPTFLAGS% /MD ) Загвоздка в том, что в обоих блоках подстановка переменной OPTFLAGS произойдет до того, как она будет изменена в процессе выполнения этого блока. Соответственно, в CCFLAGS будет подставлено то значение, которое OPTFLAGS имела на момент начала выполнения данного if-блока. Решается эта проблема путем использования отложенного раскрытия переменных. Переменные, заключенные в !…! вместо %…%, будут раскрыты в их значения только в момент непосредственного использования. Данный режим по умолчанию отключен. Включить его можно либо использованием ключа /V:ON при вызове cmd.exe, либо использованием команды setlocal enabledelayedexpansion в тексте самого bat-файла. Второй способ мне представляется более удобным – не очень здорово требовать от кого-то запуска твоего сценария с определенным параметром. С учетом сказанного предыдущий «неправильный» пример может быть исправлен так: setlocal enabledelayedexpansion rem ... if "%BUILDMODE%" == "debug" ( echo INFO: Setting up debug mode environment set OPTFLAGS=/Od set CCFLAGS=!OPTFLAGS! /MDd /Z7 ) else ( echo INFO: Setting up release mode environment set OPTFLAGS=/O2 set CCFLAGS=!OPTFLAGS! /MD ) Вот теперь это почти полноценный if-then-else блок. Почти, потому что если в одной из команд echo у вас встретится закрывающая круглая скобка, то вам необходимо заэкранировать ее символом ^, иначе синтаксический анализатор путается… Но в любом случае, это гораздо лучше безумного количества меток и переходов. | Dr29BArt Цитата: @echo off setlocal enabledelayedexpansion set /p a="Enter 0 or 1 " if "%a%" == "0" @echo You entered !a! if "%a%" == "1" ( set /p b="Enter 2 or 3 " echo You entered !b!) | | Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 01:08 08-10-2009 | Исправлено: bomzzz, 01:09 08-10-2009 |
|