Справочник по CLI

Документация версии v0.1.0-beta.3Исходник на GitHub

Перевод исходной страницы на английском языке для OmsiLaunch 0.1.0-beta3. Нормативной является английская страница: при расхождениях приоритет имеют английская страница и код.

Эта страница — полный нормативный справочник по командной строке OmsiLaunch 0.1.0-beta3: три исполняемых файла, грамматика аргументов, порядок диспетчеризации, все командные слова, все иерархические маршруты, все флаги, выходные конверты и поведение каждой команды при ошибках. Она составлена на основе tools\OmsiLaunch.Cli\Program.cs (CliProgram.RunAsync, OwnerSession.RunAsync, CliInput.Parse, CliInput.KnownFlags, CliInput.AcceptedNoEffectFlags, CliInput.CommandWordsAccepted, CliInput.HierarchicalRoutes, CliInput.BuildSpecAsync, CliEventWatch), tools\OmsiLaunch.Cli\LaunchSpecJson.cs и двух нативных shim-обёрток в tools\OmsiLaunch.Bootstrapper. Результаты процесса перечислены в разделе коды выхода, коды ошибок — в разделе ошибки, готовые примеры вызовов — в разделе примеры CLI.

Исполняемые файлы#

ФайлПодсистемаРольОтличия
OmsiLaunch.exeКонсольНативный загрузчик (OmsiLaunch.Bootstrapper.cpp): определяет собственный каталог, разбирает командную строку на токены с помощью CommandLineToArgvW, находит hostfxr через nethost.dll и запускает OmsiLaunch.Controller.dll с теми же аргументами.Вывод в консоль выполняется; код выхода процесса — это код выхода управляемого контроллера либо код shim-обёртки 100..106, если хост .NET не удалось запустить.
OmsiLaunchW.exeWindows (GUI)Та же shim-обёртка (OmsiLaunch.WindowsHost.cpp), собранная для подсистемы Windows. Перед запуском контроллера она устанавливает переменную окружения OMSILAUNCH_WINDOWS_HOST=1.Консоли нет: вывод в консоль подавляется, если не указан --json (WindowsHost.SuppressConsole), ошибки показываются в окнах сообщений (WindowsHost.ShowFailure: сообщение, Code: OL_E_... и подсказка See .omsilaunch\diagnostics for details.), а сбой shim-обёртки 100..106 показывается как OmsiLaunch could not start the .NET host (code N). Полное описание поведения: справочник по OmsiLaunchW.exe.
OmsiLaunch.Controller.dllУправляемый (x64, net6.0-windows, Windows Forms)Сам контроллер. Пользователи никогда не вызывают его напрямую; обе shim-обёртки передают путь к контроллеру первым аргументом хоста, поэтому он никогда не появляется в публичном списке аргументов.Требуется среда выполнения .NET 6 x64 с Microsoft.WindowsDesktop.App; см. раздел установка.

Файл nethost.dll должен находиться рядом с shim-обёртками. Сами shim-обёртки аргументы не читают; каждый аргумент доходит до CliInput.Parse без изменений, поэтому OmsiLaunch.exe и OmsiLaunchW.exe принимают в точности одинаковый синтаксис.

Модель вызова#

Грамматика аргументов (CliInput.Parse)#

ФормаЗначение
/key:value, /key, -key:value, -keyФлаг. Ключ нечувствителен к регистру; значение — всё, что стоит после первого :. Неизвестные ключи приводят к ошибке OL_E_INVALID_ARGUMENT (Unknown argument: ...), код выхода 2.
--key=valueRuntime-аргумент для выбранной runtime-операции (например, --handle=rv-000001). Любой токен --, содержащий =, является runtime-аргументом и никогда не является флагом.
--json, /jsonСтруктурированный вывод (см. Форматы вывода). --json — единственный токен -- без =, имеющий смысл; он разбирается как флаг /json.
слово без префиксаЕсли командное слово ещё не встречалось и это слово входит в список командных слов, оно становится командой. Если командное слово уже есть, каждое последующее слово без префикса является командным словом (маршрутом). В противном случае первое слово без префикса считается корневым каталогом установки, а каждое последующее слово без префикса добавляется к маршруту.

Следствия: иерархический маршрут (time get) нельзя сочетать с аргументом установки, стоящим после него (time get D:\OMSI — это неизвестный маршрут time get d:\omsi, код выхода 2). Вызов D:\OMSI time get принимается, но это режим владельца (запускается новый сеанс, и операция выполняется в нём один раз). Ошибки разбора (ArgumentException, FormatException, InvalidDataException, OverflowException) и ошибки профиля сеанса (SessionProfileException) сообщаются до того, как что-либо будет выполнено, всегда с кодом выхода 2.

Корневой каталог установки#

  • Явный аргумент установки в виде слова без префикса имеет приоритет над RootPath в файле /spec (CliInput.BuildSpecAsync).
  • . означает каталог, в котором находится исполняемый файл (AppContext.BaseDirectory), и никогда не означает рабочий каталог вызывающей стороны (CliInput.ResolveInstallationRoot). На это опирается портативный пакет.
  • Если аргумент не указан, операции режима владельца (/new, /saved, /spec, /list, /recovery-status, /recover) также используют каталог исполняемого файла. Путь нормализуется с помощью Path.GetFullPath.
  • Команды в режиме клиента никогда не принимают аргумент установки: они обращаются к конечной точке локального управления той установки, в которой находится исполняемый файл (AppContext.BaseDirectory). См. раздел локальное управление.

Владелец и клиент#

  • Владелец: процесс, который планирует, запускает, контролирует и восстанавливает сеанс (OwnerSession.RunAsync). Он удерживает аренду установки (lease) (Local\OmsiLaunch.Installation.<sha256(root)>) и транзакцию конфигурации, предоставляет конечную точку локального управления, пока сеанс жив, и показывает значок в трее. На одну установку приходится ровно один владелец: если владелец уже отвечает на session.status через конечную точку управления, второй запуск завершается ошибкой OL_E_SESSION_ALREADY_ACTIVE (код выхода 7).
  • Клиент: любой вызов без аргумента установки, отправляющий session status, session stop, events read, events watch или runtime-операцию. Он пересылается через локальный канал управления (pipe); при отсутствии владельца он завершается ошибкой OL_E_NO_ACTIVE_SESSION (код выхода 4).

