Referência da CLI

Documentação da versão v0.1.0-beta.3Ver 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: se as duas divergirem, valem a página em inglês e o código.

Esta página é a referência completa e normativa da linha de comando do OmsiLaunch 0.1.0-beta3: os três executáveis, a gramática de argumentos, a ordem de despacho, cada palavra de comando, cada rota hierárquica, cada flag, os envelopes de saída e o comportamento de erro de cada comando. Ela é 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#

ArquivoSubsistemaFunçãoDiferenças
OmsiLaunch.exeConsoleBootstrapper nativo (OmsiLaunch.Bootstrapper.cpp): resolve o próprio diretório, divide a linha de comando em tokens com CommandLineToArgvW, localiza o hostfxr por meio de nethost.dll e executa OmsiLaunch.Controller.dll com os mesmos argumentos.A saída de console é escrita; o código de saída do processo é o código de saída do controlador gerenciado, ou um código do shim 100..106 se o host .NET não pôde ser iniciado.
OmsiLaunchW.exeWindows (GUI)O mesmo shim (OmsiLaunch.WindowsHost.cpp) compilado para o subsistema Windows. Ele define a variável de ambiente OMSILAUNCH_WINDOWS_HOST=1 antes de iniciar o controlador.Sem console: a saída de console é suprimida, a menos que --json seja informado (WindowsHost.SuppressConsole), as falhas são exibidas em caixas de mensagem (WindowsHost.ShowFailure: mensagem, Code: OL_E_... e a dica See .omsilaunch\diagnostics for details.), e uma falha do shim 100..106 é exibida como OmsiLaunch could not start the .NET host (code N). Comportamento completo: referência do OmsiLaunchW.exe.
OmsiLaunch.Controller.dllGerenciado (x64, net6.0-windows, Windows Forms)O próprio controlador. Nunca é invocado diretamente pelos usuários; os dois shims passam o caminho do controlador como primeiro argumento do host, de modo que ele nunca aparece na lista pública de argumentos.Requer o runtime .NET 6 x64 com Microsoft.WindowsDesktop.App; veja instalação.

O nethost.dll precisa ficar ao lado dos shims. Os shims não leem nenhum argumento por conta própria; todo argumento chega inalterado a CliInput.Parse, portanto 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 diferencia 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). Todo token -- que contém = é um argumento de runtime, nunca uma flag.
--json, /jsonSaída estruturada (veja Formatos de saída). --json é o único token -- sem = que tem significado; ele é interpretado como a flag /json.
palavra soltaSe nenhuma palavra de comando foi vista ainda e a palavra é uma das palavras de comando, ela se torna o comando. Quando já há uma palavra de comando, toda palavra solta posterior é uma palavra de comando (a rota). Caso contrário, a primeira palavra solta é a raiz da instalação e qualquer palavra solta posterior é anexada à 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 é aceito, mas é modo proprietário (uma nova sessão é iniciada e a operação é executada uma vez dentro dela). Erros de análise (ArgumentException, FormatException, InvalidDataException, OverflowException) e erros de perfil de sessão (SessionProfileException) são relatados antes que qualquer coisa seja executada, sempre com saída 2.

Raiz da instalação#

  • Um argumento de instalação explícito em forma de palavra solta prevalece sobre RootPath em um arquivo /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 disso.
  • 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.
  • Comandos em modo cliente nunca recebem um argumento de instalação: eles se dirigem ao endpoint de controle local da instalação em que o executável está (AppContext.BaseDirectory). Veja controle local.

Proprietário e cliente#

  • Proprietário: o processo que planeja, inicia, supervisiona e restaura uma sessão (OwnerSession.RunAsync). Ele detém o lease da instalação (Local\OmsiLaunch.Installation.<sha256(root)>) e a transação de configuração, expõe o endpoint de controle local enquanto a sessão está ativa e exibe o ícone da bandeja. Exatamente um proprietário por instalação: se um proprietário já responde a session.status no endpoint de controle, uma segunda inicialização falha com OL_E_SESSION_ALREADY_ACTIVE (saída 7).
  • Cliente: qualquer invocação sem argumento de instalação que envia session status, session stop, events read, events watch ou uma operação de runtime. Ela é encaminhada pelo pipe de controle local; sem um proprietário, falha com OL_E_NO_ACTIVE_SESSION (saída 4).

