Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Последовательность из трех перезагрузок (http://forum.oszone.net/showthread.php?t=222594)

Vadikan 10-12-2011 20:04 1812821

Последовательность из трех перезагрузок
 
Привет, коллеги!

Я соорудил скрипт, который выполняет перезагрузку Windows 7 три раза подряд с 60-секундной задержкой после первых двух перезагрузок. Его будут запускать конечные пользователи, предварительно проинструктированные "ничего не трогать" после запуска :)

В принципе, он работает, но у меня весьма базовые знания в этом вопросе, так что скрипт, наверное, можно оптимизировать.

reboot.cmd
Код:

@echo off
set TestDir=%~dp0

:: Проверяется наличие маркерных файлов, создаваемых при перезагрузках
IF NOT EXIST %TestDir%run1.tmp CALL :FirstRun
IF EXIST %TestDir%run2.tmp CALL :LastRun

:: Создание маркерного файла второй перезагрузки
echo>%TestDir%run2.tmp
EXIT

:FirstRun
:: Задание планировщика для выполнения второй перезагрузки и создания маркерного файла
:: Включает вызов этого командного файла для проверки маркеров
Schtasks.exe /Create /RL Highest /TN Reboot /SC ONLOGON /TR "cmd /c shutdown /r /t 60 /c \"This is the shutdown reason\" && call %TestDir%reboot.cmd"
:: Первая перезагрузка
shutdown /r /t 60 /c "This is the shutdown reason"
:: Создание маркерного файла первой перезагрузки
echo>%TestDir%run1.tmp
EXIT

:LastRun
:: Удаление задания из планировщика
Schtasks.exe /Delete /TN Reboot /F
:: Третья перезагрузка
shutdown /r /t 60 /c "This is the shutdown reason"
:: Удаление маркерных файлов
del /q %TestDir%*.tmp
EXIT

Буду признателен за любые отзывы, в т.ч. за "все ок" :)

Спасибо!

El Sanchez 11-12-2011 12:45 1813146

Цитата:

Цитата Vadikan
Я соорудил скрипт »

Vadikan, если работает, то пускай будет, только пути с участием переменной %TestDir% заключайте в кавычки, а то попадется путь с пробелами и будут сюрпризы.:)

Цитата:

Цитата Vadikan
так что скрипт, наверное, можно оптимизировать »

Можно рекурсию применить. И без маркеров. Вот вариант, для боеготовности удалить красное:
Код:

@Echo Off

If "%~1"=="" (Set Cnt=3) Else (Set Cnt=%~1)
Set /A Cnt-=1
If %Cnt% GEQ 0 (
        Echo schtasks /Create /F /RL Highest /TN Reboot /SC ONLOGON /TR "\"%~f0\" \"%Cnt%\""
        Echo shutdown /r /t 60 /c "This is the shutdown reason"
) Else (
        Echo Schtasks.exe /Delete /TN Reboot /F
)


Vadikan 11-12-2011 16:29 1813262

Цитата:

Цитата El Sanchez
только пути с участием переменной %TestDir% заключайте в кавычки, а то попадется путь с пробелами и будут сюрпризы. »

Угу, я поймал это на своем тестировании уже :)

С рекурсией элегантнее выглядит, конечно. Объясните, пожалуйста, выделенные моменты:
If "%~1"=="" (Set Cnt=3) Else (Set Cnt=%~1)
Set /A Cnt-=1 (минус)
/TR "\"%~f0\"

El Sanchez 11-12-2011 17:36 1813313

Цитата:

Цитата Vadikan
If "%~1"=="" (Set Cnt=3) Else (Set Cnt=%~1) »

%1 - первый параметр, переданный в сценарий. Тильда - это модификатор параметра, убирающий двойные кавычки, обрамляюшие параметр. Кавычки при передаче параметров нужны для того, чтобы в случае, если параметр представляет собой какую-нибудь строку с пробелами, сценарий не интерпретировал ее как набор отдельных параметров, разделенных пробелами, а как одно целое. В данном примере, если первый параметр сценария пуст, т.е. сценарий запустили в первый раз, то счетчику Cnt присваиваем значение 3, иначе присваиваем значение первого параметра.

Цитата:

Цитата Vadikan
Set /A Cnt-=1 (минус) »

Далее счетчик уменьшаем на 1 (см. Set /?), Cnt будет равен 2 и это значение подставляется при создании задачи в виде параметра для сценария, т.е. сколько раз еще нужно перезагрузиться. После первой перезагрузки планировщик запустит сценарий с параметром 2, If "%~1"==" уже ложно, поэтому Set Cnt=%~1, т.е. Сnt=2, далее опять счетчик уменьшается на 1, перезаписывается задание и .т.д. до 0. После 3 перезагрузок параметр сценария будет 0, счетчик станет -1 и сработает Else в If %Cnt% GEQ 0, задание удалится.

Цитата:

Цитата Vadikan
/TR "\"%~f0\" »

%0 - сам сценарий, %~f0 - полный путь сценария без кавычек (про модификаторы см. For /?)

Вот как все это выглядит (с неудаленными Echo и имитацией работы планировщика):
читать дальше »

Код:

C:\temp>test.bat
schtasks /Create /F /RL Highest /TN Reboot /SC ONLOGON /TR "\"C:\temp\test.bat\"  \"2\""
shutdown /r /t 60 /c "This is the shutdown reason"

C:\temp>test.bat 2
schtasks /Create /F /RL Highest /TN Reboot /SC ONLOGON /TR "\"C:\temp\test.bat\"  \"1\""
shutdown /r /t 60 /c "This is the shutdown reason"

C:\temp>test.bat 1
schtasks /Create /F /RL Highest /TN Reboot /SC ONLOGON /TR "\"C:\temp\test.bat\"  \"0\""
shutdown /r /t 60 /c "This is the shutdown reason"

C:\temp>test.bat 0
Schtasks.exe /Delete /TN Reboot /F

C:\temp>


Vadikan 11-12-2011 22:25 1813486

El Sanchez, все понял, большое спасибо за разбор полетов :)


Время: 05:17.

Время: 05:17.
© OSzone.net 2001-