Как вы ждете, пока задача планировщика завершится в командном файле или C #?
Я пытаюсь написать командный файл, который делает две вещи:
Сначала он запускает установщик (install.exe), который устанавливает программу (program.exe).Во-вторых, он запускает экземпляр установленной программы (program.exe). Это должно быть выполнено после завершения установки.Это было бы относительно просто, за исключением того, что установщику нужны привилегии администратора и он должен выполняться в пользовательском контексте. Даже с этими ограничениями это будет относительно просто, за исключением того, что я запускаю это на рабочей роли Azure, что означает две вещи:
Повышенные пакетные файлы должны быть запущены из задачи запуска.Пользовательский контекст для задач запуска в рабочих ролях Azure отсутствует.Поэтому представляется, что решение заключается взапустить установщик как задачу планировщика заданий в реальном пользовательском контексте, Однако это связано с предупреждением, что мне нужно будет дождаться завершения этой задачи, прежде чем я смогу запустить program.exe.
Таким образом, мой вопрос: как мне дождаться завершения задачи планировщика заданий в командном файле?
Кроме того, я мог бы последовательно соединить два вызова в моем пакетном файле в одной задаче планировщика задач (планировщик задач поддерживает до 16 последовательных событий в одной задаче [Требуется цитирование]).
Однако, если я выберу такой подход, мой пакетный файл прекратит работу, как только задачапо расписаниюне сразуотделки, К сожалению, я должен подождать, пока он не закончит, прежде чем я смогу выполнить любую логику в моей Рабочей роли. Тем не менее, если я смогу проверить, завершена ли задача планировщика заданий из C # (БЕЗ прав администратора), то я могу просто ждать ее там.
Таким образом, второй жизнеспособный ответ будет на вопрос: Как я могу проверить, была ли задача планировщика заданий завершена из C #?
РЕДАКТИРОВАТЬ: Я думал, что я хотел бы уточнить ниже ответ MC ND:
На высоком уровне эта команда проверяет, выполняется ли задача, а затем спит и зацикливается, если это так.
:loop
for /f "tokens=2 delims=: " %%f in ('schtasks /query /tn yourTaskName /fo list ^| find "Status:"' ) do (
if "%%f"=="Running" (
ping -n 6 localhost >nul 2>nul
goto loop
)
)
Звонокschtasks /query /tn yourTaskName /fo list
выводит что-то вроде следующего:
Folder: \
HostName: 1234567890
TaskName: \yourTaskName
Next Run Time: 11/27/2030 11:40:00 PM
Status: Ready
Logon Mode: Interactive/Background
Команда for зацикливается на каждой строке вывода. Каждая строка разбивается на два токена с помощью разделителя ":". Если найдена строка, начинающаяся с «Status», то токен после разделителя в этой строке сохраняется в переменной f (которая в приведенном выше примере будет «Ready»).
Затем проверяется переменная f, чтобы увидеть, соответствует ли она статусу «Выполняется». Если статус не «Выполняется», предполагается, что задача выполнена или не выполнена, и цикл завершается. Если статус «Выполняется», то задача все еще выполняется, и пакетный сценарий на короткое время приостанавливается, прежде чем проверять снова. Это достигается с помощью вызова ping, так как пакет не имеет команды сна. Как только скрипт завершится, он перезапустит эту последовательность.