Ordem de despacho (CliProgram.RunAsync)#

  1. /silent (quando ainda não está sendo executado sob o OmsiLaunchW.exe): inicia o OmsiLaunchW.exe a partir do diretório do executável por meio de ShellExecute (sem herança de handles) com os mesmos argumentos, exceto /silent/--silent, escreve o envelope silent (delegated, host_process_id) e retorna 0. O processo de console não espera pela sessão; veja OmsiLaunchW.exe. OL_E_WINDOWS_HOST_MISSING / OL_E_WINDOWS_HOST_START_FAILED retornam 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:): os argumentos são validados com PublicCapabilityRegistry.ValidateRuntimeArguments (OL_E_RUNTIME_OPERATION_UNKNOWN, OL_E_RUNTIME_ARGUMENT_REQUIRED, saída 2) e então runtime.execute é encaminhado com um timeout de 8 s (30 s para road-vehicles.spawn).
  7. session status do cliente (750 ms), session stop (vinculado 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 (nenhuma instalação, nenhum comando, nenhum /?, nenhum /spec, nenhuma flag de inicialização, nenhuma flag de recuperação, nenhum /list): enumera os processos Omsi e sonda o endpoint de controle (250 ms); envelope detect; saída 0.
  9. /? ou /help: imprime o texto de uso, 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 uso e sai com 2.
  10. Modo proprietário. Pré-condições: plugins\OmsiLaunch.Plugin.opl e plugins\OmsiLaunch.Native.x86.dll precisam existir ao lado do executável (OL_E_RUNTIME_INSTALLATION_INCOMPLETE, saída 7). O release-manifest.json ao lado 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 somente quando uma restauração foi solicitada e não foi concluída; caso contrário, 0.
  12. /list:<category>: DiscoverAsync; envelope content.list; saída 0.
  13. Monta a LaunchSpec (BuildSpecAsync), planeja-a (PlanSessionAsync) e imprime o plano. /plan ou /validate: saída 0 se IsRunnable, senão 1. Um plano não apto para execução nunca inicia o OMSI (saída 1); sob o OmsiLaunchW.exe, uma inicialização com um plano não apto para execução exibe seu último diagnóstico OL_E_ em uma caixa de mensagem (auditoria de documentação BUG-06). O planejamento também verifica o conjunto de arquivos instalado do plugin permanente contra o release-manifest.json, de modo que um plugin ausente ou alterado torna o plano não apto para execução (OL_E_PERMANENT_PLUGIN_*).
  14. Sonda a existência de um proprietário (OL_E_SESSION_ALREADY_ACTIVE, saída 7) e então executa OwnerSession.RunAsync.

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

  1. StartSessionAsync(plan). A partir daqui, todo caminho de saída chega a CloseAsync em um bloco finally: exceções, Ctrl+C (Console.CancelKeyPress), fechamento do console / logoff (AppDomain.ProcessExit com um orçamento de 4 s para parada + restauração; o que restar é recuperado pelo journal na próxima inicialização), "End session" da bandeja, session.stop pelo pipe e /observe-seconds.
  2. O ícone da bandeja é criado, a menos que Presentation.SuppressTrayIcon esteja definido na especificação.
  3. Espera por Running durante StartupTimeoutSeconds + 5 segundos. O status é impresso. Se o estado não for Running, saída 1 (o OmsiLaunchW.exe exibe 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 seus artefatos.
  5. O endpoint de controle 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 falha nunca encerra a sessão (em vez disso, runtime_error é impresso).
  7. Espera: com /observe-seconds:n, a sessão é parada após n segundos ou antes, em uma parada pela bandeja/pipe, ou quando o OMSI termina; sem essa flag, o proprietário espera até o OMSI terminar ou até uma parada ser solicitada.
  8. O status final é impresso; saída 0 se Completed, 1 caso contrário.

session.stop, "End session" da bandeja, Ctrl+C e CloseAsync solicitam todos a parada canônica: o OMSI é encerrado 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, todo arquivo pertencente à sessão é restaurado. Veja ciclo de vida da sessão e transações e recuperação.

Palavras de comando#

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

PalavraFinalidadeModoObservações
capabilitiesListar as capacidades públicasLocal, sem sessãoEnvelope capabilities.
profilesListar as variantes suportadas do Omsi.exeLocal, sem sessãoEnvelope profiles.
detectRelatar os processos Omsi.exe e um proprietário ativoLocal, sem sessãoTambém é o padrão quando nenhum argumento é informado. 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.
helpUso 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 depois; qualquer outra coisa imprime o uso, saída 2. session plan/session start são nomes de rota da API, não palavras da CLI: use /plan e /new.
eventsevents read, events watchClienteread retorna a lista limitada de eventos uma vez; 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 em um erro de controle.
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 o uso (saída 2). As operações D3D são acessadas com /runtime:d3d.status, /runtime:d3d.texture.create e assim por diante (veja Operações sem rota).

Rotas hierárquicas#

CliInput.HierarchicalRoutes mapeia uma rota em minúsculas para um id de operação de runtime. Todas as rotas exigem uma sessão Running e são executadas pelo mailbox de runtime (ExecuteRuntimeAsync). As escritas de runtime alteram apenas o estado em memória do OMSI: nunca tocam em arquivos, não fazem parte da transação de configuração e não são revertidas na parada (o OMSI é encerrado). A estabilidade segue o PublicCapabilityRegistry e a matriz de validação; detalhes e campos de resultado estão em controle de runtime.

RotaOperação de runtimeTipoExige RunningAltera o OMSIParticipação na restauraçãoEstabilidadeObservações
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 restauração validadas em 2026-09-20.
weather getweather.readReadSimNãoNenhumaSTABLE_BETA
weather setweather.setWriteSimNão (sempre rejeitada)NenhumaUNAVAILABLERetorna OL_E_RUNTIME_SETTING_NOT_PERSISTENT; o OMSI sobrescreve o valor no próximo ciclo de clima.
weather actual getweather.actual.readReadSimNãoNenhumaEXPERIMENTALEstado do controlador de clima real/ICAO.
map getmap.readReadSimNãoNenhumaSTABLE_BETANome, arquivo e descrição do mapa, quantidade de tiles, intervalo de anos e lado do tráfego; revalidado em runtime no slot de mapa corrigido.
camera getcamera.readReadSimNãoNenhumaSTABLE_BETA
camera setcamera.setWriteSimSim (escalares da câmera, p. ex. --field_of_view=)Nenhuma, não revertidaEXPERIMENTALEscrita/releitura de FOV validada.
camera lockcamera.lockActionSimSim (política com escopo de sessão)NenhumaEXPERIMENTALExige --family=<0..3> (motorista=0, passageiro=1, externa=2, mapa=3), --preset=<n> opcional (família 0 ou 1). Precisa de um veículo do jogador (por exemplo, uma situação salva). Validado em runtime no fechamento de runtime (CAM01); a string RuntimeValidation do registro ainda diz STATICALLY_VALIDATED (veja capacidades).
camera unlockcamera.unlockActionSimSimNenhumaEXPERIMENTALLibera a política definida por camera lock (CAM01).
vehicles listroad-vehicles.listReadSimNãoNenhumaSTABLE_BETARetorna handles rv-NNNNNN com escopo de sessão.
vehicles getroad-vehicle.readReadSimNãoNenhumaSTABLE_BETAExige --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 (adiciona um RoadVehicle)Nenhuma, não removidoEXPERIMENTALExige --model=Vehicles\...\*.bus. Timeout de 30 s no cliente, 15 s no proprietário. Não define o veículo do jogador. RV-003 RUNTIME_PASS.
vehicles place-randomroad-vehicles.place-randomActionSimSimNenhumaEXPERIMENTALPlaceRandomBus perfilado.
player getplayer-vehicle.readReadSimNãoNenhumaSTABLE_BETANull semântico quando não há veículo do jogador.
humans listhumans.listReadSimNãoNenhumaEXPERIMENTALRetorna handles hb-NNNNNN.
humans gethuman.readReadSimNãoNenhumaEXPERIMENTALExige --handle=.
humans summaryhumans.readReadSimNãoNenhumaEXPERIMENTALSomente contagens.
timetable gettimetable.readReadSimNãoNenhumaSTABLE_BETAEstado do gerenciador da tabela de horários.
timetable tracks listtimetable.tracks.listReadSimNãoNenhumaSTABLE_BETAParte 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ãoNenhumaEXPERIMENTALRegistros de motoristas.
tickets gettickets.readReadSimNãoNenhumaEXPERIMENTALRegistros de pacotes de bilhetes.
hof getvehicle.hofs.readReadSimNãoNenhumaSTABLE_BETAExige --handle=.
constants listvehicle.constants.listReadSimNãoNenhumaSTABLE_BETAExige --handle=.
constants getvehicle.constant.getReadSimNãoNenhumaSTABLE_BETAExige --handle=, --name=.
curves listvehicle.curves.listReadSimNãoNenhumaSTABLE_BETAExige --handle=.
curves evaluatevehicle.curve.evaluateReadSimNãoNenhumaSTABLE_BETAExige --handle=, --name=, --x=.
scripts variable listvehicle.variables.listReadSimNãoNenhumaEXPERIMENTALExige --handle=.
scripts variable getvehicle.variable.getReadSimNãoNenhumaEXPERIMENTALExige --handle=, --name=.
scripts variable setvehicle.variable.setWriteSimSim (variável de script)Nenhuma, não revertidaEXPERIMENTALExige --handle=, --name=, --value= (número finito).
scripts string listvehicle.string-variables.listReadSimNãoNenhumaEXPERIMENTALExige --handle=.
scripts string getvehicle.string-variable.getReadSimNãoNenhumaEXPERIMENTALExige --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 reset do dispositivo são validados em runtime (fechamento de runtime H02, D01; veja capacidades). timetable.track-entries.list e timetable.tour-entries.list são listas limitadas: um resultado que não cabe no slot de runtime é encurtado (truncated=true). internal.road-vehicles.make-basic é INTERNAL e é rejeitado com OL_E_RUNTIME_OPERATION_UNKNOWN tanto pela CLI quanto pela API.

Flags#

Todas as flags de CliInput.KnownFlags. A "Fase" é de inicialização (molda a LaunchSpec/o plano de uma nova sessão), de runtime (atua sobre uma sessão em execução) ou de controle (altera o comportamento da própria CLI). As flags interpretadas apenas por compatibilidade (CliInput.AcceptedNoEffectFlags) estão marcadas em sua linha.

Controle e saída#

FlagSintaxe e valoresPadrãoFaseEstabilidadeComportamento
/?/?desligadacontroleSTABLE_BETAImprime o texto de uso, saída 0.
/help/helpdesligadacontroleSTABLE_BETAIgual a /?. (A palavra solta help retorna, em vez disso, o catálogo estruturado.)
/version/versiondesligadacontroleSTABLE_BETAEnvelope version, saída 0. Avaliada antes de todos os outros comandos, exceto /silent.
/json/json ou --jsondesligadacontroleSTABLE_BETAEmite envelopes JSON; também força a saída de console mesmo sob o OmsiLaunchW.exe.
/quiet/quietdesligadacontroleACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECTDefine CliInput.Quiet; nada o lê.
/silent/silent (também --silent)desligadacontroleEXPERIMENTALDelega a linha de comando inteira ao OmsiLaunchW.exe e retorna 0 assim que o processo host é iniciado. O resultado da sessão é relatado pelo OmsiLaunchW.exe (caixas de mensagem, ícone da bandeja), por .omsilaunch\diagnostics e pelo endpoint de controle local. A delegação e as caixas de diálogo de falha são validadas em runtime (fechamento de runtime T04); veja OmsiLaunchW.exe.
/serve/servedesligadacontroleACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECTDefine CliInput.Serve; nada o lê. O endpoint de controle é sempre iniciado por um proprietário.
/verbose/verbosedesligadainicializaçãoPARTIALDiagnosticsSpec.Verbose. Os valores são levados na especificação; seu efeito se limita ao trace do host em .omsilaunch\diagnostics.
/log/logligada (DiagnosticsSpec.Log tem padrão true)inicializaçãoPARTIALDiagnosticsSpec.Log. Na prática, sempre ligada.
/logall/logalldesligadainicializaçãoPARTIALDefine Verbose, ProcessTrace, PluginTrace e NativeTrace de uma só vez.
/omsi-logall/omsi-logalldesligadainicializaçãoPARTIALDiagnosticsSpec.OmsiLogAll.
/trace/tracedesligadainicializaçãoPARTIALAlias de /trace-process.
/trace-process/trace-processdesligadainicializaçãoPARTIALDiagnosticsSpec.ProcessTrace.
/trace-plugin/trace-plugindesligadainicializaçãoPARTIALDiagnosticsSpec.PluginTrace.
/trace-native/trace-nativedesligadainicializaçãoPARTIALDiagnosticsSpec.NativeTrace.

Planejamento, validação e harnesses#

FlagSintaxe e valoresPadrãoFaseEstabilidadeComportamento
/plan/plandesligadainicializaçãoSTABLE_BETAMonta e imprime o SessionPlan, sem iniciar o OMSI. Saída 0 quando IsRunnable, 1 caso contrário. Exige uma seleção de inicialização (/new, /saved, /spec ou um argumento de instalação); /plan sozinho, sem mais nada, executa detect.
/validate/validatedesligadainicializaçãoSTABLE_BETAIdêntica a /plan neste build.
/runtime-batch/runtime-batchdesligadaruntime (proprietário)INTERNALHarness de validação: depois de 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 restauração; escreve <sessionId>-runtime-write-batch.json.
/d3d-batch/d3d-batchdesligadaruntime (proprietário)INTERNALHarness de validação do ciclo de vida das texturas D3D; escreve <sessionId>-d3d-wave-d-batch.json.
/runtime/runtime:<operation>nenhumruntimeSTABLE_BETA (despacho)Seleciona uma operação de runtime pública pelo id. Modo cliente (sem argumento de instalação): encaminhada ao proprietário. Modo proprietário: executada uma vez depois de Running. Ids desconhecidos: OL_E_RUNTIME_OPERATION_UNKNOWN, saída 2.
/runtime-arg/runtime-arg:<key>=<value> (repetível)nenhumruntimeSTABLE_BETA (despacho)Argumento de runtime; equivalente a --key=value. Sem =: /runtime-arg requires key=value, saída 2.

Seleção do mundo#

FlagSintaxe e valoresPadrãoFaseEstabilidadeComportamento
/new/newWorldMode.NewMap é o modo padrão, mas uma inicialização só é solicitada quando uma de /new, /saved, /last, /spec está presenteinicializaçãoSTABLE_BETANEW_MAP. Exige /map e /entrypoint-index (um plano sem um índice de ponto de entrada apresentado relata OL_E_ENTRYPOINT_REQUIRED; sem /map, nenhum mapa é resolvido). /new nunca seleciona um mapa silenciosamente.
/saved/saved:<file.osn>nenhuminicializaçãoSTABLE_BETASAVED_SITUATION. Mapa e posição vêm do .osn; /map, /entrypoint, /entrypoint-index são rejeitados com /saved (saída 2). Situação ausente: OL_E_SITUATION_NOT_FOUND; mapa dela ausente: OL_E_SITUATION_MAP_NOT_FOUND.
/last/lastnenhuminicializaçãoUNAVAILABLELAST_MAP_STATE. Sempre produz OL_E_CAPABILITY_UNAVAILABLE (não apto para execução, saída 1) neste perfil; nenhum fallback para um .osn baseado em data/hora é feito.
/map/map:<identity> (por exemplo maps\Grundorf\global.cfg)nenhuminicializaçãoSTABLE_BETAIdentidade do mapa para /new, ou o escopo de /list:Entrypoints. Desconhecido: OL_E_MAP_NOT_FOUND.
/entrypoint/entrypoint:<identity>nenhuminicializaçãoUNAVAILABLEPonto de entrada pelo rótulo. Bloqueado: o plano registra world.entrypoint-identity como RUNTIME_PARTIAL e se torna não apto para execução (OL_E_CAPABILITY_UNAVAILABLE). Mutuamente exclusiva com /entrypoint-index (a identidade prevalece e limpa o índice).
/entrypoint-index/entrypoint-index:<n>, 0..2147483647nenhuminicializaçãoSTABLE_BETAÍndice do ponto de entrada na lista apresentada (começando em 1, como o OMSI o apresenta). Obrigatório para um plano NEW_MAP apto para execução.

Data, hora e clima#

Todas as quatro são aceitas e levadas para a LaunchSpec, mas o caminho nativo de inicialização não as aplica: o planejador as registra como STATICALLY_PARTIAL e adiciona OL_E_CAPABILITY_UNAVAILABLE, de modo que o plano NÃO É APTO PARA EXECUÇÃO (saída 1). Um arquivo /spec ou um perfil de sessão que as defina tem o mesmo efeito.

FlagSintaxe e valoresPadrãoFaseEstabilidadeComportamento
/date/date:<yyyy-mm-dd> ou /date:systemnão definidoinicializaçãoUNAVAILABLEDateSpec explícito/do sistema. Valor que não pode ser interpretado: OL_E_INVALID_ARGUMENT, saída 2.
/time/time:<hh:mm[:ss]> ou /time:systemnão definidoinicializaçãoUNAVAILABLETimeSpec explícito/do sistema.
/year/year:<n> ou /year:systemnão definidoinicializaçãoUNAVAILABLEYearSpec.
/weather/weather:<preset>não definidoinicializaçãoUNAVAILABLEWeatherMode.Preset.
/weather-icao/weather-icao:<code>não definidoinicializaçãoUNAVAILABLEWeatherMode.Icao.
/weather-real/weather-realnão definidoinicializaçãoUNAVAILABLEWeatherMode.RealCurrent. Prevalece a última entre /weather, /weather-icao, /weather-real.

Veículo do jogador#

Aceitas e resolvidas contra a instalação, mas não aplicadas pelo runtime: cada campo definido é STATICALLY_PARTIAL e adiciona OL_E_CAPABILITY_UNAVAILABLE (plano NÃO APTO PARA EXECUÇÃO, saída 1).

FlagSintaxe e valoresPadrãoFaseEstabilidadeComportamento
/vehicle/vehicle:<identity> (Vehicles\...\*.bus)não definidoinicializaçãoUNAVAILABLEResolvida primeiro (OL_E_VEHICLE_NOT_FOUND se desconhecido).
/repaint/repaint:<id>não definidoinicializaçãoUNAVAILABLEResolvida somente junto com /vehicle (OL_E_REPAINT_NOT_FOUND).
/hof/hof:<id>não definidoinicializaçãoUNAVAILABLEOL_E_HOF_NOT_FOUND se desconhecido.
/fleet/fleet:<n>não definidoinicializaçãoUNAVAILABLENúmero de frota.
/registration/registration:<text>não definidoinicializaçãoUNAVAILABLEMatrícula (placa).
/no-vehicle/no-vehicledesligadainicializaçãoSTABLE_BETARemove qualquer veículo do jogador da base (/spec ou perfil). Inofensiva.

Overlays de configuração#

FlagSintaxe e valoresPadrãoFaseEstabilidadeComportamento
/set/set:<key>=<value> (repetível; chaves sem diferenciação de maiúsculas/minúsculas)nenhuminicializaçãoSTABLE_BETAOverlay semântico de options.cfg a partir do ConfigurationCatalog (por exemplo graphics.maxFPS=60, traffic.randomVehicles=150). Chave desconhecida: OL_E_UNKNOWN_SETTING (saída 2); chave somente 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 é montado. O overlay é uma mutação da sessão: é registrado no snapshot, aplicado antes de o OMSI iniciar e restaurado byte a byte na parada (RV-005 RUNTIME_PASS). Conflito com uma chave pertencente à predefinição de um perfil selecionado: OL_E_SESSION_PROFILE_OVERRIDE_CONFLICT.

Apresentação da tela de abertura#

FlagSintaxe e valoresPadrãoFaseEstabilidadeComportamento
/splash/splash:Managed, /splash:Native, /splash:Unset (sem diferenciação de maiúsculas/minúsculas)ManagedinicializaçãoSTABLE_BETAManaged: os BMPs empacotados de 640x480 e 24 bits 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): arquivos do OMSI intocados. Valor ausente: /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 recai em ENG)[language] do options.cfg, senão ENGinicializaçãoSTABLE_BETASeleciona o arquivo de destino localizado.
/splash-assets/splash-assets:<directory> (caminhos relativos são resolvidos abaixo da raiz da instalação)<root>\.omsilaunch\assets\splash, senão o conjunto empacotadoinicializaçãoSTABLE_BETADiretório de assets personalizado; precisa conter ENG.bmp e, para um idioma diferente do 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 apto para execução).

