CLI 参考

文档版本 v0.1.0-beta.3在 GitHub 上查看源文件

本页是 OmsiLaunch 0.1.0-beta3 英文原始页面 的译文。英文页面为规范文本:如有出入,以英文页面和代码为准。

本页是 OmsiLaunch 0.1.0-beta3 命令行完整的规范性参考:三个可执行文件、参数语法、分派顺序、每个命令词、每条层级路由、每个参数、输出信封(envelope)以及每个命令的错误行为。本页依据 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 以及 tools\OmsiLaunch.Bootstrapper 下的两个原生 shim 生成。进程结果列于退出码;错误码见错误;完整调用示例见 CLI 示例。

可执行文件#

文件子系统作用差异
OmsiLaunch.exe控制台原生引导程序(OmsiLaunch.Bootstrapper.cpp):解析自身所在目录,用 CommandLineToArgvW 拆分命令行,通过 nethost.dll 定位 hostfxr,并以相同参数运行 OmsiLaunch.Controller.dll。写出控制台输出;进程退出码为托管控制器的退出码,若无法启动 .NET 主机,则为 shim 退出码 100..106。
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 都把控制器路径作为第一个主机参数传入,因此它不会出现在公开的参数列表中。需要带有 Microsoft.WindowsDesktop.App 的 x64 .NET 6 运行时;见安装。

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=value所选运行时操作的运行时参数(例如 --handle=rv-000001)。任何包含 = 的 -- 标记都是运行时参数,而不是命令行参数。
--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。

安装根目录#

  • 显式的裸词安装参数优先于 /spec 文件中的 RootPath(CliInput.BuildSpecAsync)。
  • . 表示包含可执行文件的目录(AppContext.BaseDirectory),而不是调用方的工作目录(CliInput.ResolveInstallationRoot)。便携包依赖这一点。
  • 省略该参数时,所有者模式的操作(/new、/saved、/spec、/list、/recovery-status、/recover)同样使用可执行文件所在目录。路径通过 Path.GetFullPath 规范化。
  • 客户端模式的命令从不接受安装参数:它们访问可执行文件所在安装实例(AppContext.BaseDirectory)的本地控制端点。见本地控制。

所有者与客户端#

  • 所有者:负责规划、启动、监管和还原会话的进程(OwnerSession.RunAsync)。它持有安装租约(Local\OmsiLaunch.Installation.<sha256(root)>)和配置事务,在会话存活期间公开本地控制端点,并显示托盘图标。每个安装实例恰好一个所有者:如果控制端点上已有所有者响应 session.status,则第二次启动以 OL_E_SESSION_ALREADY_ACTIVE(退出码 7)失败。
  • 客户端:任何不带安装参数、发送 session status、session stop、events read、events watch 或运行时操作的调用。它通过本地控制管道转发;没有所有者时以 OL_E_NO_ACTIVE_SESSION(退出码 4)失败。

分派顺序(CliProgram.RunAsync)#

  1. /silent(当前未在 OmsiLaunchW.exe 下运行时):通过 ShellExecute(不继承句柄)从可执行文件所在目录启动 OmsiLaunchW.exe,传入去掉 /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:信封中包含 PublicCapabilityRegistry 的每个 PublicStableBeta 或 PublicExperimental 描述符;退出码 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:):参数先由 PublicCapabilityRegistry.ValidateRuntimeArguments 校验(OL_E_RUNTIME_OPERATION_UNKNOWN、OL_E_RUNTIME_ARGUMENT_REQUIRED,退出码 2),然后以 8 s 超时转发 runtime.execute(road-vehicles.spawn 为 30 s)。
  7. 客户端 session status(750 ms)、session stop(绑定到活动会话 ID,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:IsRunnable 时退出码 0,否则为 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)。从此处开始,每条退出路径都会在 finally 块中到达 CloseAsync:异常、Ctrl+C(Console.CancelKeyPress)、关闭控制台 / 注销(AppDomain.ProcessExit,停止 + 还原的时间预算为 4 s;剩余部分在下次启动时由事务日志恢复)、托盘“End session”、管道 session.stop 以及 /observe-seconds。
  2. 除非 spec 中设置了 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,road-vehicles.spawn 为 15 s);结果写入 <root>\.omsilaunch\diagnostics\<sessionId>-runtime-operation.json 并打印。失败的运行时命令从不终止会话(改为打印 runtime_error)。
  7. 等待:使用 /observe-seconds:n 时,会话在 n 秒后停止,或者在托盘/管道停止时、或 OMSI 退出时提前停止;不使用该参数时,所有者一直等待,直到 OMSI 退出或收到停止请求。
  8. 打印完成状态;若为 Completed 则退出码 0,否则为 1。

