Przykłady CLI
Tłumaczenie oryginalnej strony w języku angielskim dla OmsiLaunch 0.1.0-beta3. Wiążąca jest strona angielska: w razie rozbieżności obowiązują strona angielska i kod.
Minimalne, poprawne wywołania OmsiLaunch.exe dla OmsiLaunch 0.1.0-beta3, każde z oczekiwanym kodem wyjścia procesu oraz informacją o tym, co jest zmieniane i przywracane. Każdy przykład jest uruchamiany z katalogu głównego instalacji OMSI (<OMSI_PATH>), o ile nie zaznaczono inaczej; składnię zdefiniowano w dokumentacji CLI, a kody wyjścia w kodach wyjścia. Do każdego polecenia można dodać --json, aby otrzymać strukturalną kopertę (envelope).
Konwencje#
- Zmienia: pliki lub stan OMSI zmieniane przez polecenie. „Nakładka sesji” oznacza plik zapisany w migawce transakcji, zastosowany przed uruchomieniem OMSI i przywrócony bajt po bajcie po zakończeniu sesji.
- Przywracane: to, co jest cofane po zakończeniu sesji (zwykłe zatrzymanie, Ctrl+C, obszar powiadomień,
session stop,/observe-seconds) lub przez odzyskiwanie. - Zapisy runtime (
time set,camera set,scripts variable set,vehicles spawn) zmieniają wyłącznie pamięć OMSI; nigdy nie są cofane, ponieważ OMSI jest kończony przy zatrzymaniu. - Symbole zastępcze:
<OMSI_PATH>to instalacja OMSI 2 zawierająca pakiet OmsiLaunch (na przykładC:\OMSI 2);<OTHER_OMSI_PATH>– inna instalacja;<SPEC_PATH>i<ITX_PATH>– własny plik LaunchSpec i własny profil tekstur internetowych;<HANDLE>to uchwyt wypisany przez poprzedzające polecenielistlubcreate, a<BASE64>to dane pikseli w Base64. Każda inna wartość jest literałem, który działa w standardowej instalacji OMSI 2 (grundorf-quickto przykładowy profil zdefiniowany na tej stronie). - Ścieżkę zawierającą spacje należy ująć w cudzysłów i nie kończyć ścieżki w cudzysłowie znakiem
\(parsowanie argumentów w Windows zamienia\"w dosłowny cudzysłów):"C:\OMSI 2", a nie"C:\OMSI 2\". - Każdy wiersz polecenia na tej stronie jest parsowany przez bramkę dokumentacji (
tests/OmsiLaunch.DocumentationTests, bramkaexamples); przykłady identyfikacji, wykrywania, planowania i trybu klienta zostały ponadto wykonane na rzeczywistej instalacji (research/reports/OMSILAUNCH-BETA3-FINAL-DOCUMENTATION-AUDIT.md).
Identyfikacja i wykrywanie (bez sesji)#
OmsiLaunch.exe /versionKod wyjścia 0. Wypisuje product, version (0.1.0-beta3), protocol_version (0.1), supported_family. Niczego nie zmienia.
OmsiLaunch.exe profiles --jsonKod wyjścia 0. Wyświetla obsługiwane hashe Omsi.exe i ich stan walidacji. Niczego nie zmienia.
OmsiLaunch.exe capabilities --json
OmsiLaunch.exe help timeKod wyjścia 0. Katalog publicznych możliwości; help <family> go filtruje. Niczego nie zmienia.
OmsiLaunch.exe detect
OmsiLaunch.exeKod wyjścia 0 (obie postacie są identyczne). Raportuje uruchomione procesy Omsi.exe oraz to, czy właściciel OmsiLaunch odpowiada dla tej instalacji. Niczego nie zmienia.
OmsiLaunch.exe /list:Maps
OmsiLaunch.exe /list:Entrypoints /map:maps\Grundorf\global.cfg
OmsiLaunch.exe /list:Repaints /vehicle-scope:Vehicles\MAN_SD200\MAN_SD77.bus
OmsiLaunch.exe "<OMSI_PATH>" /list:SituationsKod wyjścia 0 (2 dla nieznanej kategorii). Wykrywanie tylko do odczytu; cykle punktów połączenia (junction) są pomijane. Niczego nie zmienia. Wypisywane tu wartości Identity są dokładnie tymi ciągami, których oczekują /map, /saved, /vehicle-scope i LaunchSpec (na przykład maps\Grundorf\global.cfg, situations\Linie 5.osn).
Planowanie i walidacja#
OmsiLaunch.exe /new /map:maps\Grundorf\global.cfg /entrypoint-index:1 /planKod wyjścia 0, gdy plan ma stan READY, 1, gdy NOT RUNNABLE (na przykład OL_E_UNSUPPORTED_BUILD, OL_E_MAP_NOT_FOUND, OL_E_ENTRYPOINT_REQUIRED). Niczego nie zmienia; OMSI nie jest uruchamiany.
OmsiLaunch.exe /new /map:maps\Grundorf\global.cfg /entrypoint-index:1 /validate --jsonKod wyjścia 0/1 jak wyżej; /validate jest aliasem /plan. JSON to surowy SessionPlan (TouchedFiles, PlannedMutations, Diagnostics, IsRunnable).
OmsiLaunch.exe /new /map:maps\Grundorf\global.cfg /entrypoint-index:1 /date:2026-09-20 /planKod wyjścia 1. /date, /time, /year, /weather* i flagi pojazdu gracza są akceptowane, ale nie są stosowane przez ten build; plan zawiera OL_E_CAPABILITY_UNAVAILABLE i jest niemożliwy do uruchomienia.
OmsiLaunch.exe /last /planKod wyjścia 1. LAST_MAP_STATE jest niedostępne dla tego profilu (OL_E_CAPABILITY_UNAVAILABLE).
Uruchamianie sesji (tryb właściciela)#
OmsiLaunch.exe /new /map:maps\Grundorf\global.cfg /entrypoint-index:1Kod wyjścia 0, gdy sesja kończy się stanem Completed, 1 przy Failed lub planie niemożliwym do uruchomienia. Zmienia: nakładki sesji GUI\NewSplashscreen_ENG.bmp i GUI\NewSplashscreen_<lang>.bmp (zarządzany ekran startowy jest domyślny), obsługę closecheck, przekazanie startowe (handoff). Przywracane: każda nakładka, bajt po bajcie, po zakończeniu sesji. Konsola pozostaje podłączona, dopóki OMSI się nie zakończy, nie zostanie potwierdzone „End session” w obszarze powiadomień, klient nie wyśle session stop lub nie zostanie naciśnięte Ctrl+C.
OmsiLaunch.exe /new /map:maps\Grundorf\global.cfg /entrypoint-index:1 /observe-seconds:8Kod wyjścia 0. Jak wyżej, ale sesja jest zatrzymywana 8 s po osiągnięciu Running (wcześniej przy zatrzymaniu z obszaru powiadomień/przez potok). Używane przez skrypty walidacyjne.
OmsiLaunch.exe "/saved:situations\Linie 5.osn"Kod wyjścia 0/1. SAVED_SITUATION: mapa, czas i pozycja pochodzą z pliku .osn (situations\Linie 5.osn jest dostarczany z OMSI 2 i startuje na mapie Berlin-Spandau z autobusem gracza). Wartość jest tożsamością sytuacji wypisaną przez /list:Situations (względną wobec instalacji, bez rozróżniania wielkości liter); sama nazwa pliku, taka jak Linie 5.osn, nie zostaje rozwiązana (OL_E_SITUATION_NOT_FOUND, kod wyjścia 1). /map lub /entrypoint-index razem z /saved są odrzucane z kodem wyjścia 2. Zmiany i przywracanie jak dla NEW_MAP. OMSI sam zapisuje mapę sytuacji w options.cfg [last_map]; ten zapis OMSI nie jest cofany, chyba że /set nakłada options.cfg (patrz transakcje i odzyskiwanie).
OmsiLaunch.exe /new /map:maps\Grundorf\global.cfg /entrypoint-index:1 /set:traffic.randomVehicles=150 /set:traffic.humans=200 /set:graphics.maxFPS=60Kod wyjścia 0. Zmienia: options.cfg (nakładka sesji, semantyczna poprawka tokenów/wektorów; bajty CP1252 zachowane) oraz nakładki ekranu startowego. Przywracane: options.cfg i pliki ekranu startowego, dokładnie (RV-005, RV-006). /set:graphics.texture=... kończy się kodem 2 (OL_E_SETTING_NOT_WRITABLE); /set:foo=1 kończy się kodem 2 (OL_E_UNKNOWN_SETTING).
OmsiLaunch.exe /new /map:maps\Grundorf\global.cfg /entrypoint-index:1 /splash:UnsetKod wyjścia 0. Zmienia: brak nakładki ekranu startowego; tylko przekazanie startowe i obsługa closecheck. Przywracane: dla ekranu startowego nie ma nic do przywrócenia.
OmsiLaunch.exe /new /map:maps\Grundorf\global.cfg /entrypoint-index:1 /splash:Managed /splash-language:PTB /splash-assets:.omsilaunch\assets\my-splashKod wyjścia 0 (1 z OL_E_SESSION_PRESENTATION_INVALID, gdy brakuje katalogu lub pliku BMP albo plik nie ma formatu 640x480 24-bit). Zmienia: GUI\NewSplashscreen_ENG.bmp i GUI\NewSplashscreen_PTB.bmp z własnego katalogu (nakładka sesji). Przywracane: oba pliki, dokładnie.
OmsiLaunch.exe /new /map:maps\Grundorf\global.cfg /entrypoint-index:1 /internet-textures:DisabledKod wyjścia 0. Zmienia: nic na dysku poza nakładkami ekranu startowego; mechanizm pobierania działający w procesie jest wyłączony na czas sesji.
OmsiLaunch.exe /new /map:maps\Grundorf\global.cfg /entrypoint-index:1 /internet-textures:Override /internet-textures-profile:<ITX_PATH>Kod wyjścia 0 (2 z OL_E_ITX_PROFILE_REQUIRED, jeśli pominięto profil; 1 dla niepoprawnego profilu lub celu poza Texture\). Zmienia: Texture\standard.itx (nakładka sesji); każdy cel wymieniony w profilu oraz Texture\standard.ipr są usunięciami sesji. Przywracane: nakładka usunięta, usunięte oryginały przywrócone; pliki utworzone przez OMSI pod tymi ścieżkami w trakcie sesji są usuwane jako produkty uboczne sesji.
OmsiLaunch.exe /new /map:maps\Grundorf\global.cfg /entrypoint-index:1 /startup-timeout:300Kod wyjścia 0. Czeka na Running do 300 s (+5 s) zamiast domyślnych 180 s. /shutdown-timeout:60 jest akceptowane, ale w tym buildzie nie ma żadnego efektu.
Predefiniowany profil sesji#
Plik profilu <OMSI_PATH>\.omsilaunch\session-profiles\grundorf-quick\profile.yaml:
schema: omsilaunch.session-profile/v1
id: grundorf-quick
name: Grundorf quick start
author: Example
version: "1.0"
compatibility:
maps:
- maps\Grundorf\global.cfg
new:
map: maps\Grundorf\global.cfg
entrypoint-index: 1
presets:
- index: 1
id: low
name: Low detail
settings:
graphics.maxFPS: 30
graphics.tileDistance: 3OmsiLaunch.exe /predefined-profile:grundorf-quick /predefined-profile-index:1 /newKod wyjścia 0. Zmienia: options.cfg (ustawienia z ustawienia wstępnego, nakładka sesji) i nakładki ekranu startowego. Przywracane: wszystkie. Dodanie /map:... lub /set:graphics.maxFPS=60 kończy się kodem 2 (OL_E_SESSION_PROFILE_OVERRIDE_CONFLICT); pominięcie /predefined-profile-index kończy się kodem 2 (OL_E_SESSION_PROFILE_PRESET_NOT_FOUND). Dołączony do pakietu przykład .omsilaunch\examples\session-profiles\rmg-leste\profile.yaml pokazuje pełny schemat, ale w dostarczonej postaci jego blok new: żąda date, time i weather, których ten build nie potrafi zastosować: zaplanowanie go z /new daje NOT RUNNABLE (OL_E_CAPABILITY_UNAVAILABLE); przed użyciem należy usunąć te klucze.
Plik LaunchSpec#
OmsiLaunch.exe /spec:.omsilaunch\examples\release-session.example.json /plan --json
OmsiLaunch.exe /spec:.omsilaunch\examples\release-session.example.jsonKod wyjścia 0/1. Dołączony do pakietu przykład wybiera Grundorf, indeks punktu wejścia 1, zarządzany ekran startowy i natywne tekstury internetowe; RootPath: "." jest rozwiązywane na katalog pliku wykonywalnego. Zmiany jak w jawnym przykładzie NEW_MAP. Specyfikacja z nieznaną właściwością kończy się kodem 2 (OL_E_SPEC_UNKNOWN_PROPERTY: $.Path); brakujący plik – kodem 6 (OL_E_SPEC_NOT_FOUND); plik większy niż 1 MiB – kodem 2 (OL_E_SPEC_TOO_LARGE).
OmsiLaunch.exe "<OTHER_OMSI_PATH>" /spec:<SPEC_PATH> /startup-timeout:120Kod wyjścia 0/1. Jawna instalacja <OTHER_OMSI_PATH> ma pierwszeństwo przed RootPath ze specyfikacji; /startup-timeout nadpisuje Behavior.StartupTimeoutSeconds ze specyfikacji tylko dlatego, że zostało podane.
Ciche (odłączone) uruchomienie#
OmsiLaunch.exe /silent /new /map:maps\Grundorf\global.cfg /entrypoint-index:1Kod wyjścia 0, gdy tylko OmsiLaunchW.exe zostanie uruchomiony ({"delegated": true, "host_process_id": <pid>}); 7, jeśli brakuje OmsiLaunchW.exe (OL_E_WINDOWS_HOST_MISSING) lub nie udało się go uruchomić. Program uruchamiający wraca natychmiast i nie utrzymuje otwartej konsoli ani potoków wywołującego: skrypt przechwytujący jego wyjście od razu otrzymuje koniec pliku (domknięcie runtime T04). Sama sesja działa w OmsiLaunchW.exe: bez wyjścia na konsolę, błędy w oknach komunikatu, dostępna ikona w obszarze powiadomień. Postęp można sprawdzić za pomocą session status, events watch i .omsilaunch\diagnostics\<sessionId>-host.log. Pełna dokumentacja: OmsiLaunchW.exe.
Sterowanie uruchomioną sesją (tryb klienta)#
Poniższe polecenia należy uruchamiać z tego samego katalogu instalacji, gdy działa właściciel. Każde kończy się kodem 4 (OL_E_NO_ACTIVE_SESSION), gdy żaden właściciel nie odpowiada, i kodem 7 przy błędzie sterowania.
OmsiLaunch.exe session status --jsonKod wyjścia 0. Zwraca SessionId, State (14 = Running), Diagnostics, RuntimeEvents. Niczego nie zmienia.
OmsiLaunch.exe events read --json
OmsiLaunch.exe events watchKod wyjścia 0 (events watch działa do Ctrl+C). Ograniczona lista zdarzeń runtime (gameplay.entered, zdarzenia cyklu życia D3D, ...). Niczego nie zmienia.
OmsiLaunch.exe session stopKod wyjścia 0 ({"accepted": true, "session_id": "..."}). Żąda kanonicznego zatrzymania: OMSI jest kończony, właściciel przywraca nakładki, dziennik jest usuwany. Klient wraca natychmiast; proces właściciela kończy się po przywróceniu.
Odczyty runtime#
OmsiLaunch.exe time get
OmsiLaunch.exe weather get
OmsiLaunch.exe weather actual get
OmsiLaunch.exe map get
OmsiLaunch.exe camera get
OmsiLaunch.exe player get
OmsiLaunch.exe timetable get
OmsiLaunch.exe timetable lines list
OmsiLaunch.exe drivers list
OmsiLaunch.exe tickets get
OmsiLaunch.exe vehicles summary
OmsiLaunch.exe humans summaryKod wyjścia 0 z RuntimeCommandResult (Succeeded, Values) w kopercie. Niczego nie zmienia. Limit czasu 8 s (OL_E_RUNTIME_REQUEST_TIMEOUT, kod wyjścia 7).
OmsiLaunch.exe vehicles list
OmsiLaunch.exe vehicles get --handle=rv-000001
OmsiLaunch.exe hof get --handle=rv-000001
OmsiLaunch.exe constants list --handle=rv-000001
OmsiLaunch.exe constants get --handle=rv-000001 --name=antrieb_getr_version
OmsiLaunch.exe curves list --handle=rv-000001
OmsiLaunch.exe curves evaluate --handle=rv-000001 --name=retarder_stufe1 --x=0
OmsiLaunch.exe scripts variable list --handle=rv-000001
OmsiLaunch.exe scripts variable get --handle=rv-000001 --name=Refresh_Strings
OmsiLaunch.exe scripts string list --handle=rv-000001
OmsiLaunch.exe scripts string get --handle=rv-000001 --name=act_route
OmsiLaunch.exe humans list
OmsiLaunch.exe humans get --handle=hb-000001Kod wyjścia 0; 2, gdy brakuje wymaganego argumentu (OL_E_RUNTIME_ARGUMENT_REQUIRED, zgłaszane przed wysłaniem żądania); 7, gdy wtyczka odrzuca żądanie: OL_E_RUNTIME_OPERATION_FAILED z konkretną przyczyną w Values.detail, na przykład OL_E_RUNTIME_OBJECT_HANDLE_STALE dla uchwytu, który nie identyfikuje już tego samego obiektu, lub OL_E_RUNTIME_CONSTANT_NOT_FOUND. Uchwyty mają zasięg sesji i pochodzą z poprzedzającego list. Nazwy zmiennych, stałych i krzywych są definiowane przez każdy model pojazdu: należy je pobrać z wyniku list. Powyższe nazwy zostały wyświetlone dla rv-000001, autobusu gracza w sesji situations\Linie 5.osn. Niczego nie zmienia.
OmsiLaunch.exe /runtime:timetable.track-entries.list
OmsiLaunch.exe /runtime:vehicle.constant.get /runtime-arg:handle=rv-000001 /runtime-arg:name=antrieb_getr_versionKod wyjścia 0. Operacje bez hierarchicznej ścieżki polecenia, a także dowolną ścieżkę, można zaadresować identyfikatorem operacji. timetable.track-entries.list jest listą ograniczoną: dla situations\Linie 5.osn zwróciła 137 z 825 wpisów z truncated=true (ponowny test runtime w audycie dokumentacji). Niczego nie zmienia.
Zapisy runtime#
OmsiLaunch.exe time set --minute=30Kod wyjścia 0. Zmienia zegar OMSI w pamięci (zweryfikowano: zapis, odczyt zwrotny, przywrócenie drugim time set). Nie jest cofane przy zatrzymaniu.
OmsiLaunch.exe camera set --field_of_view=50
OmsiLaunch.exe camera lock --family=0 --preset=1
OmsiLaunch.exe camera unlockKod wyjścia 0 (2, gdy dla camera lock brakuje --family). Zmienia stan kamery na czas sesji. camera lock wymaga PlayerVehicle (na przykład sesji /saved); w sesji /new bez pojazdu gracza kończy się błędem (OL_E_RUNTIME_PLAYER_VEHICLE_UNAVAILABLE w Values.detail). Blokada i odblokowanie zostały zweryfikowane w runtime z zapisaną sytuacją (rodziny 0, 2 i 1 z odczytem zwrotnym kamery). Nie jest cofane przy zatrzymaniu; zasada blokady kończy się wraz z sesją.
OmsiLaunch.exe scripts variable set --handle=rv-000001 --name=Refresh_Strings --value=1Kod wyjścia 0 (2, jeśli brakuje handle, name lub value). Zmienia jedną liczbową zmienną skryptu tego pojazdu. Nie jest cofane.
OmsiLaunch.exe weather set --wind_speed=1Kod wyjścia 7. Zawsze odrzucane z OL_E_RUNTIME_SETTING_NOT_PERSISTENT; nic nie jest zmieniane.
Dodawanie pojazdów#
OmsiLaunch.exe vehicles spawn --model=Vehicles\MAN_SD200\MAN_SD77.bus
OmsiLaunch.exe vehicles place-randomKod wyjścia 0 z nowym uchwytem rv-NNNNNN w Values (2, gdy brakuje --model; 7 przy OL_E_MAKEVEHICLE_BUS_NOT_FOUND, OL_E_MAKEVEHICLE_DELTA_ZERO, OL_E_MAKEVEHICLE_DELTA_MULTIPLE, OL_E_RUNTIME_BUS_IDENTITY_INVALID). Limit czasu klienta 30 s. Zmienia kolekcję pojazdów drogowych (dodawany jest jeden pojazd); nie przypisuje pojazdu gracza. Nie jest cofane; pojazd znika wraz z OMSI przy zatrzymaniu.
Tekstury D3D#
OmsiLaunch.exe /runtime:d3d.status
OmsiLaunch.exe /runtime:d3d.texture.create --width=8 --height=8 --format=A8R8G8B8 --levels=1
OmsiLaunch.exe /runtime:d3d.texture.describe --handle=<HANDLE> --level=0
OmsiLaunch.exe /runtime:d3d.texture.update --handle=<HANDLE> --level=0 --x=0 --y=0 --width=8 --height=8 --pixels_base64=<BASE64>
OmsiLaunch.exe /runtime:d3d.texture.release --handle=<HANDLE><HANDLE> to wartość handle wypisana przez create (d3dtex-<session id>-<16 hex digits>). <BASE64> musi po zdekodowaniu dawać width * height * 4 bajtów dla formatów 32-bitowych (8 x 8 x 4 = 256 bajtów) i najwyżej 48 KiB. Kod wyjścia 0; 2 przy brakujących wymaganych argumentach; 7 przy OL_E_D3D_INVALID_TEXTURE_FORMAT, OL_E_D3D_INVALID_PIXEL_BUFFER, OL_E_D3D_RESOURCE_RELEASED (drugie zwolnienie lub describe po zwolnieniu), OL_E_D3D_STALE_RESOURCE_HANDLE (uchwyt sprzed resetu urządzenia lub z innej sesji), OL_E_D3D_RESET_IN_PROGRESS, OL_E_D3D_NOT_READY, OL_E_D3D_DEVICE_LOST. Tworzy zasoby GPU należące do sesji; są one zwalniane jawnie lub po zakończeniu OMSI. Żadne pliki nie są modyfikowane.
Pojedyncza operacja runtime po stronie właściciela#
OmsiLaunch.exe /new /map:maps\Grundorf\global.cfg /entrypoint-index:1 /runtime:time.read /observe-seconds:5Kod wyjścia 0. Uruchamia sesję, wykonuje time.read jednokrotnie po osiągnięciu Running (limit czasu 5 s), zapisuje .omsilaunch\diagnostics\<sessionId>-runtime-operation.json, działa przez 5 s, zatrzymuje się i przywraca pliki. Błąd runtime jest wypisywany jako runtime_error i nie kończy sesji.
Odzyskiwanie#
OmsiLaunch.exe /recovery-status --jsonKod wyjścia 0: {"pending": false, ...}, gdy dziennik nie istnieje, {"pending": true, "recovered": false}, gdy istnieje. Kod wyjścia 7 (OL_E_INSTALLATION_BUSY), dopóki właściciel utrzymuje instalację. Niczego nie zmienia.
OmsiLaunch.exe /recover --jsonKod wyjścia 0, gdy nic nie oczekiwało lub przywrócenie zostało ukończone (recovered: true; diagnostics może zawierać restore.session-artifact-removed i OL_W_RESTORE_FOREIGN_FILE_RETAINED); kod wyjścia 8, gdy dziennik oczekiwał i nadal oczekuje (OL_E_RECOVERY_BACKUP_CORRUPT, OL_E_RECOVERY_ABSENT_OWNERSHIP_MISMATCH, OL_E_RECOVERY_ABSENT_OWNERSHIP_UNVERIFIED, OL_E_RECOVERY_JOURNAL_REMOVE_FAILED); kod wyjścia 7, dopóki właściciel lub zapisany w dzienniku proces OMSI utrzymuje instalację (OL_E_INSTALLATION_BUSY); kod wyjścia 10 (OL_E_INTERNAL), gdy przywrócone bajty nie przejdą weryfikacji (Restore hash mismatch lub Restore presence mismatch; dziennik pozostaje oczekujący). Zmienia: przywraca każdy zapisany w dzienniku plik z .omsilaunch\backup\<sessionId>\ po zweryfikowaniu jego SHA-256, a następnie usuwa dziennik i katalog kopii zapasowej. Odmowa z OL_E_INSTALLATION_BUSY, dopóki zapisany w dzienniku Omsi.exe nadal działa (domknięcie runtime S04, S04b, F01).
Szybkie sprawdzenie kodu wyjścia (PowerShell)#
& .\OmsiLaunch.exe /new /map:maps\Grundorf\global.cfg /entrypoint-index:1 /plan --json | Out-Null
$LASTEXITCODE # 0 = READY, 1 = NOT RUNNABLE, 2 = bad arguments