Texturas da internet#

FlagSintaxe e valoresPadrãoFaseEstabilidadeComportamento
/internet-textures/internet-textures:Native|Disabled|OverrideNativeinicializaçãoEXPERIMENTALNative: intocado. Disabled: o downloader perfilado dentro do processo é suprimido. Override: o perfil .itx informado é sobreposto como Texture\standard.itx; todo destino HTTP(S) listado nele, mais Texture\standard.ipr, se tornam exclusões da sessão (removidos durante a sessão, restaurados na parada). Valor ausente: saída 2.
/internet-textures-profile/internet-textures-profile:<file.itx>nenhuminicializaçãoEXPERIMENTALObrigatória com Override (OL_E_ITX_PROFILE_REQUIRED, saída 2). OL_E_ITX_PROFILE_MISSING, OL_E_ITX_PROFILE_INVALID (precisa ser composto de pares de linhas URL/destino com URLs http/https), OL_E_ITX_TARGET_OUTSIDE_TEXTURE_PATH (os destinos precisam ser resolvidos dentro de Texture\, sem caminhos absolutos, .. ou reparse points).

Perfis de sessão#

FlagSintaxe e valoresPadrãoFaseEstabilidadeComportamento
/predefined-profile/predefined-profile:<id>nenhuminicializaçãoSTABLE_BETA (compilação; OmsiLaunch.ProfileTests offline)Carrega <root>\.omsilaunch\session-profiles\<id>\profile.yaml (veja perfis de sessão). Exige /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). Flags explícitas que colidem 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/clima quando o bloco new: os define, chaves /set pertencentes à predefinição, flags de splash quando a predefinição tem presentation, flags de texturas da internet quando tem internet-textures, timeouts quando tem behavior.
/predefined-profile-index/predefined-profile-index:<1..5>nenhuminicializaçãoSTABLE_BETASeleciona a predefinição pelo index. Fora do intervalo: saída 2.

