CLI 參考

文件版本 v0.1.0-beta.3在 GitHub 上檢視原始檔

本頁為 OmsiLaunch 0.1.0-beta3 英文原始頁面 的翻譯。英文頁面為規範版本:若有出入,以英文頁面與程式碼為準。

本頁是 OmsiLaunch 0.1.0-beta3 命令列完整的規範性參考:涵蓋三個可執行檔、引數文法、分派順序、每個命令字、每個階層式路由、每個旗標、輸出封套,以及每個命令的錯誤行為。本頁內容產生自 tools\OmsiLaunch.Cli\Program.cs(CliProgram.RunAsync、OwnerSession.RunAsync、CliInput.Parse、CliInput.KnownFlags、CliInput.AcceptedNoEffectFlags、CliInput.CommandWordsAccepted、CliInput.HierarchicalRoutes、CliInput.BuildSpecAsync、CliEventWatch)、tools\OmsiLaunch.Cli\LaunchSpecJson.cs,以及 tools\OmsiLaunch.Bootstrapper 下的兩個原生 shim。處理程序結果列於結束代碼;錯誤碼列於錯誤;實際呼叫範例請見 CLI 範例。

可執行檔#

檔案子系統角色差異
OmsiLaunch.exe主控台原生啟動程式(OmsiLaunch.Bootstrapper.cpp):解析自身所在目錄,以 CommandLineToArgvW 將命令列切分為 token,透過 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 runtime;請見安裝。

nethost.dll 必須與 shim 放在同一目錄。shim 本身不讀取任何引數;每個引數都會原封不動地傳到 CliInput.Parse,因此 OmsiLaunch.exe 與 OmsiLaunchW.exe 接受完全相同的語法。

呼叫模型#

引數文法(CliInput.Parse)#

形式意義
/key:value、/key、-key:value、-key旗標。key 不區分大小寫;value 為第一個 : 之後的所有內容。未知的 key 會以 OL_E_INVALID_ARGUMENT(Unknown argument: ...)失敗,結束代碼 2。
--key=value所選執行階段操作的執行階段引數(例如 --handle=rv-000001)。任何包含 = 的 -- token 都是執行階段引數,絕不是旗標。
--json、/json結構化輸出(請見輸出格式)。--json 是唯一有意義且不含 = 的 -- token;它會被解析為 /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(不繼承 handle)從可執行檔所在目錄啟動 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),可選擇依 family 篩選;結束代碼 0。
  5. profiles:包含 family 與 supported 可執行檔變體的封套(ALTERNATE_LAA 692EBFBF...,runtime_validated=true;Steam LAA hash 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. 除非規格中設定了 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 自身的關閉程序不會執行,options.cfg 也不會被 OMSI 重寫),然後還原每個由工作階段擁有的檔案。請見工作階段生命週期與交易與復原。

命令字#