Порядок диспетчеризации (CliProgram.RunAsync)#

  1. /silent (если процесс ещё не выполняется под OmsiLaunchW.exe): запустить OmsiLaunchW.exe из каталога исполняемого файла через ShellExecute (без наследования дескрипторов) с теми же аргументами за вычетом /silent/--silent, записать конверт silent (delegated, host_process_id) и вернуть 0. Консольный процесс не ждёт завершения сеанса; см. OmsiLaunchW.exe. OL_E_WINDOWS_HOST_MISSING / OL_E_WINDOWS_HOST_START_FAILED возвращают 7.
  2. /version: конверт version с полями product, version (информационная версия сборки, проставляемая из OmsiLaunch.Version.props, 0.1.0-beta3), protocol_version (0.1), supported_family (OMSI_2_3_004_COMMON); код выхода 0.
  3. capabilities: конверт со всеми дескрипторами PublicStableBeta или PublicExperimental из PublicCapabilityRegistry; код выхода 0.
  4. help [family]: конверт help с полями usage, product_version, protocol_version, family и публичными commands (CliRoute, Description, Classification, RuntimeValidation), при необходимости отфильтрованными по семейству; код выхода 0.
  5. profiles: конверт с полем family и поддерживаемыми вариантами исполняемого файла supported (ALTERNATE_LAA 692EBFBF..., runtime_validated=true; хеш Steam LAA 7DAB063D... с validation_status=pending_beta_field_validation); код выхода 0.
  6. Runtime-операция клиента (без аргумента установки, с маршрутом или /runtime:): аргументы проверяются через PublicCapabilityRegistry.ValidateRuntimeArguments (OL_E_RUNTIME_OPERATION_UNKNOWN, OL_E_RUNTIME_ARGUMENT_REQUIRED, код выхода 2), затем runtime.execute пересылается с тайм-аутом 8 s (30 s для road-vehicles.spawn).
  7. Клиентские session status (750 ms), session stop (привязан к идентификатору активного сеанса, 750 ms), events read (750 ms), events watch (опрос каждые 250 ms до нажатия Ctrl+C).
  8. detect или полное отсутствие аргументов (нет установки, нет команды, нет /?, нет /spec, нет флага запуска, нет флага восстановления, нет /list): перечислить процессы Omsi и опросить конечную точку управления (250 ms); конверт detect; код выхода 0.
  9. /? или /help: вывести текст справки об использовании, код выхода 0. Любой другой вызов, в котором есть командное слово, но нет маршрута для диспетчеризации (например, только d3d или session status D:\OMSI), выводит текст справки и завершается с кодом 2.
  10. Режим владельца. Предварительные условия: plugins\OmsiLaunch.Plugin.opl и plugins\OmsiLaunch.Native.x86.dll должны находиться рядом с исполняемым файлом (OL_E_RUNTIME_INSTALLATION_INCOMPLETE, код выхода 7). Файл release-manifest.json рядом с исполняемым файлом, если он есть, задаёт ожидаемые хеши плагинов.
  11. /recovery-status / /recover: RecoverPendingAsync; конверт recover с полями pending, recovered, diagnostics; код выхода 8 только в том случае, если восстановление было запрошено и не завершилось, иначе 0.
  12. /list:<category>: DiscoverAsync; конверт content.list; код выхода 0.
  13. Построить LaunchSpec (BuildSpecAsync), спланировать его (PlanSessionAsync), вывести план. /plan или /validate: код выхода 0, если IsRunnable, иначе 1. Неисполнимый план никогда не запускает OMSI (код выхода 1); под OmsiLaunchW.exe запуск с неисполнимым планом показывает его последнее диагностическое сообщение OL_E_ в окне сообщения (аудит документации, BUG-06). При планировании также проверяется установленное замыкание постоянного плагина (набор его файлов) по release-manifest.json, поэтому отсутствующий или изменённый плагин делает план неисполнимым (OL_E_PERMANENT_PLUGIN_*).
  14. Проверить наличие уже работающего владельца (OL_E_SESSION_ALREADY_ACTIVE, код выхода 7), затем OwnerSession.RunAsync.

Жизненный цикл владельца (OwnerSession.RunAsync)#

  1. StartSessionAsync(plan). Начиная с этого момента каждый путь завершения доходит до CloseAsync в блоке finally: исключения, Ctrl+C (Console.CancelKeyPress), закрытие консоли / выход из системы (AppDomain.ProcessExit с бюджетом 4 s на остановку и восстановление; всё, что не успело выполниться, восстанавливается по журналу при следующем запуске), пункт трея «End session», session.stop через pipe и /observe-seconds.
  2. Значок в трее создаётся, если в спецификации не задан Presentation.SuppressTrayIcon.
  3. Ожидание состояния Running в течение StartupTimeoutSeconds + 5 секунд. Состояние выводится. Если состояние не Running, код выхода 1 (OmsiLaunchW.exe показывает The OMSI session did not reach gameplay. с последним диагностическим сообщением OL_E_ или OL_E_SESSION_START_FAILED).
  4. Выполняются проверочные пакеты (/runtime-batch, /runtime-write-batch, /d3d-batch) и записывают свои артефакты.
  5. Запускается конечная точка локального управления.
  6. /runtime:<operation> выполняется один раз (5 s, 15 s для road-vehicles.spawn); результат записывается в <root>\.omsilaunch\diagnostics\<sessionId>-runtime-operation.json и выводится. Сбой runtime-команды никогда не завершает сеанс (вместо этого выводится runtime_error).
  7. Ожидание: с /observe-seconds:n сеанс останавливается через n секунд или раньше — при остановке через трей или pipe либо при выходе OMSI; без этого флага владелец ждёт, пока OMSI не завершится или не будет запрошена остановка.
  8. Выводится итоговое состояние; код выхода 0, если Completed, иначе 1.

session.stop, пункт трея «End session», Ctrl+C и CloseAsync запрашивают каноническую остановку: OMSI принудительно завершается с помощью TerminateProcess (собственная процедура завершения OMSI не выполняется, и OMSI не перезаписывает options.cfg), после чего восстанавливается каждый файл, которым владеет сеанс. См. разделы жизненный цикл сеанса и транзакции и восстановление после сбоя.

Командные слова#

Все слова, принимаемые на первой позиции (CliInput.CommandWordsAccepted):

СловоНазначениеРежимПримечания
capabilitiesСписок публичных возможностейЛокально, без сеансаКонверт capabilities.
profilesСписок поддерживаемых вариантов Omsi.exeЛокально, без сеансаКонверт profiles.
detectСообщает о процессах Omsi.exe и активном владельцеЛокально, без сеансаТакже используется по умолчанию, если аргументы не указаны. Состояния: NO_OMSI_FOUND, OMSI_FOUND_UNMANAGED, для отдельного процесса UNKNOWN_BINARY_FOUND, если двоичный файл невозможно проанализировать; active_omsilaunch_instance, managed_session.
helpСправка об использовании и каталог публичных командЛокально, без сеансаhelp <family> фильтрует по семейству возможностей (session, time, weather, map, camera, vehicles, player, humans, timetable, scripts, constants, curves, hof, drivers, tickets, d3d, events).
sessionsession status, session stopКлиентРовно одно последующее слово; всё остальное выводит справку, код выхода 2. session plan/session start — это имена маршрутов API, а не слова CLI: используйте /plan и /new.
eventsevents read, events watchКлиентread один раз возвращает ограниченный список событий; watch каждые 250 ms выводит каждое новое событие (по Sequence) в виде конверта events.watch до нажатия Ctrl+C (код выхода 0), 4, если владелец не отвечает, 7 при ошибке управления.
timetime get, time setКлиентский маршрут
weatherweather get, weather set, weather actual getКлиентский маршрут
mapmap getКлиентский маршрут
cameracamera get, camera set, camera lock, camera unlockКлиентский маршрут
vehiclesvehicles list, vehicles get, vehicles summary, vehicles spawn, vehicles place-randomКлиентский маршрут
playerplayer getКлиентский маршрут
humanshumans list, humans get, humans summaryКлиентский маршрут
timetabletimetable get, timetable <table> list, timetable logs listКлиентский маршрут
scriptsscripts variable list|get|set, scripts string list|getКлиентский маршрут
constantsconstants list, constants getКлиентский маршрут
curvescurves list, curves evaluateКлиентский маршрут
hofhof getКлиентский маршрут
driversdrivers listКлиентский маршрут
ticketstickets getКлиентский маршрут
d3dЗарезервированное слово семействаНетУ d3d нет иерархического маршрута: d3d texture ... — неизвестный маршрут (код выхода 2), а одно только d3d выводит справку (код выхода 2). Операции D3D вызываются через /runtime:d3d.status, /runtime:d3d.texture.create и так далее (см. Операции без маршрута).

Иерархические маршруты#

CliInput.HierarchicalRoutes сопоставляет маршрут в нижнем регистре с идентификатором runtime-операции. Все маршруты требуют сеанса в состоянии Running и выполняются через runtime-почтовый ящик (mailbox) (ExecuteRuntimeAsync). Runtime-записи изменяют только состояние OMSI в памяти: они никогда не затрагивают файлы, не входят в транзакцию конфигурации и не откатываются при остановке (OMSI принудительно завершается). Стабильность определяется PublicCapabilityRegistry и матрицей проверки; подробности и поля результатов приведены в разделе runtime-управление.

МаршрутRuntime-операцияВидТребует RunningИзменяет OMSIУчастие в восстановленииСтабильностьПримечания
time gettime.readReadДаНетНетSTABLE_BETAПоля часов и календаря.
time settime.setWriteДаДа (часы в памяти)Нет, не откатываетсяEXPERIMENTALНапример, --minute=<0..59>; запись, обратное чтение и восстановление проверены 2026-09-20.
weather getweather.readReadДаНетНетSTABLE_BETA
weather setweather.setWriteДаНет (всегда отклоняется)НетUNAVAILABLEВозвращает OL_E_RUNTIME_SETTING_NOT_PERSISTENT; OMSI перезаписывает значение при следующем такте обновления погоды.
weather actual getweather.actual.readReadДаНетНетEXPERIMENTALСостояние контроллера фактической погоды / ICAO.
map getmap.readReadДаНетНетSTABLE_BETAИмя карты, файл, описание, количество тайлов, диапазон лет и сторона движения; повторно проверено в runtime на исправленном слоте карты.
camera getcamera.readReadДаНетНетSTABLE_BETA
camera setcamera.setWriteДаДа (скалярные параметры камеры, например --field_of_view=)Нет, не откатываетсяEXPERIMENTALЗапись и обратное чтение FOV проверены.
camera lockcamera.lockActionДаДа (политика в пределах сеанса)НетEXPERIMENTALТребует --family=<0..3> (водитель=0, пассажир=1, внешняя=2, карта=3), необязательно --preset=<n> (семейство 0 или 1). Нужно транспортное средство игрока (например, сохранённая ситуация). Проверено в runtime в итоговом наборе runtime-проверок (CAM01); строка RuntimeValidation в реестре по-прежнему содержит STATICALLY_VALIDATED (см. возможности).
camera unlockcamera.unlockActionДаДаНетEXPERIMENTALСнимает политику, установленную camera lock (CAM01).
vehicles listroad-vehicles.listReadДаНетНетSTABLE_BETAВозвращает handle вида rv-NNNNNN, действующие в пределах сеанса.
vehicles getroad-vehicle.readReadДаНетНетSTABLE_BETAТребует --handle=. Устаревший handle: OL_E_RUNTIME_OBJECT_HANDLE_STALE.
vehicles summaryroad-vehicles.readReadДаНетНетSTABLE_BETAКоличества и состояние игрока, без handle.
vehicles spawnroad-vehicles.spawnActionДаДа (добавляет один RoadVehicle)Нет, не удаляетсяEXPERIMENTALТребует --model=Vehicles\...\*.bus. Тайм-аут клиента 30 s, тайм-аут владельца 15 s. Не назначает транспортное средство игрока. RV-003 RUNTIME_PASS.
vehicles place-randomroad-vehicles.place-randomActionДаДаНетEXPERIMENTALПрофилированный PlaceRandomBus.
player getplayer-vehicle.readReadДаНетНетSTABLE_BETAСемантический null, если транспортного средства игрока нет.
humans listhumans.listReadДаНетНетEXPERIMENTALВозвращает handle вида hb-NNNNNN.
humans gethuman.readReadДаНетНетEXPERIMENTALТребует --handle=.
humans summaryhumans.readReadДаНетНетEXPERIMENTALТолько количества.
timetable gettimetable.readReadДаНетНетSTABLE_BETAСостояние менеджера расписания.
timetable tracks listtimetable.tracks.listReadДаНетНетSTABLE_BETAЧасть возможности timetable.read; подтверждение пакетным чтением 2026-09-20.
timetable trips listtimetable.trips.listReadДаНетНетSTABLE_BETAТо же.
timetable lines listtimetable.lines.listReadДаНетНетSTABLE_BETAТо же.
timetable tours listtimetable.tours.listReadДаНетНетSTABLE_BETAТо же.
timetable profiles listtimetable.profiles.listReadДаНетНетSTABLE_BETAТо же.
timetable bus-stops listtimetable.bus-stops.listReadДаНетНетSTABLE_BETAТо же.
timetable station-links listtimetable.station-links.listReadДаНетНетSTABLE_BETAТо же.
timetable logs listtimetable.logs.readReadДаНетНетSTABLE_BETAТо же.
drivers listdrivers.readReadДаНетНетEXPERIMENTALЗаписи водителей.
tickets gettickets.readReadДаНетНетEXPERIMENTALЗаписи наборов билетов.
hof getvehicle.hofs.readReadДаНетНетSTABLE_BETAТребует --handle=.
constants listvehicle.constants.listReadДаНетНетSTABLE_BETAТребует --handle=.
constants getvehicle.constant.getReadДаНетНетSTABLE_BETAТребует --handle=, --name=.
curves listvehicle.curves.listReadДаНетНетSTABLE_BETAТребует --handle=.
curves evaluatevehicle.curve.evaluateReadДаНетНетSTABLE_BETAТребует --handle=, --name=, --x=.
scripts variable listvehicle.variables.listReadДаНетНетEXPERIMENTALТребует --handle=.
scripts variable getvehicle.variable.getReadДаНетНетEXPERIMENTALТребует --handle=, --name=.
scripts variable setvehicle.variable.setWriteДаДа (переменная скрипта)Нет, не откатываетсяEXPERIMENTALТребует --handle=, --name=, --value= (конечное число).
scripts string listvehicle.string-variables.listReadДаНетНетEXPERIMENTALТребует --handle=.
scripts string getvehicle.string-variable.getReadДаНетНетEXPERIMENTALТребует --handle=, --name=.

Операции без маршрута#

У следующих публичных идентификаторов операций (PublicCapabilityRegistry.PublicRuntimeOperationIds) нет иерархического маршрута; они вызываются через /runtime:<operation> с --key=value или /runtime-arg:key=value: timetable.rv-files.list, timetable.track-entries.list, timetable.tour-entries.list, d3d.status, d3d.texture.create (обязательны width, height, format; levels необязателен), d3d.texture.describe (handle; level необязателен), d3d.texture.update (обязательны handle, width, height, pixels_base64; level, x, y необязательны), d3d.texture.release (handle). Операции D3D имеют статус EXPERIMENTAL; жизненный цикл текстур и инвалидация при сбросе устройства (device reset) проверены в runtime (итоговый набор runtime-проверок H02, D01; см. возможности). timetable.track-entries.list и timetable.tour-entries.list — ограниченные списки: результат, который не помещается в runtime-слот, сокращается (truncated=true). internal.road-vehicles.make-basic имеет статус INTERNAL и отклоняется с OL_E_RUNTIME_OPERATION_UNKNOWN как CLI, так и API.

Флаги#

Все флаги из CliInput.KnownFlags. «Фаза» — это launch-time (формирует LaunchSpec/план нового сеанса), runtime (действует на работающий сеанс) или control (меняет поведение самого CLI). Флаги, которые разбираются только для совместимости (CliInput.AcceptedNoEffectFlags), отмечены в своей строке.

Управление и вывод#

ФлагСинтаксис и значенияПо умолчаниюФазаСтабильностьПоведение
/?/?выкл.controlSTABLE_BETAВыводит текст справки, код выхода 0.
/help/helpвыкл.controlSTABLE_BETAТо же, что /?. (Слово без префикса help вместо этого возвращает структурированный каталог.)
/version/versionвыкл.controlSTABLE_BETAКонверт version, код выхода 0. Обрабатывается раньше всех остальных команд, кроме /silent.
/json/json или --jsonвыкл.controlSTABLE_BETAВыводит JSON-конверты (envelope); также принудительно включает вывод в консоль даже под OmsiLaunchW.exe.
/quiet/quietвыкл.controlACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECTУстанавливает CliInput.Quiet; это значение ничто не читает (принимается для совместимости, сейчас ни на что не влияет).
/silent/silent (также --silent)выкл.controlEXPERIMENTALПередаёт всю командную строку в OmsiLaunchW.exe и возвращает 0, как только процесс хоста запущен. Результат сеанса сообщают OmsiLaunchW.exe (окна сообщений, значок в трее), .omsilaunch\diagnostics и конечная точка локального управления. Делегирование и диалоги ошибок проверены в runtime (итоговый набор runtime-проверок T04); см. OmsiLaunchW.exe.
/serve/serveвыкл.controlACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECTУстанавливает CliInput.Serve; это значение ничто не читает. Конечная точка управления всегда запускается владельцем.
/verbose/verboseвыкл.launch-timePARTIALDiagnosticsSpec.Verbose. Значения переносятся в спецификацию; их действие ограничено трассировкой хоста в .omsilaunch\diagnostics.
/log/logвкл. (DiagnosticsSpec.Log по умолчанию true)launch-timePARTIALDiagnosticsSpec.Log. Фактически всегда включён.
/logall/logallвыкл.launch-timePARTIALОдновременно устанавливает Verbose, ProcessTrace, PluginTrace и NativeTrace.
/omsi-logall/omsi-logallвыкл.launch-timePARTIALDiagnosticsSpec.OmsiLogAll.
/trace/traceвыкл.launch-timePARTIALПсевдоним /trace-process.
/trace-process/trace-processвыкл.launch-timePARTIALDiagnosticsSpec.ProcessTrace.
/trace-plugin/trace-pluginвыкл.launch-timePARTIALDiagnosticsSpec.PluginTrace.
/trace-native/trace-nativeвыкл.launch-timePARTIALDiagnosticsSpec.NativeTrace.

Планирование, проверка и тестовые обвязки#

ФлагСинтаксис и значенияПо умолчаниюФазаСтабильностьПоведение
/plan/planвыкл.launch-timeSTABLE_BETAСтроит и выводит SessionPlan, не запуская OMSI. Код выхода 0, если IsRunnable, иначе 1. Требует выбора запуска (/new, /saved, /spec или аргумента установки); одиночный /plan без всего остального выполняет detect.
/validate/validateвыкл.launch-timeSTABLE_BETAВ этой сборке идентичен /plan.
/runtime-batch/runtime-batchвыкл.runtime (владелец)INTERNALПроверочная обвязка: после Running выполняет набор операций чтения и записывает <sessionId>-runtime-read-batch.json.
/runtime-write-batch/runtime-write-batchвыкл.runtime (владелец)INTERNALПроверочная обвязка: чтения плюс time.set, camera.set и vehicle.variable.set с восстановлением; записывает <sessionId>-runtime-write-batch.json.
/d3d-batch/d3d-batchвыкл.runtime (владелец)INTERNALПроверочная обвязка для жизненного цикла текстур D3D; записывает <sessionId>-d3d-wave-d-batch.json.
/runtime/runtime:<operation>нетruntimeSTABLE_BETA (диспетчеризация)Выбирает публичную runtime-операцию по идентификатору. Режим клиента (без аргумента установки): пересылается владельцу. Режим владельца: выполняется один раз после Running. Неизвестные идентификаторы: OL_E_RUNTIME_OPERATION_UNKNOWN, код выхода 2.
/runtime-arg/runtime-arg:<key>=<value> (можно повторять)нетruntimeSTABLE_BETA (диспетчеризация)Runtime-аргумент; эквивалентен --key=value. Нет =: /runtime-arg requires key=value, код выхода 2.

Выбор мира#

ФлагСинтаксис и значенияПо умолчаниюФазаСтабильностьПоведение
/new/newWorldMode.NewMap — режим по умолчанию, но запуск запрашивается, только если присутствует один из флагов /new, /saved, /last, /speclaunch-timeSTABLE_BETANEW_MAP. Требует /map и /entrypoint-index (план без индекса точки входа в представленном списке сообщает OL_E_ENTRYPOINT_REQUIRED; без /map карта не определяется). /new никогда не выбирает карту неявно.
/saved/saved:<file.osn>нетlaunch-timeSTABLE_BETASAVED_SITUATION. Карта и позиция берутся из .osn; /map, /entrypoint, /entrypoint-index вместе с /saved отклоняются (код выхода 2). Сохранённая ситуация не найдена: OL_E_SITUATION_NOT_FOUND; не найдена её карта: OL_E_SITUATION_MAP_NOT_FOUND.
/last/lastнетlaunch-timeUNAVAILABLELAST_MAP_STATE. В этом профиле всегда приводит к OL_E_CAPABILITY_UNAVAILABLE (план неисполним, код выхода 1); резервный выбор .osn по отметке времени не выполняется.
/map/map:<identity> (например, maps\Grundorf\global.cfg)нетlaunch-timeSTABLE_BETAИдентификатор карты для /new или область поиска для /list:Entrypoints. Неизвестная карта: OL_E_MAP_NOT_FOUND.
/entrypoint/entrypoint:<identity>нетlaunch-timeUNAVAILABLEТочка входа по метке. Заблокировано проверкой: план записывает world.entrypoint-identity как RUNTIME_PARTIAL и становится неисполнимым (OL_E_CAPABILITY_UNAVAILABLE). Взаимоисключается с /entrypoint-index (идентификатор имеет приоритет и сбрасывает индекс).
/entrypoint-index/entrypoint-index:<n>, 0..2147483647нетlaunch-timeSTABLE_BETAИндекс точки входа в представленном списке (нумерация с 1, как её показывает OMSI). Обязателен для исполнимого плана NEW_MAP.

Дата, время и погода#

Все четыре принимаются и переносятся в LaunchSpec, но нативный путь запуска их не применяет: планировщик записывает их как STATICALLY_PARTIAL и добавляет OL_E_CAPABILITY_UNAVAILABLE, поэтому план НЕИСПОЛНИМ (код выхода 1). Файл /spec или профиль сеанса, задающие эти значения, дают тот же результат.

ФлагСинтаксис и значенияПо умолчаниюФазаСтабильностьПоведение
/date/date:<yyyy-mm-dd> или /date:systemне заданоlaunch-timeUNAVAILABLEDateSpec явный/системный. Значение, которое не удаётся разобрать: OL_E_INVALID_ARGUMENT, код выхода 2.
/time/time:<hh:mm[:ss]> или /time:systemне заданоlaunch-timeUNAVAILABLETimeSpec явный/системный.
/year/year:<n> или /year:systemне заданоlaunch-timeUNAVAILABLEYearSpec.
/weather/weather:<preset>не заданоlaunch-timeUNAVAILABLEWeatherMode.Preset.
/weather-icao/weather-icao:<code>не заданоlaunch-timeUNAVAILABLEWeatherMode.Icao.
/weather-real/weather-realне заданоlaunch-timeUNAVAILABLEWeatherMode.RealCurrent. Действует последний из /weather, /weather-icao, /weather-real.

Транспортное средство игрока#

Принимаются и сопоставляются с установкой, но не применяются runtime: каждое заданное поле получает STATICALLY_PARTIAL и добавляет OL_E_CAPABILITY_UNAVAILABLE (план НЕИСПОЛНИМ, код выхода 1).

ФлагСинтаксис и значенияПо умолчаниюФазаСтабильностьПоведение
/vehicle/vehicle:<identity> (Vehicles\...\*.bus)не заданоlaunch-timeUNAVAILABLEОпределяется первым (OL_E_VEHICLE_NOT_FOUND, если неизвестно).
/repaint/repaint:<id>не заданоlaunch-timeUNAVAILABLEОпределяется только вместе с /vehicle (OL_E_REPAINT_NOT_FOUND).
/hof/hof:<id>не заданоlaunch-timeUNAVAILABLEOL_E_HOF_NOT_FOUND, если неизвестно.
/fleet/fleet:<n>не заданоlaunch-timeUNAVAILABLEБортовой номер.
/registration/registration:<text>не заданоlaunch-timeUNAVAILABLEРегистрационный номер.
/no-vehicle/no-vehicleвыкл.launch-timeSTABLE_BETAУдаляет транспортное средство игрока из исходных данных (/spec или профиль). Безвреден.

Overlay конфигурации#

ФлагСинтаксис и значенияПо умолчаниюФазаСтабильностьПоведение
/set/set:<key>=<value> (можно повторять; ключи нечувствительны к регистру)нетlaunch-timeSTABLE_BETAСемантический overlay (временная замена файла на время сеанса) для options.cfg из ConfigurationCatalog (например, graphics.maxFPS=60, traffic.randomVehicles=150). Неизвестный ключ: OL_E_UNKNOWN_SETTING (код выхода 2); ключ только для чтения (advanced.multithreadingCalculate, advanced.multithreadingTextureLoad, graphics.texture, graphics.textureFilter): OL_E_SETTING_NOT_WRITABLE (код выхода 2); значение вне диапазона или с неверным форматом: OL_E_INVALID_SETTING_VALUE при построении overlay. Overlay — это изменение в рамках сеанса: для него создаётся снимок (snapshot), он применяется до запуска OMSI и побайтово восстанавливается при остановке (RV-005 RUNTIME_PASS). Конфликт с ключом, которым владеет пресет выбранного профиля: OL_E_SESSION_PROFILE_OVERRIDE_CONFLICT.

Отображение заставки#

ФлагСинтаксис и значенияПо умолчаниюФазаСтабильностьПоведение
/splash/splash:Managed, /splash:Native, /splash:Unset (без учёта регистра)Managedlaunch-timeSTABLE_BETAManaged: входящие в пакет 24-битные BMP размером 640x480 один раз копируются в <root>\.omsilaunch\assets\splash, а GUI\NewSplashscreen_ENG.bmp и GUI\NewSplashscreen_<lang>.bmp подменяются через overlay в рамках транзакции и точно восстанавливаются (RV-006 RUNTIME_PASS). Native/Unset (псевдонимы): файлы OMSI не затрагиваются. Значение не указано: /splash requires Unset, Native, or Managed, код выхода 2.
/splash-language/splash-language:PTB|ENG|DEU|FRA (также pt-BR, de, fr, en; любое другое значение заменяется на ENG)[language] из options.cfg, иначе ENGlaunch-timeSTABLE_BETAВыбирает локализованный целевой файл.
/splash-assets/splash-assets:<directory> (относительные пути разрешаются внутри корневого каталога установки)<root>\.omsilaunch\assets\splash, иначе набор из пакетаlaunch-timeSTABLE_BETAПользовательский каталог ресурсов; должен содержать ENG.bmp, а для неанглийского языка — <lang>.bmp. Ошибки: OL_E_SPLASH_ASSET_DIRECTORY_MISSING, OL_E_SPLASH_ASSET_MISSING, OL_E_SPLASH_FORMAT_UNSUPPORTED (в плане выводятся как OL_E_SESSION_PRESENTATION_INVALID; план неисполним).

Интернет-текстуры#

ФлагСинтаксис и значенияПо умолчаниюФазаСтабильностьПоведение
/internet-textures/internet-textures:Native|Disabled|OverrideNativelaunch-timeEXPERIMENTALNative: без изменений. Disabled: профилированный внутрипроцессный загрузчик подавляется. Override: указанный профиль .itx подменяется через overlay как Texture\standard.itx; каждая цель HTTP(S), указанная в нём, а также Texture\standard.ipr становятся удалениями в рамках сеанса (удаляются на время сеанса и восстанавливаются при остановке). Значение не указано: код выхода 2.
/internet-textures-profile/internet-textures-profile:<file.itx>нетlaunch-timeEXPERIMENTALОбязателен с Override (OL_E_ITX_PROFILE_REQUIRED, код выхода 2). OL_E_ITX_PROFILE_MISSING, OL_E_ITX_PROFILE_INVALID (должны быть пары строк URL/цель с URL http/https), OL_E_ITX_TARGET_OUTSIDE_TEXTURE_PATH (цели должны разрешаться внутри Texture\ без абсолютных путей, .. и точек повторного анализа).

Профили сеанса#

ФлагСинтаксис и значенияПо умолчаниюФазаСтабильностьПоведение
/predefined-profile/predefined-profile:<id>нетlaunch-timeSTABLE_BETA (компиляция; офлайн-тесты OmsiLaunch.ProfileTests)Загружает <root>\.omsilaunch\session-profiles\<id>\profile.yaml (см. профили сеанса). Требует /predefined-profile-index (OL_E_SESSION_PROFILE_PRESET_NOT_FOUND, код выхода 2). Блок new: применяется только с /new; compatibility.maps применяется для /new и /saved (OL_E_SESSION_PROFILE_MAP_MISMATCH). Явные флаги, конфликтующие с полем, которым владеет профиль, отклоняются с OL_E_SESSION_PROFILE_OVERRIDE_CONFLICT (CliInput.RejectProfileConflicts): карта/точка входа/дата/время/год/погода, если ими владеет блок new:; ключи /set, которыми владеет пресет; флаги заставки, если у пресета есть presentation; флаги интернет-текстур, если у него есть internet-textures; тайм-ауты, если у него есть behavior.
/predefined-profile-index/predefined-profile-index:<1..5>нетlaunch-timeSTABLE_BETAВыбирает пресет по index. Вне диапазона: код выхода 2.

Файл LaunchSpec#

ФлагСинтаксис и значенияПо умолчаниюФазаСтабильностьПоведение
/spec/spec:<path.json>нетlaunch-timeSTABLE_BETA (загрузчик проверен офлайн-тестами; семантика сеанса идентична флагам)Загружает JSON-файл LaunchSpec в качестве исходных данных (см. LaunchSpec) и отмечает, что запрошен запуск. Правила (LaunchSpecJson): файл должен существовать (OL_E_SPEC_NOT_FOUND, код выхода 6); не более 1 MiB (OL_E_SPEC_TOO_LARGE, код выхода 2); корень должен быть объектом (OL_E_SPEC_INVALID); имена свойств нечувствительны к регистру; комментарии // и завершающие запятые допускаются; глубина не более 32; каждое неизвестное свойство отклоняется с указанием его JSON-пути (OL_E_SPEC_UNKNOWN_PROPERTY: $.Presentation.Foo, код выхода 2).

Приоритет (CliInput.BuildSpecAsync): значения по умолчанию → файл /spec → /predefined-profile (заменяет Installation и World, затем применяет профиль) → явные флаги. Явный аргумент установки имеет приоритет над RootPath в спецификации. /no-vehicle удаляет транспортное средство игрока из спецификации; /vehicle и родственные флаги объединяются с ним поле за полем. Ключи /set объединяются с Environment.General. /splash, /splash-language, /splash-assets, /internet-textures, /internet-textures-profile переопределяют значения, только если указаны. /startup-timeout и /shutdown-timeout переопределяют значения, только если указаны; Presentation.SuppressTrayIcon берётся только из спецификации (флага нет). Флаги диагностики объединяются по ИЛИ с Diagnostics из спецификации.

Обнаружение контента#

ФлагСинтаксис и значенияПо умолчаниюФазаСтабильностьПоведение
/list/list:<category>; категории — значения ContentQueryKind Maps, Situations, Vehicles, Repaints, Hofs, FleetNumbers, Registrations, Addons, Entrypoints (без учёта регистра)нетлокально, без сеансаSTABLE_BETADiscoverAsync по установке; конверт content.list с элементами Identity, Kind, DisplayName; код выхода 0. Неизвестная категория: Unknown discovery category, код выхода 2. Точки повторного анализа (junction/символические ссылки) пропускаются, файлы OMSI читаются в кодировке Windows-1252.
/vehicle-scope/vehicle-scope:<vehicle identity>нетлокальноSTABLE_BETAОбласть поиска, передаваемая для всех категорий, кроме Entrypoints, которая использует в качестве области /map.

Тайм-ауты и наблюдение#

ФлагСинтаксис и значенияПо умолчаниюФазаСтабильностьПоведение
/startup-timeout/startup-timeout:<1..600> секундзначение из спецификации/профиля, иначе 180launch-timeSTABLE_BETABehavior.StartupTimeoutSeconds. Владелец ждёт Running в течение этого значения плюс 5 s; OL_E_STARTUP_TIMEOUT завершает сеанс с кодом выхода 1.
/shutdown-timeout/shutdown-timeout:<1..600> секундзначение из спецификации/профиля, иначе 30launch-timeACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECTПереносится в Behavior.ShutdownTimeoutSeconds; в этой сборке супервизор его не использует (OMSI принудительно завершается, а не получает просьбу закрыться).
/observe-seconds/observe-seconds:<0..2147483647>нет (работа до выхода OMSI или запроса остановки)runtime (владелец)STABLE_BETAВерхняя граница фазы работы: через n секунд в состоянии Running запрашивается каноническая остановка. Остановка через трей или pipe либо выход OMSI завершают её раньше. 0 останавливает сразу после Running.

Восстановление после сбоя#

ФлагСинтаксис и значенияПо умолчаниюФазаСтабильностьПоведение
/recovery-status/recovery-statusвыкл.локальноSTABLE_BETAСообщает, является ли <root>\.omsilaunch\journal.json незавершённым (pending), никогда ничего не восстанавливает; код выхода 0. Берёт аренду установки: OL_E_INSTALLATION_BUSY (код выхода 7), пока её удерживает владелец.
/recover/recoverвыкл.локальноSTABLE_BETAВосстанавливает незавершённый журнал (резервные копии сначала сверяются с SHA-256 снимка; OL_E_RECOVERY_BACKUP_CORRUPT, OL_E_RECOVERY_ABSENT_OWNERSHIP_MISMATCH, OL_W_RESTORE_FOREIGN_FILE_RETAINED сообщаются в diagnostics). Код выхода 0, если незавершённых транзакций не было или восстановление завершилось; 8, если журнал был незавершённым и таким остался. Отклоняется с OL_E_INSTALLATION_BUSY, пока жив записанный в журнал процесс OMSI (PID, время создания, путь к exe) или — для журнала после HandoffCreated без PID — любой Omsi.exe из этого корневого каталога. Каждый запуск сеанса автоматически выполняет такое же восстановление перед чтением установки.

Форматы вывода#

  • Конверт успеха (CliInput.WriteEnvelope, с --json): {"ok": true, "command": "<name>", "protocol_version": "0.1", "result": <object>}, с отступами. Пересланные ответы session status и events read добавляют член metadata, если более старые события были опущены, чтобы уместиться во фрейм управления (events_dropped_count, см. локальное управление). Без --json выводится только <object> в виде JSON с отступами, а после него — Note: <n> older events were omitted to fit the control frame., если события были отброшены.
  • Конверт ошибки (CliInput.WriteError, с --json): {"ok": false, "command": "<name>", "protocol_version": "0.1", "error": {"code": "OL_E_...", "category": "<category>", "message": "..."}}. Без --json: OL_E_<CODE>: message в одной строке. Категории: invalid_argument, unsupported_profile, session, runtime, not_found, transaction, internal. Под OmsiLaunchW.exe тот же код и сообщение показываются в окне сообщения.
  • План и состояние (CliInput.Write): записи SessionPlan, SessionStatus и RuntimeCommandResult выводятся как JSON с отступами без конверта. Без --json план выводится кратко как Plan: READY profile=Omsi23004_692EBFBF или Plan: NOT RUNNABLE profile=...; остальные записи по-прежнему выводятся как JSON. Значения перечислений сериализуются как целые числа (SessionState.Running — 14, Completed — 18, Failed — 19).
  • Имена команд, используемые в конвертах: silent, version, capabilities, help, profiles, detect, recover, content.list, session, session.status, session.stop, events.read, events.watch, events watch, installation, cli, session profile, а также идентификатор runtime-операции для пересланных runtime-команд.
  • Под OmsiLaunchW.exe (OMSILAUNCH_WINDOWS_HOST=1) в консоль ничего не выводится, если не указан --json.

Ошибки по командам#

КомандаТипичные коды ошибокКод выхода
Любая ошибка разбораOL_E_INVALID_ARGUMENT, коды профиля сеанса (OL_E_SESSION_PROFILE_*)2
/silentOL_E_WINDOWS_HOST_MISSING, OL_E_WINDOWS_HOST_START_FAILED7
Клиентский маршрут, /runtime (клиент)OL_E_RUNTIME_OPERATION_UNKNOWN, OL_E_RUNTIME_ARGUMENT_REQUIRED (2); OL_E_NO_ACTIVE_SESSION (4); OL_E_CONTROL_*, OL_E_RUNTIME_*, возвращённые владельцем, например OL_E_RUNTIME_REQUEST_TIMEOUT, OL_E_RUNTIME_OBJECT_HANDLE_STALE, OL_E_RUNTIME_SETTING_NOT_PERSISTENT, OL_E_RUNTIME_RESPONSE_TOO_LARGE, OL_E_SESSION_NOT_RUNNING (7)2, 4, 7
session status, session stop, events read, events watchOL_E_NO_ACTIVE_SESSION (4); OL_E_CONTROL_SESSION_MISMATCH, OL_E_CONTROL_PROTOCOL, OL_E_CONTROL_FAILED (7)4, 7
Предварительные проверки владельцаOL_E_RUNTIME_INSTALLATION_INCOMPLETE, OL_E_SESSION_ALREADY_ACTIVE7
/recovery-status, /recoverOL_E_INSTALLATION_BUSY (7); OL_E_RECOVERY_*, OL_E_RESTORE_FAILED (8); незавершённый журнал, который не удалось восстановить (8)7, 8
/listнеизвестная категория (2); OL_E_INSTALLATION_NOT_FOUND/отсутствующие каталоги (6)2, 6
/specOL_E_SPEC_NOT_FOUND (6); OL_E_SPEC_TOO_LARGE, OL_E_SPEC_INVALID, OL_E_SPEC_UNKNOWN_PROPERTY (2)2, 6
/setOL_E_UNKNOWN_SETTING, OL_E_SETTING_NOT_WRITABLE, OL_E_INVALID_SETTING_VALUE2
/plan, /validate, запускдиагностические сообщения плана: OL_E_PERMANENT_PLUGIN_MISSING, OL_E_PERMANENT_PLUGIN_HASH_MISMATCH, OL_E_PERMANENT_PLUGIN_MANIFEST_INCOMPLETE (установленное замыкание плагина), OL_E_UNSUPPORTED_BUILD, OL_E_UNSUPPORTED_OPERATING_SYSTEM, OL_E_INSTALLATION_NOT_WRITABLE, OL_E_MAP_NOT_FOUND, OL_E_ENTRYPOINT_REQUIRED, OL_E_SITUATION_NOT_FOUND, OL_E_SITUATION_MAP_NOT_FOUND, OL_E_VEHICLE_NOT_FOUND, OL_E_REPAINT_NOT_FOUND, OL_E_HOF_NOT_FOUND, OL_E_CAPABILITY_UNAVAILABLE, OL_E_SESSION_PRESENTATION_INVALID, OL_E_RUNTIME_ARTIFACT_MISSING, plugin.integrity.reference (информационное)1
Запуск сеансаOL_E_PLAN_NOT_RUNNABLE (повторное планирование при запуске, 1); OL_E_PERMANENT_PLUGIN_MISSING, OL_E_PERMANENT_PLUGIN_HASH_MISMATCH, OL_E_PERMANENT_PLUGIN_MANIFEST_INCOMPLETE, OL_E_RELEASE_MANIFEST_INVALID (обычно сообщаются при планировании как диагностическое сообщение плана, код выхода 1; 7 — только если файлы плагина изменились между планированием и запуском), OL_E_INSTALLATION_BUSY (7); OL_E_PROCESS_START_FAILED, OL_E_PROCESS_EXITED_EARLY, OL_E_STARTUP_TIMEOUT, OL_E_WORLD_START_FAILED, OL_E_SITUATION_LOAD_FAILED, OL_E_PLUGIN_NOT_LOADED (сеанс Failed, 1)1, 7
Необработанное исключение в любом местеклассифицируется CliProgram.Classify (см. коды выхода)2..10

Окружение#

ПеременнаяКем устанавливаетсяДействие
OMSILAUNCH_WINDOWS_HOST=1OmsiLaunchW.exeWindowsHost.IsActive: вывод в консоль подавлен, ошибки показываются в окнах сообщений, /silent повторно не делегируется.

См. также#

Примеры CLI · OmsiLaunchW.exe · коды выхода · ошибки · локальное управление · трей Windows · runtime-управление · возможности · LaunchSpec · профили сеанса · упаковка · совместимость · известные ограничения · публичный API