Нашел еще одно решение.
Есть такая замечательная программка-автоматизатор - AutoIt https://www.autoitscript.com
Идея в том, чтобы отказаться от запуска bat файлов, а использовать указанную программку для "интеллектуального" выключения компьютера.
Сценарий такой:
1. В HMS делаем две обработки. Обе они пишут в один и тот же файл.
1.1 Одна при бездействии сервера 30 мин пишет например так:
// Г Л А В Н А Я П Р О Ц Е Д У Р А //
{
HmsStringToFile('hms.idle', 'D:\\filename.txt'); // ключевое тут hms.idle
}
1.2 Вторая при запросе на воспроизведение. Она как бы сбрасывает признак бездействия HMS
// Г Л А В Н А Я П Р О Ц Е Д У Р А //
{
HmsStringToFile('', 'D:\\filename.txt'); // ключевое слово тут не важно, главное не должно быть hms.idle
}
2. Для AutoIt пишем такой скрипт:
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#include <WinAPIFiles.au3>
; Коды для вызова команды shutdown. Можно использовать в комбинации, т.е. суммируя:
; $SD_LOGOFF (0) = Logoff
; $SD_SHUTDOWN (1) = Shutdown
; $SD_REBOOT (2) = Reboot
; $SD_FORCE (4) = Force
; $SD_POWERDOWN (8) = Power down
; $SD_FORCEHUNG (16) = Force if hung
; $SD_STANDBY (32) = Standby
; $SD_HIBERNATE (64) = Hibernate
CheckHMSState()
Func CheckHMSState()
; Заполнить две константы ниже
Local Const $sFilePath = "c:\temp\HMS.STATE" ; полный путь к файлу, в котором хранится состояние HMS
Local Const $sIDLE = "hms.idle" ; строка-триггер - HMS 30 минут бездействует
Local $hFileOpen = FileOpen($sFilePath, $FO_READ)
if $hFileOpen = -1 Then
; Не удалось открыть файл. Просто завершаем приложение
Return False
EndIf
Local $sFileRead = FileReadLine($hFileOpen, 1)
if $sFileRead = 1 Then
; Не удалось прочитать из файла. Просто завершаем приложение
Return False
EndIf
FileClose($hFileOpen)
if StringInStr($sFileRead, $sIDLE, $STR_NOCASESENSE) Then
Local $iDelete = FileDelete($sFilePath) ; Подчищаем
;Shutdown (64) ; Раскомментировать для выключения компьютера
MsgBox($MB_SYSTEMMODAL, "TEST", "Ready to shutdown") ; Для тестирования. Закомментировать впоследствии
EndIf
EndFunc
Задаем в нем константы, аналогично тем, что используются в обработках HMS, а именно путь к файлу с состоянием HMS и слово-триггер.
Ну и раскомментируем строку Shutdown(код). Описание кодов в скрипте.
3.Средствами AutoIt компилируем скрипт в исполняемый exe файл (можно даже для х64 систем).
4. Вызываем этот скомпилированный экзешник в планировщике задач Windows в соответствии с настройками, любезно описанными unq:
Trigger: on Idle, repeat every 30 minutes for duration of Indefinitely
Action: start program "путь к исполняемому файлу, полученному на шаге 3"
Condition: Start the task only if the computer idel for 1hour, wait for idle for: do not wait
stop if the computer ceases to be idle
Все.
Никаких окон не появляется. Никаких батников не запускается. Все делается штатными средствами HMS. А уже при бездействии компьютера запускается этот экзешник, проверяет содержимое файла и в зависимости от его содержимого либо завершает работу, либо выключает компьютер.
P.S. Вообще программуля очень крутая. Не исключаю, что её можно научить отслеживать состояние HMS (чтобы не тратить обработки). Но на скорую руку вполне и так.
P.S.1 Добавил в скрипт строку с удалением файла-состояния и сам скрипт во архиве.
Прикреплённые файлы сообщенияhms.idle.zip 951 b, скачивалось 384 раза, начиная с 2018.12.27