session.stop、托盘“End session”、Ctrl+C 和 CloseAsync 都会请求规范停止:用 TerminateProcess 终止 OMSI(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 将小写化的路由映射到运行时操作 ID。所有路由都需要处于 Running 状态的会话,并通过运行时邮箱(ExecuteRuntimeAsync)执行。运行时写入只改变 OMSI 的内存状态:它们从不触及文件,不属于配置事务,并且在停止时不会被撤销(OMSI 会被终止)。稳定性以 PublicCapabilityRegistry 和验证矩阵为准;详细信息和结果字段见运行时控制。

路由运行时操作类型需要 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地图名称、文件、描述、地块数量、年份范围和通行方向;已在修正后的地图槽上重新经运行时验证。
camera getcamera.readRead是否无STABLE_BETA
camera setcamera.setWrite是是(摄像机标量,例如 --field_of_view=)无,不撤销EXPERIMENTALFOV 写入/回读已验证。
camera lockcamera.lockAction是是(会话范围的策略)无EXPERIMENTAL需要 --family=<0..3>(driver=0、passenger=1、external=2、map=3),可选 --preset=<n>(族 0 或 1)。需要玩家车辆(例如已保存情景)。已在运行时闭包中经运行时验证(CAM01);注册表的 RuntimeValidation 字符串仍为 STATICALLY_VALIDATED(见能力)。
camera unlockcamera.unlockAction是是无EXPERIMENTAL解除 camera lock 设置的策略(CAM01)。
vehicles listroad-vehicles.listRead是否无STABLE_BETA返回会话范围的 rv-NNNNNN 句柄。
vehicles getroad-vehicle.readRead是否无STABLE_BETA需要 --handle=。失效句柄:OL_E_RUNTIME_OBJECT_HANDLE_STALE。
vehicles summaryroad-vehicles.readRead是否无STABLE_BETA计数和玩家状态,不含句柄。
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返回 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=。

没有路由的操作#

以下公开操作 ID(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;纹理生命周期和设备重置导致的失效已经运行时验证(运行时闭包 H02、D01;见能力)。timetable.track-entries.list 和 timetable.tour-entries.list 是有界列表:放不进运行时槽的结果会被缩短(truncated=true)。internal.road-vehicles.make-basic 为 INTERNAL,CLI 和 API 都会以 OL_E_RUNTIME_OPERATION_UNKNOWN 拒绝它。

参数#

CliInput.KnownFlags 中的每个参数。“阶段”分为启动时(决定新会话的 LaunchSpec/计划)、运行时(作用于正在运行的会话)或控制(改变 CLI 自身的行为)。仅为兼容性而解析的参数(CliInput.AcceptedNoEffectFlags)会在其所在行标明。

控制与输出#

参数语法与取值默认值阶段稳定性行为
/?/?关控制STABLE_BETA打印用法文本,退出码 0。
/help/help关控制STABLE_BETA与 /? 相同。(裸词 help 则返回结构化目录。)
/version/version关控制STABLE_BETAversion 信封,退出码 0。在除 /silent 之外的所有其他命令之前求值。
/json/json 或 --json关控制STABLE_BETA输出 JSON 信封;即使在 OmsiLaunchW.exe 下也强制输出到控制台。
/quiet/quiet关控制ACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECT设置 CliInput.Quiet;没有任何代码读取它。
/silent/silent(也可用 --silent)关控制EXPERIMENTAL将整个命令行委托给 OmsiLaunchW.exe,主机进程一启动即返回 0。会话结果由 OmsiLaunchW.exe(消息框、托盘图标)、.omsilaunch\diagnostics 和本地控制端点报告。委托和失败对话框已经运行时验证(运行时闭包 T04);见 OmsiLaunchW.exe。
/serve/serve关控制ACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECT设置 CliInput.Serve;没有任何代码读取它。控制端点始终由所有者启动。
/verbose/verbose关启动时PARTIALDiagnosticsSpec.Verbose。其值随 spec 传递;效果仅限于 .omsilaunch\diagnostics 下的主机跟踪。
/log/log开(DiagnosticsSpec.Log 默认为 true)启动时PARTIALDiagnosticsSpec.Log。实际上始终开启。
/logall/logall关启动时PARTIAL同时设置 Verbose、ProcessTrace、PluginTrace 和 NativeTrace。
/omsi-logall/omsi-logall关启动时PARTIALDiagnosticsSpec.OmsiLogAll。
/trace/trace关启动时PARTIAL/trace-process 的别名。
/trace-process/trace-process关启动时PARTIALDiagnosticsSpec.ProcessTrace。
/trace-plugin/trace-plugin关启动时PARTIALDiagnosticsSpec.PluginTrace。
/trace-native/trace-native关启动时PARTIALDiagnosticsSpec.NativeTrace。

规划、验证与测试工具#

参数语法与取值默认值阶段稳定性行为
/plan/plan关启动时STABLE_BETA构建并打印 SessionPlan,不启动 OMSI。IsRunnable 时退出码 0,否则为 1。需要一个启动选择(/new、/saved、/spec 或安装参数);单独使用 /plan 而没有其他内容时会执行 detect。
/validate/validate关启动时STABLE_BETA在此构建中与 /plan 完全相同。
/runtime-batch/runtime-batch关运行时(所有者)INTERNAL验证测试工具:进入 Running 后执行读取操作集,并写出 <sessionId>-runtime-read-batch.json。
/runtime-write-batch/runtime-write-batch关运行时(所有者)INTERNAL验证测试工具:读取操作,外加带还原的 time.set、camera.set 和 vehicle.variable.set;写出 <sessionId>-runtime-write-batch.json。
/d3d-batch/d3d-batch关运行时(所有者)INTERNALD3D 纹理生命周期的验证测试工具;写出 <sessionId>-d3d-wave-d-batch.json。
/runtime/runtime:<operation>无运行时STABLE_BETA(分派)按 ID 选择一个公开运行时操作。客户端模式(无安装参数):转发给所有者。所有者模式:在 Running 之后执行一次。未知 ID:OL_E_RUNTIME_OPERATION_UNKNOWN,退出码 2。
/runtime-arg/runtime-arg:<key>=<value>(可重复)无运行时STABLE_BETA(分派)运行时参数;等同于 --key=value。缺少 =:/runtime-arg requires key=value,退出码 2。

世界选择#

参数语法与取值默认值阶段稳定性行为
/new/newWorldMode.NewMap 是默认模式,但只有存在 /new、/saved、/last、/spec 之一时才会请求启动启动时STABLE_BETANEW_MAP。需要 /map 和 /entrypoint-index(没有给出所呈现入口点索引的计划会报告 OL_E_ENTRYPOINT_REQUIRED;没有 /map 则不会解析任何地图)。/new 从不静默选择地图。
/saved/saved:<file.osn>无启动时STABLE_BETASAVED_SITUATION。地图和位置来自 .osn;/map、/entrypoint、/entrypoint-index 与 /saved 一起使用时会被拒绝(退出码 2)。情景缺失:OL_E_SITUATION_NOT_FOUND;其地图缺失:OL_E_SITUATION_MAP_NOT_FOUND。
/last/last无启动时UNAVAILABLELAST_MAP_STATE。在此构建配置上始终产生 OL_E_CAPABILITY_UNAVAILABLE(不可运行,退出码 1);不会执行基于时间戳的 .osn 回退。
/map/map:<identity>(例如 maps\Grundorf\global.cfg)无启动时STABLE_BETA/new 的地图标识,或 /list:Entrypoints 的范围。未知:OL_E_MAP_NOT_FOUND。
/entrypoint/entrypoint:<identity>无启动时UNAVAILABLE按标签指定入口点。受门禁限制:计划将 world.entrypoint-identity 记录为 RUNTIME_PARTIAL,并变为不可运行(OL_E_CAPABILITY_UNAVAILABLE)。与 /entrypoint-index 互斥(标识优先并清除索引)。
/entrypoint-index/entrypoint-index:<n>,0..2147483647无启动时STABLE_BETA入口点在所呈现列表中的索引(与 OMSI 呈现的一样从 1 开始)。可运行的 NEW_MAP 计划必需此参数。

日期、时间与天气#

这四类参数都会被接受并带入 LaunchSpec,但原生启动路径不会应用它们:规划器将它们记录为 STATICALLY_PARTIAL,并添加 OL_E_CAPABILITY_UNAVAILABLE,因此计划不可运行(NOT RUNNABLE,退出码 1)。设置了这些项的 /spec 文件或会话配置档具有相同的效果。

参数语法与取值默认值阶段稳定性行为
/date/date:<yyyy-mm-dd> 或 /date:system未设置启动时UNAVAILABLEDateSpec 显式值/系统值。无法解析的值:OL_E_INVALID_ARGUMENT,退出码 2。
/time/time:<hh:mm[:ss]> 或 /time:system未设置启动时UNAVAILABLETimeSpec 显式值/系统值。
/year/year:<n> 或 /year:system未设置启动时UNAVAILABLEYearSpec。
/weather/weather:<preset>未设置启动时UNAVAILABLEWeatherMode.Preset。
/weather-icao/weather-icao:<code>未设置启动时UNAVAILABLEWeatherMode.Icao。
/weather-real/weather-real未设置启动时UNAVAILABLEWeatherMode.RealCurrent。/weather、/weather-icao、/weather-real 中最后出现者生效。

玩家车辆#

这些参数会被接受并依据安装实例解析,但运行时不会应用它们:每个已设置的字段都是 STATICALLY_PARTIAL,并添加 OL_E_CAPABILITY_UNAVAILABLE(计划不可运行,NOT RUNNABLE,退出码 1)。

参数语法与取值默认值阶段稳定性行为
/vehicle/vehicle:<identity>(Vehicles\...\*.bus)未设置启动时UNAVAILABLE最先解析(未知时为 OL_E_VEHICLE_NOT_FOUND)。
/repaint/repaint:<id>未设置启动时UNAVAILABLE仅与 /vehicle 一起解析(OL_E_REPAINT_NOT_FOUND)。
/hof/hof:<id>未设置启动时UNAVAILABLE未知时为 OL_E_HOF_NOT_FOUND。
/fleet/fleet:<n>未设置启动时UNAVAILABLE车队编号。
/registration/registration:<text>未设置启动时UNAVAILABLE车牌号。
/no-vehicle/no-vehicle关启动时STABLE_BETA清除种子(/spec 或配置档)中的任何玩家车辆。无副作用。

配置覆盖层#

参数语法与取值默认值阶段稳定性行为
/set/set:<key>=<value>(可重复;键不区分大小写)无启动时STABLE_BETA来自 ConfigurationCatalog 的语义 options.cfg 覆盖层(overlay)(例如 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。覆盖层属于会话变更:先做快照,在 OMSI 启动前应用,停止时逐字节还原(RV-005 RUNTIME_PASS)。与所选配置档中预设拥有的键冲突:OL_E_SESSION_PROFILE_OVERRIDE_CONFLICT。

启动画面呈现#

参数语法与取值默认值阶段稳定性行为
/splash/splash:Managed、/splash:Native、/splash:Unset(不区分大小写)Managed启动时STABLE_BETAManaged:打包的 640x480 24 位 BMP 会一次性复制到 <root>\.omsilaunch\assets\splash,并以事务方式覆盖 GUI\NewSplashscreen_ENG.bmp 和 GUI\NewSplashscreen_<lang>.bmp,随后精确还原(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)来自 options.cfg 的 [language],否则为 ENG启动时STABLE_BETA选择本地化的目标文件。
/splash-assets/splash-assets:<directory>(相对路径在安装根目录下解析)<root>\.omsilaunch\assets\splash,否则为打包的资源集启动时STABLE_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|OverrideNative启动时EXPERIMENTALNative:不做改动。Disabled:经构建配置分析的进程内下载器被抑制。Override:将给定的 .itx 配置文件覆盖为 Texture\standard.itx;其中列出的每个 HTTP(S) 目标以及 Texture\standard.ipr 都成为会话删除项(在会话期间移除,停止时还原)。缺少值:退出码 2。
/internet-textures-profile/internet-textures-profile:<file.itx>无启动时EXPERIMENTAL使用 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>无启动时STABLE_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>无启动时STABLE_BETA按 index 选择预设。超出范围:退出码 2。

LaunchSpec 文件#

参数语法与取值默认值阶段稳定性行为
/spec/spec:<path.json>无启动时STABLE_BETA(加载器经离线测试;会话语义与参数相同)加载 LaunchSpec JSON 文件作为种子(见 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,然后应用配置档)→ 显式参数。显式安装参数优先于 spec 中的 RootPath。/no-vehicle 清除 spec 中的玩家车辆;/vehicle 及相关参数逐字段合并到其中。/set 键合并到 Environment.General。/splash、/splash-language、/splash-assets、/internet-textures、/internet-textures-profile 仅在给出时才覆盖。/startup-timeout 和 /shutdown-timeout 仅在给出时才覆盖;Presentation.SuppressTrayIcon 只能来自 spec(没有对应参数)。诊断参数与 spec 的 Diagnostics 按“或”合并。

内容发现#

参数语法与取值默认值阶段稳定性行为
/list/list:<category>;类别为 ContentQueryKind 值 Maps、Situations、Vehicles、Repaints、Hofs、FleetNumbers、Registrations、Addons、Entrypoints(不区分大小写)无本地,无会话STABLE_BETA对安装实例执行 DiscoverAsync;信封 content.list,条目包含 Identity、Kind、DisplayName;退出码 0。未知类别:Unknown discovery category,退出码 2。重解析点(目录联接/符号链接)会被跳过,OMSI 文件按 Windows-1252 读取。
/vehicle-scope/vehicle-scope:<vehicle identity>无本地STABLE_BETA对除 Entrypoints 之外的每个类别转发的范围;Entrypoints 使用 /map 作为其范围。

超时与观察#

参数语法与取值默认值阶段稳定性行为
/startup-timeout/startup-timeout:<1..600> 秒spec/配置档中的值,否则为 180启动时STABLE_BETABehavior.StartupTimeoutSeconds。所有者等待 Running 的时长为该值加 5 s;OL_E_STARTUP_TIMEOUT 以退出码 1 结束会话。
/shutdown-timeout/shutdown-timeout:<1..600> 秒spec/配置档中的值,否则为 30启动时ACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECT带入 Behavior.ShutdownTimeoutSeconds;在此构建中监管器不使用它(OMSI 被终止,而不是被请求关闭)。
/observe-seconds/observe-seconds:<0..2147483647>无(一直运行,直到 OMSI 退出或收到停止请求)运行时(所有者)STABLE_BETA运行阶段的上限:处于 Running 达 n 秒后请求规范停止。托盘或管道停止、或 OMSI 退出会使其提前结束。0 在进入 Running 后立即停止。

恢复#

参数语法与取值默认值阶段稳定性行为
/recovery-status/recovery-status关本地STABLE_BETA报告 <root>\.omsilaunch\journal.json 是否处于待处理状态(pending),从不还原;退出码 0。会获取安装租约:所有者持有租约时返回 OL_E_INSTALLATION_BUSY(退出码 7)。
/recover/recover关本地STABLE_BETA还原待处理的事务日志(journal)(先依据快照 SHA-256 校验备份;OL_E_RECOVERY_BACKUP_CORRUPT、OL_E_RECOVERY_ABSENT_OWNERSHIP_MISMATCH、OL_W_RESTORE_FOREIGN_FILE_RETAINED 在 diagnostics 中报告)。没有待处理内容或还原完成时退出码 0;存在待处理事务日志且仍未处理时为 8。当事务日志中记录的 OMSI 进程(PID、创建时间、exe 路径)仍存活时,或者对于已越过 HandoffCreated 但没有 PID 的事务日志、该根目录下的任何 Omsi.exe 仍存活时,以 OL_E_INSTALLATION_BUSY 拒绝。每次会话启动都会在读取安装实例之前自动执行相同的恢复。

输出格式#

  • 信封成功(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,以及转发的运行时命令所用的运行时操作 ID。
  • 在 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 托盘 · 运行时控制 · 能力 · LaunchSpec · 会话配置档 · 打包 · 兼容性 · 已知限制 · 公开 API