Arquivo LaunchSpec#

FlagSintaxe e valoresPadrãoFaseEstabilidadeComportamento
/spec/spec:<path.json>nenhuminicializaçãoSTABLE_BETA (carregador testado offline; semântica da sessão idêntica à das flags)Carrega um arquivo JSON LaunchSpec como base (veja LaunchSpec) e marca uma inicialização como solicitada. Regras (LaunchSpecJson): o arquivo precisa existir (OL_E_SPEC_NOT_FOUND, saída 6); no máximo 1 MiB (OL_E_SPEC_TOO_LARGE, saída 2); a raiz precisa ser um objeto (OL_E_SPEC_INVALID); nomes de propriedades sem diferenciação de maiúsculas/minúsculas; comentários // e vírgulas finais permitidos; profundidade de no máximo 32; toda propriedade desconhecida é rejeitada com seu caminho JSON (OL_E_SPEC_UNKNOWN_PROPERTY: $.Presentation.Foo, saída 2).

Precedência (CliInput.BuildSpecAsync): padrões → arquivo /spec → /predefined-profile (substitui Installation e World e depois aplica o perfil) → flags explícitas. Um argumento de instalação explícito prevalece sobre o RootPath da especificação. /no-vehicle remove o veículo do jogador da especificação; /vehicle e as flags relacionadas são mescladas a ele campo a campo. As chaves de /set são mescladas em Environment.General. /splash, /splash-language, /splash-assets, /internet-textures, /internet-textures-profile só sobrescrevem quando informadas. /startup-timeout e /shutdown-timeout só sobrescrevem quando informadas; Presentation.SuppressTrayIcon vem somente da especificação (não há flag). As flags de diagnóstico são combinadas por OR com o Diagnostics da especificação.

