Как вы ждете, пока задача планировщика завершится в командном файле или 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, так как пакет не имеет команды сна. Как только скрипт завершится, он перезапустит эту последовательность.

Ответы на вопрос(2)

Ваш ответ на вопрос