第一個位置可接受的每個字詞(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> 依功能 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保留的 family 字詞無d3d 沒有階層式路由:d3d texture ... 是未知路由(結束代碼 2),單獨的 d3d 會印出用法(結束代碼 2)。D3D 操作透過 /runtime:d3d.status、/runtime:d3d.texture.create 等方式呼叫(請見沒有路由的操作)。

階層式路由#

CliInput.HierarchicalRoutes 將小寫化的路由對應到執行階段操作 ID。所有路由都需要 Running 工作階段,並透過執行階段信箱(mailbox)執行(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>(駕駛員=0、乘客=1、外部=2、地圖=3),可選 --preset=<n>(family 0 或 1)。需要玩家車輛(例如已儲存情境)。已在執行階段封閉驗證中於執行階段驗證(CAM01);功能登錄的 RuntimeValidation 字串仍顯示 STATICALLY_VALIDATED(請見功能)。
camera unlockcamera.unlockAction是是無EXPERIMENTAL解除由 camera lock 設定的原則(CAM01)。
vehicles listroad-vehicles.listRead是否無STABLE_BETA回傳工作階段範圍的 rv-NNNNNN handle。
vehicles getroad-vehicle.readRead是否無STABLE_BETA需要 --handle=。失效的 handle:OL_E_RUNTIME_OBJECT_HANDLE_STALE。
vehicles summaryroad-vehicles.readRead是否無STABLE_BETA計數與玩家狀態,不含 handle。
vehicles spawnroad-vehicles.spawnAction是是(新增一輛 RoadVehicle)無,不會移除EXPERIMENTAL需要 --model=Vehicles\...\*.bus。用戶端逾時 30 s,擁有者逾時 15 s。不會指派玩家車輛。RV-003 RUNTIME_PASS。
vehicles place-randomroad-vehicles.place-randomAction是是無EXPERIMENTAL已建立設定檔的 PlaceRandomBus。
player getplayer-vehicle.readRead是否無STABLE_BETA沒有玩家車輛時為語意上的 null。
humans listhumans.listRead是否無EXPERIMENTAL回傳 hb-NNNNNN handle。
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 中的每個旗標。「階段」分為 launch-time(形塑新工作階段的 LaunchSpec/計畫)、runtime(作用於執行中的工作階段)或 control(變更 CLI 本身的行為)。僅為相容性而解析的旗標(CliInput.AcceptedNoEffectFlags)會在其所在列標示。

控制與輸出#

旗標語法與值預設階段穩定性行為
/?/?關閉controlSTABLE_BETA印出用法文字,結束代碼 0。
/help/help關閉controlSTABLE_BETA與 /? 相同。(單純字詞 help 則回傳結構化目錄。)
/version/version關閉controlSTABLE_BETAversion 封套,結束代碼 0。除 /silent 外,在所有其他命令之前評估。
/json/json 或 --json關閉controlSTABLE_BETA輸出 JSON 封套;即使在 OmsiLaunchW.exe 下也會強制主控台輸出。
/quiet/quiet關閉controlACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECT設定 CliInput.Quiet;沒有任何地方讀取它。
/silent/silent(亦可 --silent)關閉controlEXPERIMENTAL將整個命令列委派給 OmsiLaunchW.exe,主機處理程序一啟動即回傳 0。工作階段結果由 OmsiLaunchW.exe(訊息方塊、系統匣圖示)、.omsilaunch\diagnostics 與本機控制端點回報。委派與失敗對話方塊已於執行階段驗證(執行階段封閉驗證 T04);請見 OmsiLaunchW.exe。
/serve/serve關閉controlACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECT設定 CliInput.Serve;沒有任何地方讀取它。控制端點一律由擁有者啟動。
/verbose/verbose關閉launch-timePARTIALDiagnosticsSpec.Verbose。值會帶入規格中;其效果僅限於 .omsilaunch\diagnostics 下的主機追蹤。
/log/log開啟(DiagnosticsSpec.Log 預設為 true)launch-timePARTIALDiagnosticsSpec.Log。實際上一律開啟。
/logall/logall關閉launch-timePARTIAL同時設定 Verbose、ProcessTrace、PluginTrace 與 NativeTrace。
/omsi-logall/omsi-logall關閉launch-timePARTIALDiagnosticsSpec.OmsiLogAll。
/trace/trace關閉launch-timePARTIAL/trace-process 的別名。
/trace-process/trace-process關閉launch-timePARTIALDiagnosticsSpec.ProcessTrace。
/trace-plugin/trace-plugin關閉launch-timePARTIALDiagnosticsSpec.PluginTrace。
/trace-native/trace-native關閉launch-timePARTIALDiagnosticsSpec.NativeTrace。

規劃、驗證與測試工具#

旗標語法與值預設階段穩定性行為
/plan/plan關閉launch-timeSTABLE_BETA建立並印出 SessionPlan,不啟動 OMSI。IsRunnable 時結束代碼 0,否則為 1。需要啟動選擇(/new、/saved、/spec 或安裝引數);單獨使用 /plan 而沒有其他引數時會執行 detect。
/validate/validate關閉launch-timeSTABLE_BETA在此組建中與 /plan 完全相同。
/runtime-batch/runtime-batch關閉runtime(擁有者)INTERNAL驗證測試工具:到達 Running 後執行讀取操作集,並寫出 <sessionId>-runtime-read-batch.json。
/runtime-write-batch/runtime-write-batch關閉runtime(擁有者)INTERNAL驗證測試工具:讀取,再加上帶還原的 time.set、camera.set 與 vehicle.variable.set;寫出 <sessionId>-runtime-write-batch.json。
/d3d-batch/d3d-batch關閉runtime(擁有者)INTERNALD3D 材質生命週期的驗證測試工具;寫出 <sessionId>-d3d-wave-d-batch.json。
/runtime/runtime:<operation>無runtimeSTABLE_BETA(分派)依 ID 選擇公開執行階段操作。用戶端模式(沒有安裝引數):轉送給擁有者。擁有者模式:在 Running 後執行一次。未知 ID:OL_E_RUNTIME_OPERATION_UNKNOWN,結束代碼 2。
/runtime-arg/runtime-arg:<key>=<value>(可重複)無runtimeSTABLE_BETA(分派)執行階段引數;等同 --key=value。缺少 =:/runtime-arg requires key=value,結束代碼 2。

世界選擇#

旗標語法與值預設階段穩定性行為
/new/newWorldMode.NewMap 是預設模式,但只有在出現 /new、/saved、/last、/spec 其中之一時才會要求啟動launch-timeSTABLE_BETANEW_MAP。需要 /map 與 /entrypoint-index(沒有呈現的進入點索引的計畫會回報 OL_E_ENTRYPOINT_REQUIRED;沒有 /map 時不會解析任何地圖)。/new 永遠不會自動選擇地圖。
/saved/saved:<file.osn>無launch-timeSTABLE_BETASAVED_SITUATION。地圖與位置來自 .osn;/map、/entrypoint、/entrypoint-index 與 /saved 併用時會被拒絕(結束代碼 2)。情境遺失:OL_E_SITUATION_NOT_FOUND;其地圖遺失:OL_E_SITUATION_MAP_NOT_FOUND。
/last/last無launch-timeUNAVAILABLELAST_MAP_STATE。在此設定檔上一律產生 OL_E_CAPABILITY_UNAVAILABLE(不可執行,結束代碼 1);不會執行以時間戳記為依據的 .osn 後援。
/map/map:<identity>(例如 maps\Grundorf\global.cfg)無launch-timeSTABLE_BETA/new 的地圖識別,或 /list:Entrypoints 的範圍。未知:OL_E_MAP_NOT_FOUND。
/entrypoint/entrypoint:<identity>無launch-timeUNAVAILABLE依標籤指定進入點。受關卡限制:計畫會將 world.entrypoint-identity 記錄為 RUNTIME_PARTIAL,並成為不可執行(OL_E_CAPABILITY_UNAVAILABLE)。與 /entrypoint-index 互斥(識別優先,並清除索引)。
/entrypoint-index/entrypoint-index:<n>,0..2147483647無launch-timeSTABLE_BETA進入點在呈現清單中的索引(依 OMSI 呈現方式從 1 起算)。可執行的 NEW_MAP 計畫必須提供。

日期、時間與天氣#

四者都會被接受並帶入 LaunchSpec,但原生啟動路徑不會套用它們:規劃器會將它們記錄為 STATICALLY_PARTIAL,並加入 OL_E_CAPABILITY_UNAVAILABLE,因此計畫為 NOT RUNNABLE(結束代碼 1)。設定這些值的 /spec 檔案或工作階段設定檔也有相同效果。

旗標語法與值預設階段穩定性行為
/date/date:<yyyy-mm-dd> 或 /date:system未設定launch-timeUNAVAILABLEDateSpec 明確值/系統。無法解析的值:OL_E_INVALID_ARGUMENT,結束代碼 2。
/time/time:<hh:mm[:ss]> 或 /time:system未設定launch-timeUNAVAILABLETimeSpec 明確值/系統。
/year/year:<n> 或 /year:system未設定launch-timeUNAVAILABLEYearSpec。
/weather/weather:<preset>未設定launch-timeUNAVAILABLEWeatherMode.Preset。
/weather-icao/weather-icao:<code>未設定launch-timeUNAVAILABLEWeatherMode.Icao。
/weather-real/weather-real未設定launch-timeUNAVAILABLEWeatherMode.RealCurrent。/weather、/weather-icao、/weather-real 以最後出現者為準。

玩家車輛#

會被接受並依安裝內容解析,但 runtime 不會套用:每個已設定的欄位都為 STATICALLY_PARTIAL,並加入 OL_E_CAPABILITY_UNAVAILABLE(計畫 NOT RUNNABLE,結束代碼 1)。

旗標語法與值預設階段穩定性行為
/vehicle/vehicle:<identity>(Vehicles\...\*.bus)未設定launch-timeUNAVAILABLE最先解析(未知時為 OL_E_VEHICLE_NOT_FOUND)。
/repaint/repaint:<id>未設定launch-timeUNAVAILABLE只有與 /vehicle 一起時才會解析(OL_E_REPAINT_NOT_FOUND)。
/hof/hof:<id>未設定launch-timeUNAVAILABLE未知時為 OL_E_HOF_NOT_FOUND。
/fleet/fleet:<n>未設定launch-timeUNAVAILABLE車隊編號。
/registration/registration:<text>未設定launch-timeUNAVAILABLE車牌號碼。
/no-vehicle/no-vehicle關閉launch-timeSTABLE_BETA清除種子(/spec 或設定檔)中的任何玩家車輛。無副作用。

設定 overlay#

旗標語法與值預設階段穩定性行為
/set/set:<key>=<value>(可重複;key 不區分大小寫)無launch-timeSTABLE_BETA來自 ConfigurationCatalog 的語意 options.cfg overlay(暫時覆蓋)(例如 graphics.maxFPS=60、traffic.randomVehicles=150)。未知 key:OL_E_UNKNOWN_SETTING(結束代碼 2);唯讀 key(advanced.multithreadingCalculate、advanced.multithreadingTextureLoad、graphics.texture、graphics.textureFilter):OL_E_SETTING_NOT_WRITABLE(結束代碼 2);超出範圍或格式錯誤的值:建立 overlay 時為 OL_E_INVALID_SETTING_VALUE。overlay 是一種工作階段變更:會建立快照、在 OMSI 啟動前套用,並在停止時逐位元組還原(RV-005 RUNTIME_PASS)。與所選設定檔中由預設組合(preset)擁有的 key 衝突:OL_E_SESSION_PROFILE_OVERRIDE_CONFLICT。

啟動畫面呈現#

旗標語法與值預設階段穩定性行為
/splash/splash:Managed、/splash:Native、/splash:Unset(不區分大小寫)Managedlaunch-timeSTABLE_BETAManaged:套件內附的 640x480 24 位元 BMP 會複製一次到 <root>\.omsilaunch\assets\splash,並以交易方式 overlay 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],否則為 ENGlaunch-timeSTABLE_BETA選擇在地化的目標檔案。
/splash-assets/splash-assets:<directory>(相對路徑會解析到安裝根目錄之下)<root>\.omsilaunch\assets\splash,否則為套件內附的組合launch-timeSTABLE_BETA自訂資產目錄;必須包含 ENG.bmp,非英文語言時還需 <lang>.bmp。錯誤:OL_E_SPLASH_ASSET_DIRECTORY_MISSING、OL_E_SPLASH_ASSET_MISSING、OL_E_SPLASH_FORMAT_UNSUPPORTED(在計畫中呈現為 OL_E_SESSION_PRESENTATION_INVALID;不可執行)。

Internet Textures#

旗標語法與值預設階段穩定性行為
/internet-textures/internet-textures:Native|Disabled|OverrideNativelaunch-timeEXPERIMENTALNative:不變動。Disabled:抑制已建立設定檔的處理程序內下載器。Override:將指定的 .itx 設定檔 overlay 為 Texture\standard.itx;其中列出的每個 HTTP(S) 目標加上 Texture\standard.ipr 都會成為工作階段刪除項目(在工作階段期間移除,停止時還原)。缺少值:結束代碼 2。
/internet-textures-profile/internet-textures-profile:<file.itx>無launch-timeEXPERIMENTAL使用 Override 時為必要(OL_E_ITX_PROFILE_REQUIRED,結束代碼 2)。OL_E_ITX_PROFILE_MISSING、OL_E_ITX_PROFILE_INVALID(必須是 URL/目標的成對行,且 URL 為 http/https)、OL_E_ITX_TARGET_OUTSIDE_TEXTURE_PATH(目標必須解析到 Texture\ 之下,不得為根路徑、.. 或重新剖析點)。

工作階段設定檔#

旗標語法與值預設階段穩定性行為
/predefined-profile/predefined-profile:<id>無launch-timeSTABLE_BETA(編譯;離線 OmsiLaunch.ProfileTests)載入 <root>\.omsilaunch\session-profiles\<id>\profile.yaml(請見工作階段設定檔)。需要 /predefined-profile-index(OL_E_SESSION_PROFILE_PRESET_NOT_FOUND,結束代碼 2)。new: 區塊僅在 /new 時套用;compatibility.maps 對 /new 與 /saved 強制執行(OL_E_SESSION_PROFILE_MAP_MISMATCH)。與設定檔擁有之欄位衝突的明確旗標會以 OL_E_SESSION_PROFILE_OVERRIDE_CONFLICT 拒絕(CliInput.RejectProfileConflicts):new: 區塊擁有地圖/進入點/日期/時間/年份/天氣時的對應旗標、預設組合擁有的 /set key、預設組合含 presentation 時的啟動畫面旗標、含 internet-textures 時的 Internet Textures 旗標,以及含 behavior 時的逾時旗標。
/predefined-profile-index/predefined-profile-index:<1..5>無launch-timeSTABLE_BETA依 index 選擇預設組合。超出範圍:結束代碼 2。

LaunchSpec 檔案#

旗標語法與值預設階段穩定性行為
/spec/spec:<path.json>無launch-timeSTABLE_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,然後套用設定檔)→ 明確旗標。明確的安裝引數優先於規格中的 RootPath。/no-vehicle 會清除規格中的玩家車輛;/vehicle 及相關旗標則逐欄位合併到其中。/set key 合併到 Environment.General。/splash、/splash-language、/splash-assets、/internet-textures、/internet-textures-profile 僅在有指定時才覆寫。/startup-timeout 與 /shutdown-timeout 僅在有指定時才覆寫;Presentation.SuppressTrayIcon 僅來自規格(沒有對應旗標)。診斷旗標會與規格中的 Diagnostics 進行 OR 合併。

內容探索#

旗標語法與值預設階段穩定性行為
/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> 秒規格/設定檔的值,否則為 180launch-timeSTABLE_BETABehavior.StartupTimeoutSeconds。擁有者等待 Running 的時間為此值加 5 s;OL_E_STARTUP_TIMEOUT 會以結束代碼 1 結束工作階段。
/shutdown-timeout/shutdown-timeout:<1..600> 秒規格/設定檔的值,否則為 30launch-timeACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECT帶入 Behavior.ShutdownTimeoutSeconds;在此組建中監督程式不會使用它(OMSI 是被終止,而非被要求關閉)。
/observe-seconds/observe-seconds:<0..2147483647>無(執行到 OMSI 結束或收到停止要求為止)runtime(擁有者)STABLE_BETA執行階段的上限:處於 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還原待處理的日誌(備份會先依快照 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 回覆,若為了放入控制訊框(frame)而省略了較舊的事件,會加上 metadata 成員(events_dropped_count,請見本機控制)。未使用 --json 時只會以縮排 JSON 印出 <object>,若有事件被捨棄,其後接著 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