Descoberta de conteúdo#

FlagSintaxe e valoresPadrãoFaseEstabilidadeComportamento
/list/list:<category>; as categorias são os valores de ContentQueryKind Maps, Situations, Vehicles, Repaints, Hofs, FleetNumbers, Registrations, Addons, Entrypoints (sem diferenciação de maiúsculas/minúsculas)nenhumlocal, 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. Reparse points (junctions/symlinks) são ignorados, e os arquivos do OMSI são lidos como Windows-1252.
/vehicle-scope/vehicle-scope:<vehicle identity>nenhumlocalSTABLE_BETAEscopo encaminhado para todas as categorias, exceto Entrypoints, que usa /map como escopo.

Timeouts e observação#

FlagSintaxe e valoresPadrãoFaseEstabilidadeComportamento
/startup-timeout/startup-timeout:<1..600> segundosvalor da especificação/do perfil, senão 180inicializaçãoSTABLE_BETABehavior.StartupTimeoutSeconds. O proprietário espera por Running durante esse valor mais 5 s; OL_E_STARTUP_TIMEOUT encerra a sessão com saída 1.
/shutdown-timeout/shutdown-timeout:<1..600> segundosvalor da especificação/do perfil, senão 30inicializaçãoACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECTLevado para Behavior.ShutdownTimeoutSeconds; o supervisor não o consome neste build (o OMSI é encerrado, não solicitado a fechar).
/observe-seconds/observe-seconds:<0..2147483647>nenhum (executa até o OMSI terminar ou uma parada ser solicitada)runtime (proprietário)STABLE_BETALimite superior da fase de execução: após n segundos em Running, a parada canônica é solicitada. Uma parada pela bandeja ou pelo pipe, ou o término do OMSI, a encerra antes. 0 para imediatamente depois de Running.

