Сломал всю голову.
Возникла задача - выключать компьютеры скриптом по расписанию. Решил не усложнять, написать на 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... и цикл завершает работу.
Совершенно не понимаю, где тут можно было ошибиться. Или я не знаю какой-то особенности выполнения команд в командном процессоре, или мне пора уходить в дворники...