@oldsadraven

Почему некорректно работает цикл FOR?

Сломал всю голову.
Возникла задача - выключать компьютеры скриптом по расписанию. Решил не усложнять, написать на CMD.
Вот так всё работает:
Setlocal EnableDelayedExpansion
@ECHO OFF
SET file=hosts.txt
SET username=megoodminЪ
SET pass=megoodminЪ_password
FOR /F %%i IN (%file%) DO (
	SET tmpip=%%i
	NET USE \\!!tmpip! %pass% /USER:%username%
	IF errorlevel 1 GOTO fail
	REM SHUTDOWN /R /T 30 /F /M \\!!tmpip!
	IF errorlevel 1 GOTO fail
	ECHO Shutdown !!tmpip! success
	REM GOTO next
	:fail
	ECHO Shutdown !!tmpip! failed
	:next
	NET USE \\!!tmpip! /DELETE
)

Разве что пока закомментил строку с shutdown'ом, и на всякий случай пока вместо /s вбил /r. Но, само собой, при успешном выполнении основного тела цикла, выполняется и кусок после метки fail (echo в дальнейшем будет сохранять лог в файл).
А если перед GOTO убрать REM:
Setlocal EnableDelayedExpansion
@ECHO OFF
SET file=hosts.txt
SET username=megoodminЪ
SET pass=megoodminЪ_password
FOR /F %%i IN (%file%) DO (
	SET tmpip=%%i
	NET USE \\!!tmpip! %pass% /USER:%username%
	IF errorlevel 1 GOTO fail
	REM SHUTDOWN /R /T 30 /F /M \\!!tmpip!
	IF errorlevel 1 GOTO fail
	ECHO Shutdown !!tmpip! success
	GOTO next
	:fail
	ECHO Shutdown !!tmpip! failed
	:next
	NET USE \\!!tmpip! /DELETE
)

то при успешном выполнении основного тела цикла переход происходит, выполнение переходит на метку next... и цикл завершает работу.
Совершенно не понимаю, где тут можно было ошибиться. Или я не знаю какой-то особенности выполнения команд в командном процессоре, или мне пора уходить в дворники...
  • Вопрос задан
  • 173 просмотра
Решения вопроса 1
@Hlapchynya
goto внутри блока () завершает его.
Нужно использовать call для исполнения каких-то строк и exit /b для возврата в цикл

Примеры можно посмотреть тут
https://stackoverflow.com/questions/38140284/break...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы