Referência da CLI

Documentação da versão v0.1.0-beta.3Ver código-fonte no GitHub

Tradução da página original em inglês do OmsiLaunch 0.1.0-beta3. A página em inglês é a referência normativa: em caso de divergência, prevalecem a página em inglês e o código.

Esta página é a referência completa e normativa da linha de comandos do OmsiLaunch 0.1.0-beta3: os três executáveis, a gramática de argumentos, a ordem de despacho, todas as palavras de comando, todas as rotas hierárquicas, todas as flags, os envelopes de saída e o comportamento de erro de cada comando. É gerada a partir de tools\OmsiLaunch.Cli\Program.cs (CliProgram.RunAsync, OwnerSession.RunAsync, CliInput.Parse, CliInput.KnownFlags, CliInput.AcceptedNoEffectFlags, CliInput.CommandWordsAccepted, CliInput.HierarchicalRoutes, CliInput.BuildSpecAsync, CliEventWatch), de tools\OmsiLaunch.Cli\LaunchSpecJson.cs e dos dois shims nativos em tools\OmsiLaunch.Bootstrapper. Os resultados de processo estão listados em códigos de saída; os códigos de erro em erros; invocações comentadas em exemplos da CLI.

Executáveis#

FicheiroSubsistemaFunçãoDiferenças
OmsiLaunch.exeConsolaBootstrapper nativo (OmsiLaunch.Bootstrapper.cpp): determina o seu próprio diretório, divide a linha de comandos em tokens com CommandLineToArgvW, localiza o hostfxr através de nethost.dll e executa OmsiLaunch.Controller.dll com os mesmos argumentos.A saída de consola é escrita; o código de saída do processo é o código de saída do controlador gerido, ou um código do shim 100..106 se não tiver sido possível iniciar o host .NET.
OmsiLaunchW.exeWindows (GUI)O mesmo shim (OmsiLaunch.WindowsHost.cpp) compilado para o subsistema Windows. Define a variável de ambiente OMSILAUNCH_WINDOWS_HOST=1 antes de iniciar o controlador.Sem consola: a saída de consola é suprimida, a menos que seja indicado --json (WindowsHost.SuppressConsole), as falhas são apresentadas em caixas de mensagem (WindowsHost.ShowFailure: mensagem, Code: OL_E_... e a indicação See .omsilaunch\diagnostics for details.), e uma falha do shim 100..106 é apresentada como OmsiLaunch could not start the .NET host (code N). Comportamento completo: referência de OmsiLaunchW.exe.
OmsiLaunch.Controller.dllGerido (x64, net6.0-windows, Windows Forms)O próprio controlador. Nunca é invocado diretamente pelos utilizadores; ambos os shims passam o caminho do controlador como primeiro argumento do host, pelo que este nunca aparece na lista pública de argumentos.Requer o runtime .NET 6 x64 com Microsoft.WindowsDesktop.App; ver instalação.

O nethost.dll tem de estar junto dos shims. Os próprios shims não leem nenhum argumento; todos os argumentos chegam inalterados a CliInput.Parse, pelo que OmsiLaunch.exe e OmsiLaunchW.exe aceitam exatamente a mesma sintaxe.

Modelo de invocação#

Gramática de argumentos (CliInput.Parse)#

FormaSignificado
/key:value, /key, -key:value, -keyUma flag. A chave não distingue maiúsculas de minúsculas; o valor é tudo o que vem depois do primeiro :. Chaves desconhecidas falham com OL_E_INVALID_ARGUMENT (Unknown argument: ...), saída 2.
--key=valueUm argumento de runtime para a operação de runtime selecionada (por exemplo --handle=rv-000001). Qualquer token -- que contenha = é um argumento de runtime, nunca uma flag.
--json, /jsonSaída estruturada (ver Formatos de saída). --json é o único token -- sem = com significado; é interpretado como a flag /json.
palavra simplesSe ainda não tiver sido vista nenhuma palavra de comando e a palavra for uma das palavras de comando, torna-se o comando. Uma vez presente uma palavra de comando, todas as palavras simples seguintes são palavras de comando (a rota). Caso contrário, a primeira palavra simples é a raiz da instalação e qualquer palavra simples posterior é acrescentada à rota.

Consequências: uma rota hierárquica (time get) não pode ser combinada com um argumento de instalação colocado depois dela (time get D:\OMSI é a rota desconhecida time get d:\omsi, saída 2). D:\OMSI time get é aceite, mas é modo proprietário (é iniciada uma nova sessão e a operação é executada uma vez dentro dela). Os erros de interpretação (ArgumentException, FormatException, InvalidDataException, OverflowException) e os erros de perfil de sessão (SessionProfileException) são comunicados antes de qualquer execução, sempre com saída 2.

Raiz da instalação#

  • Um argumento de instalação explícito, sob a forma de palavra simples, prevalece sobre RootPath num ficheiro /spec (CliInput.BuildSpecAsync).
  • . significa o diretório que contém o executável (AppContext.BaseDirectory), nunca o diretório de trabalho do chamador (CliInput.ResolveInstallationRoot). Um pacote portátil depende disto.
  • Quando o argumento é omitido, as operações em modo proprietário (/new, /saved, /spec, /list, /recovery-status, /recover) também usam o diretório do executável. O caminho é normalizado com Path.GetFullPath.
  • Os comandos em modo cliente nunca recebem um argumento de instalação: dirigem-se ao endpoint de controlo local da instalação onde se encontra o executável (AppContext.BaseDirectory). Ver controlo local.

Proprietário e cliente#

  • Proprietário: o processo que planeia, inicia, supervisiona e restaura uma sessão (OwnerSession.RunAsync). Detém o lease da instalação (Local\OmsiLaunch.Installation.<sha256(root)>) e a transação de configuração, expõe o endpoint de controlo local enquanto a sessão está ativa e mostra o ícone da área de notificação. Exatamente um proprietário por instalação: se um proprietário já responder a session.status no endpoint de controlo, um segundo lançamento falha com OL_E_SESSION_ALREADY_ACTIVE (saída 7).
  • Cliente: qualquer invocação sem argumento de instalação que envie session status, session stop, events read, events watch ou uma operação de runtime. É reencaminhada pelo pipe de controlo local; sem proprietário, falha com OL_E_NO_ACTIVE_SESSION (saída 4).

Ordem de despacho (CliProgram.RunAsync)#

  1. /silent (quando ainda não está a ser executado sob OmsiLaunchW.exe): iniciar OmsiLaunchW.exe a partir do diretório do executável através de ShellExecute (sem herança de handles) com os mesmos argumentos exceto /silent/--silent, escrever o envelope silent (delegated, host_process_id) e devolver 0. O processo de consola não espera pela sessão; ver OmsiLaunchW.exe. OL_E_WINDOWS_HOST_MISSING / OL_E_WINDOWS_HOST_START_FAILED devolvem 7.
  2. /version: envelope version com product, version (versão informativa do assembly, carimbada a partir de OmsiLaunch.Version.props, 0.1.0-beta3), protocol_version (0.1), supported_family (OMSI_2_3_004_COMMON); saída 0.
  3. capabilities: envelope com todos os descritores PublicStableBeta ou PublicExperimental de PublicCapabilityRegistry; saída 0.
  4. help [family]: envelope help com usage, product_version, protocol_version, family e os commands públicos (CliRoute, Description, Classification, RuntimeValidation), opcionalmente filtrados por família; saída 0.
  5. profiles: envelope com family e as variantes de executável supported (ALTERNATE_LAA 692EBFBF..., runtime_validated=true; o hash Steam LAA 7DAB063D... com validation_status=pending_beta_field_validation); saída 0.
  6. Operação de runtime do cliente (sem argumento de instalação e com uma rota ou /runtime:): argumentos validados com PublicCapabilityRegistry.ValidateRuntimeArguments (OL_E_RUNTIME_OPERATION_UNKNOWN, OL_E_RUNTIME_ARGUMENT_REQUIRED, saída 2); depois runtime.execute é reencaminhado com um timeout de 8 s (30 s para road-vehicles.spawn).
  7. session status do cliente (750 ms), session stop (associado ao id da sessão ativa, 750 ms), events read (750 ms), events watch (consulta a cada 250 ms até Ctrl+C).
  8. detect, ou nenhum argumento (sem instalação, sem comando, sem /?, sem /spec, sem flag de lançamento, sem flag de recuperação, sem /list): enumerar os processos Omsi e sondar o endpoint de controlo (250 ms); envelope detect; saída 0.
  9. /? ou /help: imprimir o texto de utilização, saída 0. Qualquer outra invocação que tenha uma palavra de comando mas nenhuma rota despachável (por exemplo d3d sozinho ou session status D:\OMSI) imprime o texto de utilização e sai com 2.
  10. Modo proprietário. Pré-condições: plugins\OmsiLaunch.Plugin.opl e plugins\OmsiLaunch.Native.x86.dll têm de existir junto do executável (OL_E_RUNTIME_INSTALLATION_INCOMPLETE, saída 7). O release-manifest.json junto do executável, quando presente, fornece os hashes esperados dos plugins.
  11. /recovery-status / /recover: RecoverPendingAsync; envelope recover com pending, recovered, diagnostics; saída 8 apenas quando foi pedido um restauro que não foi concluído; caso contrário 0.
  12. /list:<category>: DiscoverAsync; envelope content.list; saída 0.
  13. Construir o LaunchSpec (BuildSpecAsync), planeá-lo (PlanSessionAsync) e imprimir o plano. /plan ou /validate: saída 0 se IsRunnable, caso contrário 1. Um plano não executável nunca inicia o OMSI (saída 1); sob OmsiLaunchW.exe, um lançamento com um plano não executável mostra o seu último diagnóstico OL_E_ numa caixa de mensagem (auditoria de documentação BUG-06). O planeamento também verifica o conjunto de plugins permanentes instalados face ao release-manifest.json, pelo que um plugin em falta ou alterado torna o plano não executável (OL_E_PERMANENT_PLUGIN_*).
  14. Sondar a existência de um proprietário (OL_E_SESSION_ALREADY_ACTIVE, saída 7) e depois OwnerSession.RunAsync.

Ciclo de vida do proprietário (OwnerSession.RunAsync)#

  1. StartSessionAsync(plan). A partir daqui, todos os caminhos de saída chegam a CloseAsync num bloco finally: exceções, Ctrl+C (Console.CancelKeyPress), fecho da consola / fim de sessão do Windows (AppDomain.ProcessExit com um orçamento de 4 s para paragem + restauro; o que ficar por fazer é recuperado pelo journal no arranque seguinte), "End session" na área de notificação, session.stop pelo pipe e /observe-seconds.
  2. O ícone da área de notificação é criado, a menos que Presentation.SuppressTrayIcon esteja definido na especificação.
  3. Esperar por Running durante StartupTimeoutSeconds + 5 segundos. O estado é impresso. Se o estado não for Running, saída 1 (OmsiLaunchW.exe mostra The OMSI session did not reach gameplay. com o último diagnóstico OL_E_ ou OL_E_SESSION_START_FAILED).
  4. Os lotes de validação (/runtime-batch, /runtime-write-batch, /d3d-batch) são executados e escrevem os seus artefactos.
  5. O endpoint de controlo local é iniciado.
  6. /runtime:<operation> é executado uma vez (5 s, 15 s para road-vehicles.spawn); o resultado é escrito em <root>\.omsilaunch\diagnostics\<sessionId>-runtime-operation.json e impresso. Um comando de runtime que falhe nunca termina a sessão (em vez disso é impresso runtime_error).
  7. Espera: com /observe-seconds:n, a sessão é parada ao fim de n segundos ou antes, numa paragem pela área de notificação/pipe, ou quando o OMSI termina; sem essa flag, o proprietário espera até o OMSI terminar ou até ser pedida uma paragem.
  8. O estado final é impresso; saída 0 se Completed, 1 caso contrário.

session.stop, "End session" na área de notificação, Ctrl+C e CloseAsync pedem todos a paragem canónica: o OMSI é terminado com TerminateProcess (a rotina de encerramento do próprio OMSI não é executada e o options.cfg não é reescrito pelo OMSI) e, em seguida, todos os ficheiros pertencentes à sessão são restaurados. Ver ciclo de vida da sessão e transações e recuperação.

Palavras de comando#

Todas as palavras aceites na primeira posição (CliInput.CommandWordsAccepted):

PalavraFinalidadeModoNotas
capabilitiesListar as capacidades públicasLocal, sem sessãoEnvelope capabilities.
profilesListar as variantes suportadas de Omsi.exeLocal, sem sessãoEnvelope profiles.
detectComunicar os processos Omsi.exe e um proprietário ativoLocal, sem sessãoÉ também a predefinição quando não são indicados argumentos. Estados: NO_OMSI_FOUND, OMSI_FOUND_UNMANAGED, UNKNOWN_BINARY_FOUND por processo quando o binário não pode ser inspecionado; active_omsilaunch_instance, managed_session.
helpUtilização e catálogo público de comandosLocal, sem sessãohelp <family> filtra por família de capacidades (session, time, weather, map, camera, vehicles, player, humans, timetable, scripts, constants, curves, hof, drivers, tickets, d3d, events).
sessionsession status, session stopClienteExatamente uma palavra a seguir; qualquer outra coisa imprime a utilização, saída 2. session plan/session start são nomes de rotas da API, não palavras da CLI: usar /plan e /new.
eventsevents read, events watchClienteread devolve uma vez a lista limitada de eventos; watch imprime cada novo evento (por Sequence) como um envelope events.watch a cada 250 ms até Ctrl+C (saída 0), 4 quando nenhum proprietário responde, 7 num erro de controlo.
timetime get, time setRota de cliente
weatherweather get, weather set, weather actual getRota de cliente
mapmap getRota de cliente
cameracamera get, camera set, camera lock, camera unlockRota de cliente
vehiclesvehicles list, vehicles get, vehicles summary, vehicles spawn, vehicles place-randomRota de cliente
playerplayer getRota de cliente
humanshumans list, humans get, humans summaryRota de cliente
timetabletimetable get, timetable <table> list, timetable logs listRota de cliente
scriptsscripts variable list|get|set, scripts string list|getRota de cliente
constantsconstants list, constants getRota de cliente
curvescurves list, curves evaluateRota de cliente
hofhof getRota de cliente
driversdrivers listRota de cliente
ticketstickets getRota de cliente
d3dPalavra de família reservadaNenhumd3d não tem rota hierárquica: d3d texture ... é uma rota desconhecida (saída 2) e d3d sozinho imprime a utilização (saída 2). As operações D3D são acedidas com /runtime:d3d.status, /runtime:d3d.texture.create e assim por diante (ver Operações sem rota).

Rotas hierárquicas#

CliInput.HierarchicalRoutes faz corresponder uma rota em minúsculas a um id de operação de runtime. Todas as rotas requerem uma sessão Running e são executadas através da mailbox de runtime (ExecuteRuntimeAsync). As escritas de runtime alteram apenas o estado em memória do OMSI: nunca tocam em ficheiros, não fazem parte da transação de configuração e não são revertidas na paragem (o OMSI é terminado). A estabilidade segue o PublicCapabilityRegistry e a matriz de validação; os detalhes e os campos de resultado estão em controlo de runtime.

RotaOperação de runtimeTipoRequer RunningAltera o OMSIParticipação no restauroEstabilidadeNotas
time gettime.readReadSimNãoNenhumaSTABLE_BETACampos de relógio e calendário.
time settime.setWriteSimSim (relógio em memória)Nenhuma, não revertidaEXPERIMENTALPor exemplo --minute=<0..59>; escrita, releitura e restauro validados a 2026-09-20.
weather getweather.readReadSimNãoNenhumaSTABLE_BETA
weather setweather.setWriteSimNão (sempre rejeitada)NenhumaUNAVAILABLEDevolve OL_E_RUNTIME_SETTING_NOT_PERSISTENT; o OMSI sobrescreve o valor no seu próximo ciclo meteorológico.
weather actual getweather.actual.readReadSimNãoNenhumaEXPERIMENTALEstado do controlador de meteorologia real/ICAO.
map getmap.readReadSimNãoNenhumaSTABLE_BETANome do mapa, ficheiro, descrição, número de tiles, intervalo de anos e lado de circulação; revalidado em runtime no slot de mapa corrigido.
camera getcamera.readReadSimNãoNenhumaSTABLE_BETA
camera setcamera.setWriteSimSim (escalares da câmara, p. ex. --field_of_view=)Nenhuma, não revertidaEXPERIMENTALEscrita/releitura do FOV validada.
camera lockcamera.lockActionSimSim (política de âmbito da sessão)NenhumaEXPERIMENTALRequer --family=<0..3> (motorista=0, passageiro=1, exterior=2, mapa=3), --preset=<n> opcional (família 0 ou 1). Precisa de um veículo do jogador (por exemplo, uma situação guardada). Validado em runtime no fecho de runtime (CAM01); a string RuntimeValidation do registo continua a indicar STATICALLY_VALIDATED (ver capacidades).
camera unlockcamera.unlockActionSimSimNenhumaEXPERIMENTALLiberta a política definida por camera lock (CAM01).
vehicles listroad-vehicles.listReadSimNãoNenhumaSTABLE_BETADevolve handles rv-NNNNNN de âmbito da sessão.
vehicles getroad-vehicle.readReadSimNãoNenhumaSTABLE_BETARequer --handle=. Handle obsoleto: OL_E_RUNTIME_OBJECT_HANDLE_STALE.
vehicles summaryroad-vehicles.readReadSimNãoNenhumaSTABLE_BETAContagens e estado do jogador, sem handles.
vehicles spawnroad-vehicles.spawnActionSimSim (acrescenta um RoadVehicle)Nenhuma, não removidoEXPERIMENTALRequer --model=Vehicles\...\*.bus. Timeout de 30 s no cliente, 15 s no proprietário. Não atribui o veículo do jogador. RV-003 RUNTIME_PASS.
vehicles place-randomroad-vehicles.place-randomActionSimSimNenhumaEXPERIMENTALPlaceRandomBus perfilado.
player getplayer-vehicle.readReadSimNãoNenhumaSTABLE_BETANulo semântico quando não há veículo do jogador.
humans listhumans.listReadSimNãoNenhumaEXPERIMENTALDevolve handles hb-NNNNNN.
humans gethuman.readReadSimNãoNenhumaEXPERIMENTALRequer --handle=.
humans summaryhumans.readReadSimNãoNenhumaEXPERIMENTALApenas contagens.
timetable gettimetable.readReadSimNãoNenhumaSTABLE_BETAEstado do gestor de horários.
timetable tracks listtimetable.tracks.listReadSimNãoNenhumaSTABLE_BETAFaz parte da capacidade timetable.read; evidência de leitura em lote de 2026-09-20.
timetable trips listtimetable.trips.listReadSimNãoNenhumaSTABLE_BETAComo acima.
timetable lines listtimetable.lines.listReadSimNãoNenhumaSTABLE_BETAComo acima.
timetable tours listtimetable.tours.listReadSimNãoNenhumaSTABLE_BETAComo acima.
timetable profiles listtimetable.profiles.listReadSimNãoNenhumaSTABLE_BETAComo acima.
timetable bus-stops listtimetable.bus-stops.listReadSimNãoNenhumaSTABLE_BETAComo acima.
timetable station-links listtimetable.station-links.listReadSimNãoNenhumaSTABLE_BETAComo acima.
timetable logs listtimetable.logs.readReadSimNãoNenhumaSTABLE_BETAComo acima.
drivers listdrivers.readReadSimNãoNenhumaEXPERIMENTALRegistos de motoristas.
tickets gettickets.readReadSimNãoNenhumaEXPERIMENTALRegistos de pacotes de bilhetes.
hof getvehicle.hofs.readReadSimNãoNenhumaSTABLE_BETARequer --handle=.
constants listvehicle.constants.listReadSimNãoNenhumaSTABLE_BETARequer --handle=.
constants getvehicle.constant.getReadSimNãoNenhumaSTABLE_BETARequer --handle=, --name=.
curves listvehicle.curves.listReadSimNãoNenhumaSTABLE_BETARequer --handle=.
curves evaluatevehicle.curve.evaluateReadSimNãoNenhumaSTABLE_BETARequer --handle=, --name=, --x=.
scripts variable listvehicle.variables.listReadSimNãoNenhumaEXPERIMENTALRequer --handle=.
scripts variable getvehicle.variable.getReadSimNãoNenhumaEXPERIMENTALRequer --handle=, --name=.
scripts variable setvehicle.variable.setWriteSimSim (variável de script)Nenhuma, não revertidaEXPERIMENTALRequer --handle=, --name=, --value= (número finito).
scripts string listvehicle.string-variables.listReadSimNãoNenhumaEXPERIMENTALRequer --handle=.
scripts string getvehicle.string-variable.getReadSimNãoNenhumaEXPERIMENTALRequer --handle=, --name=.

Operações sem rota#

Estes ids de operação públicos (PublicCapabilityRegistry.PublicRuntimeOperationIds) não têm rota hierárquica e são invocados com /runtime:<operation> mais --key=value ou /runtime-arg:key=value: timetable.rv-files.list, timetable.track-entries.list, timetable.tour-entries.list, d3d.status, d3d.texture.create (width, height, format obrigatórios; levels opcional), d3d.texture.describe (handle; level opcional), d3d.texture.update (handle, width, height, pixels_base64 obrigatórios; level, x, y opcionais), d3d.texture.release (handle). As operações D3D são EXPERIMENTAL; o ciclo de vida das texturas e a invalidação por reposição do dispositivo (reset) estão validados em runtime (fecho de runtime H02, D01; ver capacidades). timetable.track-entries.list e timetable.tour-entries.list são listas limitadas: um resultado que não caiba no slot de runtime é encurtado (truncated=true). internal.road-vehicles.make-basic é INTERNAL e é rejeitado com OL_E_RUNTIME_OPERATION_UNKNOWN tanto pela CLI como pela API.

Flags#

Todas as flags de CliInput.KnownFlags. A "fase" é de lançamento (determina o LaunchSpec/plano de uma nova sessão), de runtime (atua sobre uma sessão em execução) ou de controlo (altera o comportamento da própria CLI). As flags interpretadas apenas por compatibilidade (CliInput.AcceptedNoEffectFlags) estão assinaladas na respetiva linha.

Controlo e saída#

FlagSintaxe e valoresPredefiniçãoFaseEstabilidadeComportamento
/?/?desligadacontroloSTABLE_BETAImprimir o texto de utilização, saída 0.
/help/helpdesligadacontroloSTABLE_BETAIgual a /?. (A palavra simples help devolve, em vez disso, o catálogo estruturado.)
/version/versiondesligadacontroloSTABLE_BETAEnvelope version, saída 0. Avaliada antes de qualquer outro comando, exceto /silent.
/json/json ou --jsondesligadacontroloSTABLE_BETAEmitir envelopes JSON; também força a saída de consola, mesmo sob OmsiLaunchW.exe.
/quiet/quietdesligadacontroloACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECTDefine CliInput.Quiet; nada a lê.
/silent/silent (também --silent)desligadacontroloEXPERIMENTALDelegar toda a linha de comandos em OmsiLaunchW.exe e devolver 0 assim que o processo host tiver arrancado. O resultado da sessão é comunicado pelo OmsiLaunchW.exe (caixas de mensagem, ícone da área de notificação), por .omsilaunch\diagnostics e pelo endpoint de controlo local. A delegação e as caixas de diálogo de falha estão validadas em runtime (fecho de runtime T04); ver OmsiLaunchW.exe.
/serve/servedesligadacontroloACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECTDefine CliInput.Serve; nada a lê. O endpoint de controlo é sempre iniciado por um proprietário.
/verbose/verbosedesligadalançamentoPARTIALDiagnosticsSpec.Verbose. Os valores são transportados na especificação; o seu efeito limita-se ao trace do host em .omsilaunch\diagnostics.
/log/logligada (DiagnosticsSpec.Log tem como predefinição true)lançamentoPARTIALDiagnosticsSpec.Log. Na prática, sempre ligada.
/logall/logalldesligadalançamentoPARTIALDefine em conjunto Verbose, ProcessTrace, PluginTrace e NativeTrace.
/omsi-logall/omsi-logalldesligadalançamentoPARTIALDiagnosticsSpec.OmsiLogAll.
/trace/tracedesligadalançamentoPARTIALAlias de /trace-process.
/trace-process/trace-processdesligadalançamentoPARTIALDiagnosticsSpec.ProcessTrace.
/trace-plugin/trace-plugindesligadalançamentoPARTIALDiagnosticsSpec.PluginTrace.
/trace-native/trace-nativedesligadalançamentoPARTIALDiagnosticsSpec.NativeTrace.

Planeamento, validação e harnesses#

FlagSintaxe e valoresPredefiniçãoFaseEstabilidadeComportamento
/plan/plandesligadalançamentoSTABLE_BETAConstruir e imprimir o SessionPlan, sem iniciar o OMSI. Saída 0 quando IsRunnable, 1 caso contrário. Requer uma seleção de lançamento (/new, /saved, /spec ou um argumento de instalação); /plan sozinho, sem mais nada, executa detect.
/validate/validatedesligadalançamentoSTABLE_BETAIdêntica a /plan nesta build.
/runtime-batch/runtime-batchdesligadaruntime (proprietário)INTERNALHarness de validação: após Running, executa o conjunto de operações de leitura e escreve <sessionId>-runtime-read-batch.json.
/runtime-write-batch/runtime-write-batchdesligadaruntime (proprietário)INTERNALHarness de validação: leituras mais time.set, camera.set e vehicle.variable.set com restauro; escreve <sessionId>-runtime-write-batch.json.
/d3d-batch/d3d-batchdesligadaruntime (proprietário)INTERNALHarness de validação para o ciclo de vida das texturas D3D; escreve <sessionId>-d3d-wave-d-batch.json.
/runtime/runtime:<operation>nenhumaruntimeSTABLE_BETA (despacho)Selecionar uma operação de runtime pública pelo id. Modo cliente (sem argumento de instalação): reencaminhada para o proprietário. Modo proprietário: executada uma vez após Running. Ids desconhecidos: OL_E_RUNTIME_OPERATION_UNKNOWN, saída 2.
/runtime-arg/runtime-arg:<key>=<value> (repetível)nenhumaruntimeSTABLE_BETA (despacho)Argumento de runtime; equivalente a --key=value. Sem =: /runtime-arg requires key=value, saída 2.

Seleção do mundo#

FlagSintaxe e valoresPredefiniçãoFaseEstabilidadeComportamento
/new/newWorldMode.NewMap é o modo predefinido, mas só é pedido um lançamento quando está presente uma de /new, /saved, /last, /speclançamentoSTABLE_BETANEW_MAP. Requer /map e /entrypoint-index (um plano sem um índice de ponto de entrada apresentado comunica OL_E_ENTRYPOINT_REQUIRED; sem /map nenhum mapa é resolvido). /new nunca seleciona um mapa silenciosamente.
/saved/saved:<file.osn>nenhumalançamentoSTABLE_BETASAVED_SITUATION. O mapa e a posição vêm do .osn; /map, /entrypoint, /entrypoint-index são rejeitadas com /saved (saída 2). Situação em falta: OL_E_SITUATION_NOT_FOUND; o respetivo mapa em falta: OL_E_SITUATION_MAP_NOT_FOUND.
/last/lastnenhumalançamentoUNAVAILABLELAST_MAP_STATE. Produz sempre OL_E_CAPABILITY_UNAVAILABLE (não executável, saída 1) neste perfil; não é feito nenhum recurso a um .osn com base em carimbos temporais.
/map/map:<identity> (por exemplo maps\Grundorf\global.cfg)nenhumalançamentoSTABLE_BETAIdentidade do mapa para /new, ou o âmbito para /list:Entrypoints. Desconhecida: OL_E_MAP_NOT_FOUND.
/entrypoint/entrypoint:<identity>nenhumalançamentoUNAVAILABLEPonto de entrada por etiqueta. Bloqueada por gate: o plano regista world.entrypoint-identity como RUNTIME_PARTIAL e torna-se não executável (OL_E_CAPABILITY_UNAVAILABLE). Mutuamente exclusiva com /entrypoint-index (a identidade prevalece e limpa o índice).
/entrypoint-index/entrypoint-index:<n>, 0..2147483647nenhumalançamentoSTABLE_BETAÍndice do ponto de entrada na lista apresentada (a partir de 1, tal como o OMSI o apresenta). Obrigatório para um plano NEW_MAP executável.

Data, hora e meteorologia#

As quatro são aceites e transportadas para o LaunchSpec, mas o caminho de arranque nativo não as aplica: o planeador regista-as como STATICALLY_PARTIAL e acrescenta OL_E_CAPABILITY_UNAVAILABLE, pelo que o plano é NÃO EXECUTÁVEL (saída 1). Um ficheiro /spec ou um perfil de sessão que as defina tem o mesmo efeito.

FlagSintaxe e valoresPredefiniçãoFaseEstabilidadeComportamento
/date/date:<yyyy-mm-dd> ou /date:systemnão definidalançamentoUNAVAILABLEDateSpec explícita/do sistema. Valor impossível de interpretar: OL_E_INVALID_ARGUMENT, saída 2.
/time/time:<hh:mm[:ss]> ou /time:systemnão definidalançamentoUNAVAILABLETimeSpec explícita/do sistema.
/year/year:<n> ou /year:systemnão definidalançamentoUNAVAILABLEYearSpec.
/weather/weather:<preset>não definidalançamentoUNAVAILABLEWeatherMode.Preset.
/weather-icao/weather-icao:<code>não definidalançamentoUNAVAILABLEWeatherMode.Icao.
/weather-real/weather-realnão definidalançamentoUNAVAILABLEWeatherMode.RealCurrent. Prevalece a última de /weather, /weather-icao, /weather-real.

Veículo do jogador#

Aceites e resolvidas face à instalação, mas não aplicadas pelo runtime: cada campo definido fica STATICALLY_PARTIAL e acrescenta OL_E_CAPABILITY_UNAVAILABLE (plano NÃO EXECUTÁVEL, saída 1).

FlagSintaxe e valoresPredefiniçãoFaseEstabilidadeComportamento
/vehicle/vehicle:<identity> (Vehicles\...\*.bus)não definidalançamentoUNAVAILABLEResolvida primeiro (OL_E_VEHICLE_NOT_FOUND se desconhecida).
/repaint/repaint:<id>não definidalançamentoUNAVAILABLEResolvida apenas em conjunto com /vehicle (OL_E_REPAINT_NOT_FOUND).
/hof/hof:<id>não definidalançamentoUNAVAILABLEOL_E_HOF_NOT_FOUND se desconhecida.
/fleet/fleet:<n>não definidalançamentoUNAVAILABLENúmero de frota.
/registration/registration:<text>não definidalançamentoUNAVAILABLEMatrícula.
/no-vehicle/no-vehicledesligadalançamentoSTABLE_BETARemove qualquer veículo do jogador da base (/spec ou perfil). Inofensiva.

Overlays de configuração#

FlagSintaxe e valoresPredefiniçãoFaseEstabilidadeComportamento
/set/set:<key>=<value> (repetível; chaves sem distinção de maiúsculas/minúsculas)nenhumalançamentoSTABLE_BETAOverlay semântico de options.cfg a partir de ConfigurationCatalog (por exemplo graphics.maxFPS=60, traffic.randomVehicles=150). Chave desconhecida: OL_E_UNKNOWN_SETTING (saída 2); chave só de leitura (advanced.multithreadingCalculate, advanced.multithreadingTextureLoad, graphics.texture, graphics.textureFilter): OL_E_SETTING_NOT_WRITABLE (saída 2); valor fora do intervalo ou malformado: OL_E_INVALID_SETTING_VALUE quando o overlay é construído. O overlay é uma mutação da sessão: é capturado em snapshot, aplicado antes de o OMSI arrancar e restaurado byte a byte na paragem (RV-005 RUNTIME_PASS). Conflitos com uma chave pertencente a uma predefinição (preset) de um perfil selecionado: OL_E_SESSION_PROFILE_OVERRIDE_CONFLICT.

Apresentação do splash#

FlagSintaxe e valoresPredefiniçãoFaseEstabilidadeComportamento
/splash/splash:Managed, /splash:Native, /splash:Unset (sem distinção de maiúsculas/minúsculas)ManagedlançamentoSTABLE_BETAManaged: os BMP de 640x480 e 24 bits incluídos no pacote são copiados uma vez para <root>\.omsilaunch\assets\splash, e GUI\NewSplashscreen_ENG.bmp mais GUI\NewSplashscreen_<lang>.bmp são sobrepostos de forma transacional e restaurados exatamente (RV-006 RUNTIME_PASS). Native/Unset (aliases): ficheiros do OMSI intactos. Valor em falta: /splash requires Unset, Native, or Managed, saída 2.
/splash-language/splash-language:PTB|ENG|DEU|FRA (também pt-BR, de, fr, en; qualquer outro valor recorre a ENG)[language] de options.cfg, senão ENGlançamentoSTABLE_BETASeleciona o ficheiro de destino localizado.
/splash-assets/splash-assets:<directory> (os caminhos relativos são resolvidos abaixo da raiz da instalação)<root>\.omsilaunch\assets\splash, senão o conjunto incluído no pacotelançamentoSTABLE_BETADiretório de recursos personalizado; tem de conter ENG.bmp e, para uma língua que não o inglês, <lang>.bmp. Erros: OL_E_SPLASH_ASSET_DIRECTORY_MISSING, OL_E_SPLASH_ASSET_MISSING, OL_E_SPLASH_FORMAT_UNSUPPORTED (apresentados como OL_E_SESSION_PRESENTATION_INVALID no plano; não executável).

Internet Textures#

FlagSintaxe e valoresPredefiniçãoFaseEstabilidadeComportamento
/internet-textures/internet-textures:Native|Disabled|OverrideNativelançamentoEXPERIMENTALNative: intacto. Disabled: o mecanismo de transferência perfilado dentro do processo é suprimido. Override: o perfil .itx indicado é sobreposto como Texture\standard.itx; todos os destinos HTTP(S) nele listados, mais Texture\standard.ipr, tornam-se eliminações da sessão (removidos durante a sessão, restaurados na paragem). Valor em falta: saída 2.
/internet-textures-profile/internet-textures-profile:<file.itx>nenhumalançamentoEXPERIMENTALObrigatória com Override (OL_E_ITX_PROFILE_REQUIRED, saída 2). OL_E_ITX_PROFILE_MISSING, OL_E_ITX_PROFILE_INVALID (tem de conter pares de linhas URL/destino com URLs http/https), OL_E_ITX_TARGET_OUTSIDE_TEXTURE_PATH (os destinos têm de ser resolvidos dentro de Texture\, sem caminhos absolutos, .. ou pontos de reanálise).

Perfis de sessão#

FlagSintaxe e valoresPredefiniçãoFaseEstabilidadeComportamento
/predefined-profile/predefined-profile:<id>nenhumalançamentoSTABLE_BETA (compilação; OmsiLaunch.ProfileTests offline)Carrega <root>\.omsilaunch\session-profiles\<id>\profile.yaml (ver perfis de sessão). Requer /predefined-profile-index (OL_E_SESSION_PROFILE_PRESET_NOT_FOUND, saída 2). O bloco new: só se aplica com /new; compatibility.maps é imposto para /new e /saved (OL_E_SESSION_PROFILE_MAP_MISMATCH). As flags explícitas que colidam com um campo pertencente ao perfil são rejeitadas com OL_E_SESSION_PROFILE_OVERRIDE_CONFLICT (CliInput.RejectProfileConflicts): mapa/ponto de entrada/data/hora/ano/meteorologia quando o bloco new: os define, chaves /set pertencentes à predefinição, flags de splash quando a predefinição tem presentation, flags de Internet Textures quando tem internet-textures, timeouts quando tem behavior.
/predefined-profile-index/predefined-profile-index:<1..5>nenhumalançamentoSTABLE_BETASeleciona a predefinição por index. Fora do intervalo: saída 2.

Ficheiro LaunchSpec#

FlagSintaxe e valoresPredefiniçãoFaseEstabilidadeComportamento
/spec/spec:<path.json>nenhumalançamentoSTABLE_BETA (carregador testado offline; semântica da sessão idêntica à das flags)Carrega um ficheiro JSON LaunchSpec como base (ver LaunchSpec) e marca um lançamento como pedido. Regras (LaunchSpecJson): o ficheiro tem de existir (OL_E_SPEC_NOT_FOUND, saída 6); no máximo 1 MiB (OL_E_SPEC_TOO_LARGE, saída 2); a raiz tem de ser um objeto (OL_E_SPEC_INVALID); nomes de propriedades sem distinção de maiúsculas/minúsculas; comentários // e vírgulas finais permitidos; profundidade máxima de 32; qualquer propriedade desconhecida é rejeitada com o respetivo caminho JSON (OL_E_SPEC_UNKNOWN_PROPERTY: $.Presentation.Foo, saída 2).

Precedência (CliInput.BuildSpecAsync): predefinições → ficheiro /spec → /predefined-profile (substitui Installation e World e depois aplica o perfil) → flags explícitas. Um argumento de instalação explícito prevalece sobre RootPath na especificação. /no-vehicle remove o veículo do jogador da especificação; /vehicle e as flags afins fundem-se com ele campo a campo. As chaves /set fundem-se em Environment.General. /splash, /splash-language, /splash-assets, /internet-textures, /internet-textures-profile só sobrepõem valores quando indicadas. /startup-timeout e /shutdown-timeout só sobrepõem valores quando indicadas; Presentation.SuppressTrayIcon provém apenas da especificação (não há flag). As flags de diagnóstico são combinadas por OU com o Diagnostics da especificação.

Descoberta de conteúdos#

FlagSintaxe e valoresPredefiniçãoFaseEstabilidadeComportamento
/list/list:<category>; as categorias são os valores de ContentQueryKind Maps, Situations, Vehicles, Repaints, Hofs, FleetNumbers, Registrations, Addons, Entrypoints (sem distinção de maiúsculas/minúsculas)nenhumalocal, sem sessãoSTABLE_BETADiscoverAsync sobre a instalação; envelope content.list com entradas Identity, Kind, DisplayName; saída 0. Categoria desconhecida: Unknown discovery category, saída 2. Os pontos de reanálise (junctions/ligações simbólicas) são ignorados; os ficheiros do OMSI são lidos como Windows-1252.
/vehicle-scope/vehicle-scope:<vehicle identity>nenhumalocalSTABLE_BETAÂmbito reencaminhado para todas as categorias exceto Entrypoints, que usa /map como âmbito.

Timeouts e observação#

FlagSintaxe e valoresPredefiniçãoFaseEstabilidadeComportamento
/startup-timeout/startup-timeout:<1..600> segundosvalor da especificação/perfil, senão 180lançamentoSTABLE_BETABehavior.StartupTimeoutSeconds. O proprietário espera por Running durante este valor mais 5 s; OL_E_STARTUP_TIMEOUT termina a sessão com saída 1.
/shutdown-timeout/shutdown-timeout:<1..600> segundosvalor da especificação/perfil, senão 30lançamentoACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECTTransportado para Behavior.ShutdownTimeoutSeconds; o supervisor não o utiliza nesta build (o OMSI é terminado, não se lhe pede que feche).
/observe-seconds/observe-seconds:<0..2147483647>nenhuma (executar até o OMSI terminar ou até ser pedida uma paragem)runtime (proprietário)STABLE_BETALimite superior da fase de execução: após n segundos em Running, é pedida a paragem canónica. Uma paragem pela área de notificação ou pelo pipe, ou o fim do OMSI, termina-a mais cedo. 0 para imediatamente após Running.

Recuperação#

FlagSintaxe e valoresPredefiniçãoFaseEstabilidadeComportamento
/recovery-status/recovery-statusdesligadalocalSTABLE_BETAIndicar se <root>\.omsilaunch\journal.json está pendente (pending); nunca restaura; saída 0. Obtém o lease da instalação: OL_E_INSTALLATION_BUSY (saída 7) enquanto um proprietário o detiver.
/recover/recoverdesligadalocalSTABLE_BETARestaurar um journal pendente (as cópias de segurança são primeiro verificadas face ao SHA-256 do snapshot; OL_E_RECOVERY_BACKUP_CORRUPT, OL_E_RECOVERY_ABSENT_OWNERSHIP_MISMATCH, OL_W_RESTORE_FOREIGN_FILE_RETAINED comunicados em diagnostics). Saída 0 quando nada estava pendente ou o restauro foi concluído; 8 quando havia um journal pendente e este se mantém. Recusado com OL_E_INSTALLATION_BUSY enquanto o processo OMSI registado no journal (PID, hora de criação, caminho do executável) estiver ativo ou, para um journal posterior a HandoffCreated sem PID, enquanto estiver ativo qualquer Omsi.exe dessa raiz. Cada arranque de sessão executa automaticamente a mesma recuperação antes de ler a instalação.

Formatos de saída#

  • Envelope de sucesso (CliInput.WriteEnvelope, com --json): {"ok": true, "command": "<name>", "protocol_version": "0.1", "result": <object>}, indentado. As respostas reencaminhadas de session status e events read acrescentam um membro metadata quando foram omitidos eventos mais antigos para caber no frame de controlo (events_dropped_count, ver controlo local). Sem --json só é impresso <object> como JSON indentado, seguido de Note: <n> older events were omitted to fit the control frame. quando foram descartados eventos.
  • Envelope de erro (CliInput.WriteError, com --json): {"ok": false, "command": "<name>", "protocol_version": "0.1", "error": {"code": "OL_E_...", "category": "<category>", "message": "..."}}. Sem --json: OL_E_<CODE>: message numa linha. Categorias: invalid_argument, unsupported_profile, session, runtime, not_found, transaction, internal. Sob OmsiLaunchW.exe, o mesmo código e mensagem são apresentados numa caixa de mensagem.
  • Plano e estado (CliInput.Write): os registos SessionPlan, SessionStatus e RuntimeCommandResult são impressos como JSON indentado sem envelope. Sem --json, um plano é resumido como Plan: READY profile=Omsi23004_692EBFBF ou Plan: NOT RUNNABLE profile=...; os outros registos continuam a ser impressos como JSON. Os valores de enumeração são serializados como inteiros (SessionState.Running é 14, Completed é 18, Failed é 19).
  • Nomes de comando usados nos envelopes: silent, version, capabilities, help, profiles, detect, recover, content.list, session, session.status, session.stop, events.read, events.watch, events watch, installation, cli, session profile e o id da operação de runtime para comandos de runtime reencaminhados.
  • Sob OmsiLaunchW.exe (OMSILAUNCH_WINDOWS_HOST=1) nada é escrito na consola, a menos que seja indicado --json.

Erros por comando#

ComandoCódigos de erro típicosSaída
Qualquer falha de interpretaçãoOL_E_INVALID_ARGUMENT, códigos de perfil de sessão (OL_E_SESSION_PROFILE_*)2
/silentOL_E_WINDOWS_HOST_MISSING, OL_E_WINDOWS_HOST_START_FAILED7
Rota de cliente, /runtime (cliente)OL_E_RUNTIME_OPERATION_UNKNOWN, OL_E_RUNTIME_ARGUMENT_REQUIRED (2); OL_E_NO_ACTIVE_SESSION (4); OL_E_CONTROL_*, OL_E_RUNTIME_* devolvidos pelo proprietário, p. ex. 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
Verificação prévia do proprietárioOL_E_RUNTIME_INSTALLATION_INCOMPLETE, OL_E_SESSION_ALREADY_ACTIVE7
/recovery-status, /recoverOL_E_INSTALLATION_BUSY (7); OL_E_RECOVERY_*, OL_E_RESTORE_FAILED (8); pendente mas não recuperado (8)7, 8
/listcategoria desconhecida (2); OL_E_INSTALLATION_NOT_FOUND/diretórios em falta (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, lançamentodiagnósticos do plano: OL_E_PERMANENT_PLUGIN_MISSING, OL_E_PERMANENT_PLUGIN_HASH_MISMATCH, OL_E_PERMANENT_PLUGIN_MANIFEST_INCOMPLETE (conjunto de plugins instalados), 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 (informativo)1
Arranque da sessãoOL_E_PLAN_NOT_RUNNABLE (novo planeamento no arranque, 1); OL_E_PERMANENT_PLUGIN_MISSING, OL_E_PERMANENT_PLUGIN_HASH_MISMATCH, OL_E_PERMANENT_PLUGIN_MANIFEST_INCOMPLETE, OL_E_RELEASE_MANIFEST_INVALID (normalmente comunicados pelo planeamento como diagnóstico do plano, saída 1; 7 apenas se os ficheiros dos plugins mudarem entre o planeamento e o arranque), 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 (sessão Failed, 1)1, 7
Exceção não tratada em qualquer pontoclassificada por CliProgram.Classify (ver códigos de saída)2..10

Ambiente#

VariávelDefinida porEfeito
OMSILAUNCH_WINDOWS_HOST=1OmsiLaunchW.exeWindowsHost.IsActive: saída de consola suprimida, falhas em caixas de mensagem, /silent não é novamente delegado.

Ver também#

Exemplos da CLI · OmsiLaunchW.exe · códigos de saída · erros · controlo local · área de notificação do Windows · controlo de runtime · capacidades · LaunchSpec · perfis de sessão · empacotamento · compatibilidade · limitações conhecidas · API pública