Jak czekać na zadanie Harmonogram zadań, aby zakończyć w pliku wsadowym lub C #?

Próbuję napisać plik wsadowy, który robi dwie rzeczy:

Najpierw uruchamia instalator (install.exe), który instaluje program (program.exe).Po drugie uruchamia instancję zainstalowanego programu (program.exe). Musi to zostać wykonane po zakończeniu instalacji.

Byłoby to stosunkowo proste, z wyjątkiem tego, że instalator potrzebuje uprawnień administratora i musi działać w kontekście użytkownika. Nawet przy tych ograniczeniach byłoby to nadal stosunkowo proste, z wyjątkiem tego, że używam tego w roli Azure Worker Role, co oznacza dwie rzeczy:

Podwyższone pliki wsadowe muszą być uruchamiane z zadania startowego.Nie ma kontekstu użytkownika dla zadań uruchamiania w rolach roboczych Azure.

Wydaje się zatem, że rozwiązaniem jesturuchom instalator jako zadanie Harmonogramu zadań w rzeczywistym kontekście użytkownika. Wiąże się to jednak z zastrzeżeniem, że będę musiał poczekać na zakończenie tego zadania, zanim będę mógł uruchomić program.exe.

Tak więc moje pytanie brzmi: jak poczekać na zadanie Harmonogram zadań, aby zakończyć w pliku wsadowym?

Alternatywnie, mogę połączyć łańcuchowo dwa połączenia w moim pliku wsadowym w ramach jednego zadania Harmonogramu zadań (Harmonogram zadań obsługuje do 16 zdarzeń sekwencyjnych w jednym zadaniu [Potrzebne cytaty]).

Jeśli jednak zastosuję takie podejście, mój plik wsadowy zakończy się, gdy tylko zadanie zostanie wykonaneplanowy, nie tak szybko, jak to będziewykończenia. Niestety, muszę poczekać, aż skończę, zanim będę mógł wykonać jakąkolwiek logikę w mojej roli robotnika. Jeśli jednak mogę sprawdzić, czy zadanie Harmonogramu zadań zakończyło się z C # (BEZ uprawnień administratora), mogę po prostu zaczekać na to.

Zatem drugą realną odpowiedzią byłoby pytanie: jak sprawdzić, czy zadanie Harmonogramu zadań zostało ukończone z C #?

EDYCJA: Pomyślałem, że wyjaśnię poniżej odpowiedź MC ND trochę:

Z wysokiego poziomu polecenie to sprawdza, czy zadanie jest uruchomione, a następnie śpi i zapętla, jeśli tak jest.

: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
    )
)

Telefonschtasks /query /tn yourTaskName /fo list wyświetla coś takiego:

Folder: \  
HostName:      1234567890  
TaskName:      \yourTaskName  
Next Run Time: 11/27/2030 11:40:00 PM  
Status:        Ready  
Logon Mode:    Interactive/Background 

Polecenie for zapętla każdą linię na wyjściu. Każda linia jest podzielona na dwa tokeny za pomocą separatora „:”. Jeśli zostanie znaleziona linia zaczynająca się od „Status”, to token po ograniczniku w tej linii jest przechowywany w zmiennej f (która w powyższym przykładzie będzie „Gotowa”).

Zmienna f jest następnie sprawdzana, aby sprawdzić, czy odpowiada ona statusowi „Running”. Jeśli status nie jest „Uruchamiany”, zakłada się, że zadanie zostało zakończone lub zakończyło się niepowodzeniem, a pętla kończy działanie. Jeśli status to „Uruchomiony”, zadanie nadal działa, a skrypt wsadowy zatrzymuje się na krótki czas przed ponownym sprawdzeniem. Osiąga się to poprzez wywołanie ping, ponieważ partia nie ma polecenia uśpienia. Po zakończeniu snu ponownie uruchamia tę sekwencję.

questionAnswers(2)

yourAnswerToTheQuestion