Recuperação#

FlagSintaxe e valoresPadrãoFaseEstabilidadeComportamento
/recovery-status/recovery-statusdesligadalocalSTABLE_BETAInforma 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 detém.
/recover/recoverdesligadalocalSTABLE_BETARestaura um journal pendente (os backups são verificados antes contra o SHA-256 do snapshot; OL_E_RECOVERY_BACKUP_CORRUPT, OL_E_RECOVERY_ABSENT_OWNERSHIP_MISMATCH, OL_W_RESTORE_FOREIGN_FILE_RETAINED relatados em diagnostics). Saída 0 quando nada estava pendente ou a restauração foi concluída; 8 quando um journal estava pendente e continua pendente. Recusada com OL_E_INSTALLATION_BUSY enquanto o processo do OMSI registrado no journal (PID, hora de criação, caminho do exe) ou, para um journal além de HandoffCreated sem PID, qualquer Omsi.exe daquela raiz estiver ativo. Toda inicialização 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 encaminhadas de session status e events read adicionam um membro metadata quando eventos mais antigos foram omitidos para caber no frame de controle (events_dropped_count, veja controle local). Sem --json, apenas <object> é impresso como JSON indentado, seguido de Note: <n> older events were omitted to fit the control frame. quando eventos foram descartados.
  • 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 em uma linha. Categorias: invalid_argument, unsupported_profile, session, runtime, not_found, transaction, internal. Sob o OmsiLaunchW.exe, o mesmo código e a mesma mensagem são exibidos em uma caixa de mensagem.
  • Plano e status (CliInput.Write): os registros 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 registros continuam sendo impressos como JSON. Os valores de enum 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 encaminhados.
  • Sob o OmsiLaunchW.exe (OMSILAUNCH_WINDOWS_HOST=1), nada é escrito no console, a menos que --json seja informado.

Erros por comando#

ComandoCódigos de erro típicosSaída
Qualquer falha de análiseOL_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_* retornados 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 ausentes (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, inicializaçãodiagnósticos do plano: OL_E_PERMANENT_PLUGIN_MISSING, OL_E_PERMANENT_PLUGIN_HASH_MISMATCH, OL_E_PERMANENT_PLUGIN_MANIFEST_INCOMPLETE (conjunto de arquivos instalado do plugin), 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
Início da sessãoOL_E_PLAN_NOT_RUNNABLE (replanejamento no início, 1); OL_E_PERMANENT_PLUGIN_MISSING, OL_E_PERMANENT_PLUGIN_HASH_MISMATCH, OL_E_PERMANENT_PLUGIN_MANIFEST_INCOMPLETE, OL_E_RELEASE_MANIFEST_INVALID (normalmente relatados pelo planejamento como diagnóstico do plano, saída 1; 7 somente se os arquivos do plugin mudarem entre o planejamento e o início), 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 (veja códigos de saída)2..10

Ambiente#

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

Veja também#

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