# Unreal Engine の Commandline Interface - ushell

**URL:** <https://forums.unrealengine.com/t/unreal-engine-commandline-interface-ushell/1993246>\
**Category:** 日本語 (Japanese)\
**Tags:** unreal-engine, Scripting\
**Created:** [August 27, 2024, 1:59am UTC](https://forums.unrealengine.com/t/unreal-engine-commandline-interface-ushell/1993246 "2024-08-27T01:59:39Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Ken.Kuwano](https://d3kjluh73b9h9o.cloudfront.net/original/4X/2/8/5/28502927f1d97ba1051b3b47ccfe17233bf41ef0.png) [@Ken.Kuwano](https://forums.unrealengine.com/u/Ken.Kuwano)\
**Post date:** [August 27, 2024, 1:59am UTC](https://forums.unrealengine.com/t/unreal-engine-commandline-interface-ushell/1993246/1 "2024-08-27T01:59:39Z")

</div>

公式ドキュメント  
[https://github.com/EpicGames/UnrealEngine/tree/ue5-main/Engine/Extras/ushell](https://github.com/EpicGames/UnrealEngine/tree/ue5-main/Engine/Extras/ushell)

本内容は、上記の内容をより分かりやすく説明し、一般的に利用するためのユースケースや拡張の例を示した記事になります。

# はじめに

## ushellとは

ushellはUnreal Engine、Unreal Game Syncおよび、さまざまなバッチスクリプト、ツールと対話できるコマンドラインインターフェース(CLI)です。Unreal Shellの略称からushellと呼ばれており、以下のようなコマンドプロンプトのshellを介して実行します。以下の例は、ushellを利用してコマンドラインからプロジェクトのビルドを行う操作を示します。

![00.ushell](https://d3kjluh73b9h9o.cloudfront.net/original/4X/3/5/4/354231599669fb1641920ed7f19f5b0ed374558b.gif)

ushellは遠隔からUnreal Engineを操作するためのコマンドラインを送信することができ、主にエンジニアの利用を対象としています。コードの作成、変更リストの選択、コンソールでの実行など、あらゆる機能に簡単にアクセスできるほか、豊富なタブ補完機能や、永続的に検索可能なコマンド履歴も備えています。より早く、効果的にローカルでテストしたり、バックエンドに接続してテストするのに役立ちます。

## メリット

ushellを利用することで、ワークフローにおいて以下のような改善点や利点があります。

- vsを起動することなく、すばやくビルドが可能
- ビルド時のターゲットプラットフォームの切り替えなどが容易
- クックやパッケージなど、バッチファイルを作成せずに実行可能
- プロジェクト独自のコマンドを作成、追加が可能
- ターゲットプラットフォームを問わず同一のコンソール上で操作が可能
- Perforceと連携したスクリプトを容易に作成可能

## クイックスタート

ushellを利用するための最小のセットアップ方法を以下に示します。

1. ushell.bat のショートカットを作成  
ushell.bat を右クリックで選択し、「ショートカットを作成」(Create Shortcut)からショートカットファイルを作成します。

2. Target に ushell.batまでのパスを設定  
ショートカットを右クリックで開き、[リンク先(T)] の項目にパスを設定します。

3. Start in にターゲットとするプロジェクトの.uprojectがあるディレクトリを設定  
ショートカットを右クリックで開き、[作業フォルダー(S)] の項目にパスを設定します。

4. ushellを起動  
ショートカットで作成したファイルをダブルクリックで実行します。  

ショートカットのプロパティは次のようになります。

```auto
リンク先 : d:\ushell\ushell.bat
作業フォルダー	: d:\perforce\branch\QAGame

```

あるいは、 ‘–project=’ コマンドライン引数を使用することもできます。

```auto
リンク先 : d:\ushell\ushell.bat --project=d:\perforce\branch\QAGame
作業フォルダー	: d:\my\favourite\directory

```

.project [path\_to\_uproject] コマンドを使用すると、ushell内からターゲットプロジェクトを変更できます。

# Mac/Linux

POSIXベースのプラットフォームでは、ushellは ushell.shによって現在のシェル内で自らを確立します。  
引数や作業ディレクトリに関するルールは、上記のクイックスタートガイドに記載されているものが、ushell.shをソースした際にも適用されます。適切なバージョンのPythonが利用可能であること（およびPipをビルドするためのツールチェーンが必要な場合はその準備）が、ユーザーに委ねられています。

# 利用方法

## コマンド例

ushell で使用可能なコマンドとその機能を理解する最良の方法は、いくつかの例を挙げることだと考えるので、ここにその例を示します。コマンドの各詳細については、以降に示します。

```auto
.build editor
.build game ps4
.build program UnrealInsights shipping
.cook game ps4
.stage game ps4
.run editor
.run game ps4 --trace -- -ExecCmds="Zippy Bungle Rainbow"
.run program UnrealInsights shipping
.p4 cherrypick 1234567
.sln generate
.info

```

ushell の各コマンドは ”–help” コマンドを入力することができ (例: .build --help)、入力することで各コマンドの呼び出し方法の詳細や、使用可能なオプションの説明を表示します。

## コマンド一覧

以下は実行可能なコマンド引数を一覧で示します。

| コマンド | 説明 |
| --- | --- |
| .build | プロジェクトをビルドします。 |
| .cook | プロジェクトをクックします。 |
| .ddc | Cloud DDCを認証します。 |
| .deploy | パッケージングのインストール、配置を実行します。 |
| .help | 利用可能なコマンドを表示します。 |
| .info | エンジン、プロジェクトの情報を表示します。 |
| .kill | プロセスを終了します。 |
| .notify | コンソールウィンドウを表示します。 |
| .p4 | Perforceに関する操作します。 |
| .project | プロジェクトを操作します。 |
| .run | プロジェクトを実行します。 |
| .sln | プロジェクトのVisual Studioソリューションを操作します。 |
| .stage | ステージング、パッケージを実行します。 |
| .uat | UATをコマンド引数を渡して実行します。 |
| .ushell | ushell環境の設定します。 |
| .zen | Zenシリーズの機能を利用します。 |

## コマンド詳細

以下に各コマンドの詳細および実行例を示します。頻繁に出てくる用語および略称は以下のようになっています。

| 単語 | 説明 |
| --- | --- |
| target | game, editor, client, serverなど、\*.Target.cs に該当するターゲットのことを指します |
| cwd | current working directory |

以降で各コマンドの詳細とコマンドの実行例を示します。

### .build

```auto
.build clean game

```

gameのビルドをクリーンします。

```auto
.build editor

```

Development|Editor構成でビルドを実行します。

```auto
.build target [ModuleName]

```

.build target ModuleName  
特定のモジュールMyModuleのみビルドを実行します。

```auto
.build target [FilePath]

```

.build target ModuleName/MySourceFile.cpp  
特定のモジュールMySourceFile.cppのみコンパイルを実行します。

```auto
.build program [PrgramName]

```

.build program UnrealInsights  
Engine\Source\Programs 以下にあるプログラムを指定してコンパイルを実行します。

```auto
.build misc clangdb

```

Clang データベース（compile\_commands.json：ソースコードをコンパイルする際のコンパイルオプションを Clangd に伝えるためのファイル）を生成します。アクティブなプロジェクトがある場合は、そのプロジェクトのコンテキストでデータベースが生成されます。

```auto
.build xml

```

現在のプロジェクトのビルド構成を表示します。構成を変更するには、set、clear、および edit サブコマンドを使用します。

```auto
.build xml clear 

```

ビルド構成から値をクリアします。

```auto
.build xml edit

```

ビルド構成をテキストエディタで開きます。使用されるテキストエディタは次の順序($GIT\_EDITOR、$P4EDITOR、システムデフォルト)で決定されます。

```auto
.build xml set

```

ビルド構成を変更します。

```auto
.build game win64

```

WIn64構成でプロジェクトをビルドします。

### .cook

```auto
.cook

```

プラットフォームを指定しない場合、基本的にはPCのプラットフォームが選択されます。

```auto
.cook windows

```

プロジェクトをWindowsプラットフォーム向けにクックします。

```auto
.cook windows --onthefly

```

プロジェクトをWindowsプラットフォーム向けにOnTheFlyでクックします。

```auto
.cook client

```

クライアントデータを特定のプラットフォーム向けにクックします。

```auto
.cook game

```

ゲームデータを特定のプラットフォーム向けにクックします。

```auto
.cook server

```

サーバーデータを特定のプラットフォーム向けにクックします。

```auto
.cook odsc all

```

ODSC(On Demand Shader Compilation)サーバーを起動します。-odschost=[ODSC-SERVER-IP]でサーバーを指定します。

```auto
.cook odsc client

```

ODSC(On Demand Shader Compilation)サーバーを起動します。-odschost=[ODSC-SERVER-IP]でサーバーを指定します。

```auto
.cook odsc game

```

ODSC(On Demand Shader Compilation)サーバーを起動します。-odschost=[ODSC-SERVER-IP]でサーバーを指定します。

### .ddc

```auto
.ddc auth [ServiceName]

```

.ddc auth MyOrg-MyService  
DDCをクラウドDDCのサービス名(MyOrg-MyService)で認証します。

### .deploy

```auto
.deploy [Target] [Platform]

```

.deploy game win64  
win64プラットフォームでゲームをデプロイします。

### .help

```auto
.help

```

利用可能なコマンド一覧を表示します。

```auto
.help readme

```

ushellを説明するreadme.txtの内容を示します。

### .info

```auto
.info

```

エンジンやプロジェクトのバージョンなどの情報を表示します。

```auto
.info projects

```

プロジェクトの情報を一覧で表示します。

```auto
.info config [Category]

```

.info config enging  
Engineコンフィグの情報を一覧で表示します。

[Category] = Engine, Game, Input, DeviceProfiles, GameUserSettings, Scalability, RuntimeOptions, InstallBundle, Hardware, GameplayTags

### .kill

```auto
.kill

```

Devkitかローカルマシン上のプロセスを終了します。

### .notify

```auto
.notify

```

ユーザー喚起のためにウィンドウを開きます。(対応するOS, winのみ)

### .p4

```auto
.p4 authors [path]

```

.p4 authors D:\Github\UnrealEngine-5.4.3-release\Engine\Config\BaseEditor.ini  
指定されたパスに基づいて、各編集者をリストアップします。

```auto
.p4 bisect [GoodCL] [BadCL] [[--] script...]

```

.p4 bisect 12345 67890 do\_stuff.bat  
GoodCLとBadCLの範囲内の変更リストを二分します。

```auto
.p4 cherrypick [ChangeList]

```

.p4 cherrypick 12345678  
1つまたは複数の変更リストを現在のブランチに統合/取り消し、必要に応じて統合記録を解決およびクリアします。

```auto
.p4 clean

```

Unreal Engineブランチから中間ファイルや一時ファイルをクリーンアップします。

```auto
.p4 workspace localdir [DepoPath]

```

新しいワークスペースを作成し、最小限の同期を行います。

```auto
.p4 sync

```

現在のプロジェクトとエンジンディレクトリを指定された変更リスト（または指定がない場合は最新のもの）に同期します。'–all’オプションが指定されている場合、ブランチがローカルで既存の .uproject ファイルを検索し、それぞれを同期するようにスケジュールします。

```auto
.p4 sync edit

```

.p4sync.txt をエディタで開きます。エディタは環境変数 P4EDITOR、GIT\_EDITOR、およびシステムのデフォルトエディタから選ばれます。

```auto
.p4 sync mini

```

最小限の機能でブランチを同期します。

```auto
.p4 v

```

現在のディレクトリに対応するクライアントスペックをP4Vで開きます。

```auto
.p4 mergedown

```

親ストリームからのマージダウンします。

```auto
.p4 reset

```

ブランチをデポと一致するように調整します。これは破壊的なアクションであり、ファイルの削除や書き換えを伴うため、慎重に使用してください。

```auto
.p4 switch [Stream] [Changelist]

```

ストリーム間を切り替え、開いているファイルを新しいストリームに統合します。ストリーム名が指定されていない場合は、リストからストリームを選択するよう求められます。

```auto
.p4 switch list

```

現在のブランチに関連する利用可能なストリームのツリーを表示します。

```auto
.p4 who [path] [line]

```

.p4 who D:\Engine\Release-5.4\Engine\Config\BaseGame.ini 1  
対象ファイル、行の編集者を特定して変更リストを開きます。

### .project

プロジェクトを操作します。

```auto
.project [MyProjectName]

```

.project MyProject  
同一ブランチのディレクトリ内で指定のプロジェクトを検索してアクティブにします。

```auto
.project [Path to MyProject]

```

.project d:/projects/MyProject  
指定パスのプロジェクトを検索してアクティブにします。

```auto
.project branch

```

アクティブプロジェクトからブランチを解除します。

```auto
.project cwd

```

アクティブなプロジェクトまたはブランチを解除します。

```auto
.project active

```

アクティブなプロジェクトを表示します。

```auto
.project list

```

アクティブなプロジェクトをリストで表示します。

### .run

```auto
.run editor

```

プロジェクトをエディタで開きます。

```auto
.run commandlet [Command]

```

.run commandlet cook  
プロジェクトをコマンドレットで起動してクックします。

```auto
.run progarm

```

特定のプログラムで起動します。

```auto
.run server

```

ゲームサーバーモードで起動します。

```auto
.run client

```

ゲームクライアントモードで起動します。

```auto
.run game

```

ゲームランタイムモードで起動します。

```auto
.run game --attach

```

ゲームランタイムモードで起動してデバッガをアタッチします。

```auto
.run includetool

```

IncludeTool.exeを起動します。

### .sln

```auto
.sln generate

```

アクティブなプロジェクトの.slnソリューションファイルをEngineのルート配下のディレクトリに作成します。

```auto
.sln open

```

プロジェクトのソリューションを開きます。

```auto
.sln open 10x

```

10xEditorでプロジェクトのソリューションを開きます。

```auto
.sln open tiny

```

ソリューションの生成をして開きます。

### .stage

```auto
.stage game

```

win64構成でビルド済み実行ファイルとクック済みアセットをステージングディレクトリにコピーしてパッケージングを行います。

```auto
.stage game ps4 development pak --build --cook

```

PS4|Development`構成でビルド、クック、ステージ、パッケージ作成を行います。

### .uat

```auto
.uat [Command]

```

UATからスクリプトを実行します。

.uat BuildAndCook -platform=Win64 -clientconfig=Development -serverconfig=Development -cook -allmaps -build -stage -pak -archive  
UATからWin64|Development構成においてビルド、クック、ステージ、パック、アーカイブを実行します。

```auto
.uat BuildGraph -- -Script=Engine/Build/EditorPerf.xml

```

UATからBuildGraphのスクリプトを実行します。

```auto
.uat RunPGOTests -test=ProfileGo -platform=PS4

```

UATからPGOテスト用のテストをPS4構成において実行します。

### .ushell

```auto
.ushell theme apply

```

シェルの背景及び文字色の変更を適用します。

```auto
.ushell theme random

```

シェルの背景及び文字色のイメージをランダムで表示します。

```auto
.ushell theme showcase

```

シェルの背景及び文字色のイメージをショーケースとして一覧表示します。

### .zen

```auto
.zen start

```

Zen Serverを起動します。

```auto
.zen stop

```

稼働中のZen Serverを停止します。

```auto
.zen dashboard

```

Zen Dashboardを起動してGUIでZen Serverの稼働状況を表示します。

```auto
.zen status

```

Zen Serverの稼働状況をコンソール上に表示します。

```auto
.zen version

```

Zen Serverのバージョン情報をコンソール上に表示します。

```auto
.zen importsnapshot [Path]

```

.zen importsnapshot D:\MyProject\xxx\PS5Client\SnapshotDescriptor.json  
oplogのsnapshotをインポートします。zen snapshotを利用する際に使用します。

# コマンド操作

## 入力補完 [Tab]

Bash (Readlineなど) でコマンドを編集したり、以前のコマンドを呼び出したりすることに慣れている人であれば、ushell プロンプトもすぐに使いこなせるようになります。

コマンドとその引数には、コンテキストに応じて広範囲な「Tab キーによる補完機能」が用意されています。Tab キーを押すと、コマンドとその引数を見つけることができ、コマンドをすばやく入力できるようになります。

例：入力例と説明

| . | 利用可能なコマンドを表示 |
| --- | --- |
| .b | “.build” を完了 |
| .run | “.run” コマンド引数のためのオプションを表示 |
| .build editor --p | “–platform=” を追加 (さらにタブでプラットフォームを補完) |

**例：”.” 入力後にTab キーを入力すると、以下のように候補を表示します。**

 ![05.Tab補完](https://d3kjluh73b9h9o.cloudfront.net/original/4X/0/9/3/093d65db845b984058826bdce0e62e2226f4755a.png)

**例：”.i” 入力後にTab キーを入力すると、以下のように候補のオプションを表示します。**  
 ![06.Tab補完２](https://d3kjluh73b9h9o.cloudfront.net/original/4X/c/2/0/c20de70607824600e76bf60a10793fdf9fe7de0b.gif)

## 入力履歴送り/戻り [PgUp/PgDn]

ushellで実行されたコマンドは、履歴としてセッション間で保持されます。過去に入力したコマンドに戻る時は PgUp キー、進む場合は PgDown キーを入力することで簡単に呼び出すことができます。  
詳細なインクリメンタル履歴検索は、Ctrl+R キーで実行できます。これにより、検索文字列を入力するプロンプトが表示され、一致する最新のコマンドが表示されます。さらに Ctrl+R キーを入力すると、検索文字列に一致するコマンドが前に戻ります (Ctrl+S キーを押すと前に戻る)。履歴検索では、大文字と小文字が区別されます。  
 ![2024-08-20_11h16_26](https://d3kjluh73b9h9o.cloudfront.net/original/4X/4/d/f/4dffe89f1e87787db28ec55748dfaab2b08e524f.png)

# UnrealGameSyncのインテグレーション

UGSは、DeploymentSettings/ToolsDepotPath設定を通じて、Perforce経由で追加のツールを展開することをサポートしています。Tools/ushell/ushell.iniファイルを追加することで、ユーザーは「オプション \> アプリケーション設定」からushellのステータスパネルリンクを有効にすることができます。以下にushell.iniの例を示します。

```auto
[Settings]
Id=922EED87-E732-464C-92DC-5A8F7ED955E2
Name=ushell
Description=ushell
SafeWhenBusy=1
+StatusPanelLinks=(Label="ushell", FileName="$(COMSPEC)", Arguments="/c \"\"$(BranchDir)\\Engine\\Extras\\ushell\\ushell.bat\" --project=\"$(ProjectFile)\"\"", WorkingDir="$(ProjectDir)")

```

また、ushell.iniと一緒にushell.zipファイルとしてushellのコピーを配布することも可能です。これにより、ユーザーがどのブランチで作業していても、ushellを展開するのに役立ちます。

# コマンド実行

## バッチファイル

バッチファイルを使用して ushell をスクリプトから実行することができます。以下の例では、ナイトリービルドを作成する際に、Perforceに同期してビルドするコマンドを示します。以下のバッチファイルを作成することで、ナイトリービルドをスケジュールする際に活用することができます。

```auto
@echo off
# カレントディレクトリをプロジェクトに移動してushellを起動
# perforceにsyncしてプロジェクトをビルド
cd /d d:\branch\myuproj
call d:\ushell\ushell.bat
.p4 sync --all
.build editor
.build client ps4

```

## 複数コマンド

複数のコマンドを “&&” で連結することもできます。“&&” は前のコマンドが成功した場合に後続のコマンドを実行します。“&” を1つだけ指定すると、後続のコマンドも無条件に実行します。

```auto
.build editor && .cook game ps4

```

# 外部ターミナルからの起動

WindowsのターミナルやVSCodeのターミナルなど、他のターミナルから ushell を利用することもできます。以下はWindowsのコマンドプロンプトからushellを起動する際の例を示したものです。

```auto
%windir%\system32\cmd.exe /d/k d:\ushell\ushell.bat --project=d:\branch\myuproj\myuproj.uproject

```

これが必要なのは、デフォルトでは ushell.bat がエクスプローラー (またはショートカット) から明示的に起動されたかどうかを検出し、そうでない場合は非対話型スクリプトコンテキストで実行されていると想定するためです (Scriptingを参照)。

# 代替ホストシェル

上記の内容の多くはcmd.exeがホストシェルであることを前提としています。POSIX(Linux)ベースのプラットフォームであるBashまたはZsh、およびPowerShellなど、他のシェルもサポートしています。ushellのルートフォルダーには、これらの代替シェルを使用するためのスクリプトがあります。

 ![07.shell](https://d3kjluh73b9h9o.cloudfront.net/original/4X/3/8/9/3898a4a087f691613e640ff1165d82b85ef39338.png)

## PowerShell

PowerShellとの統合は、ushellをモジュールとしてインポートすることで機能します。PowerShellでは、モジュールをその名前と一致するディレクトリ内に格納する必要があるため、powerushellモジュールはushell\powerushell\powerushell.psm1のパスに格納されています。

PSModulePathにushellディレクトリを含めるように設定します（これは、$PROFILEファイル内で行うことができます）。

```auto
$env:PSModulePath = "$($env:PSModulePath);c:\path\to\ushell\"
Import-Module ushell

```

次にモジュールをインポートできます。これはプロファイル内で行うか、特定のターミナルセッションでushellセッションに入る際に行います。

```auto
Import-Module powerushell

```

oh-my-poshのようなPowerShellプロンプト強化ツールを使用している場合、ushellから環境変数を抽出してプロンプトやウィンドウタイトルなどに反映させることができます。ushell関連の環境変数は、以下のコマンドで一覧表示できます。

# Perforceの接続設定

.p4コマンドを実行してPerforceへアクセスする場合、Perforceへの接続設定をセットアップする必要がありますが、エンジンがUnreal EngineのブランチからPerforceを介して直接取得したようなケースにおいて、接続設定ファイル(.p4config.txt)はushell起動時に自動的に、ブランチの配下、プロジェクトの配下のディレクトリに作成されます。設定ファイルの内容は以下で示す例のようになっています。

```auto
P4CLIENT=Release-5.4
P4USER=Ken.Kuwano

```

必要に応じてサーバーの接続先を以下のような設定の追加で変更することもできます。

```auto
P4PORT=perforce-xxxx:1666

```

# カスタマイズ

## ショートカットのカスタマイズ

ホストシェルが標準のWindowsコマンドプロンプトの場合、ushellは$USERPROFILE/.ushell/hooks/startup.bat (例:C:\Users\ken.kuwano.ushell\hooks) をチェックして実行し、ユーザーがセッションを拡張できるようにします。以下は簡単な .bcr エイリアスを追加するサンプルスクリプトです。

```auto
@echo off
doskey .bcr=.uat BuildCookRun -- $*

```

 ![2024-08-27_10h49_24](https://d3kjluh73b9h9o.cloudfront.net/original/4X/2/b/3/2b34050c87c23c0e0cabdd3785c3715a811b1ebd.png)

これは自分専用のコマンドを準備する際に便利です。  
以下の例では、ショートカット用のコマンド(.sc1)を用意して、ショートカットコマンドを実行することによってwindowsプラットフォームでのクックを実行することを実現します。スタートアップのバッチファイル内にショートカットコマンドを登録しておくことで、ユーザーはすばやくコマンドを実行することができます。

**例: C:\Users\ken.kuwano.ushell\hooks\startup.bat**

```auto
@echo off
doskey .sc1=.cook windows

```

## ユーザーコマンドのカスタマイズ

### 概要

ushellはpythonスクリプトによって構築されており、エンジンが提供するデフォルトの機能に加えて、カスタマイズやコードを追加することで、プロジェクト独自のコマンドを追加することも可能です。

### ケーススタディ

ushellインスタンスは、"flow"と"channels"で構成されます。"flow"はシェルとコマンドを構築するためのフレームワークを提供し、"channels"はコマンドとツールのグループです。flowは、"channels/"フォルダ内のチャンネルを説明する既知のファイルを探してチャンネルを列挙します。エクスプローラ上では、チャンネルは以下のように見えるかもしれません。

```auto
channels/
  mychannel/
    describe.flow.py
    cmds/
      mycmd.py

```

describe.flow.py は、ushellがサブフォルダをチャンネルとして検出するために使用されます。このファイルには、チャンネルが追加するコマンドやそれらの呼び出し方が記載されています。また、ツールを説明し、取得するためのAPIや基本的なプラグインメカニズムも含まれています。以下は単一コマンドを持つ基本的なチャンネルの例です。

**例: C:\Users\ken.kuwano.ushell\channels\mychannel\describe.flow.py**

```auto
import flow.describe
#----------------------------------------------------------------------
# このチャンネルのコマンドは、"source()"メソッドと"invoke()"メソッドで構成されます。
# source()は、コマンドを実装している.pyファイルの場所とクラスを指定します。
# invoke()メソッドは、シェルからコマンドをどのように呼び出すかを設定します。
# たとえば、"d:\>.mycmd zippy"のように指定します。
my_cmd = flow.describe.Command()
my_cmd.source("cmds/mycmd.py", "MyCmdClass")
my_cmd.invoke("mycmd", "zippy")

#----------------------------------------------------------------------
# チャンネルについて、pip()メソッドは、PyPiリポジトリからpipをインストールするために使用できます。
# version()メソッドは、更新がプルされた際にチャンネルを無効化するために使用できます。
# parent()メソッドは、チャンネルをツリー状に構成し、コマンドをオーバーライドする際の継承順序を決定します。
# この設定により、開発環境内で柔軟かつ整理されたコマンド管理が可能になります。
channel = flow.describe.Channel()
channel.parent("mychannel")
channel.version("0")
#channel.pip(...)

```

コマンドは、flow.cmd.Cmdクラスを継承したクラスを作成し、docstringやflow.cmd.Arg/Optクラスを使用して説明を設定し、コマンドの引数を指定することで実装されます。前述の例のチャンネルに基づいて、mycmd.pyは次のように見えるかもしれません。

**例: C:\Users\ken.kuwano.ushell\channels\unreal\cmds\mycmd.py**

```auto
import flow.cmd

class MyCmdClass(flow.cmd.Cmd):
    """ This is the description of my command shown when --help is given """
    # """ ここには--"help"を実行した際に表示するコマンドの説明を記述 """

    # 引数やオプションのコマンド、パラメーターに関する説明
    argone = flow.cmd.Arg(str, "A positional argument that must be given")
    argtwo = flow.cmd.Arg("two", "A positional argument with a default value")
    option = flow.cmd.Opt(False, "An boolean optional argument; --option")
    param = flow.cmd.Opt(5, "An optional argument that takes a parameter; --param=6")

    # 引数の補完を追加するには、complete_[argname]メソッドを使用します。
    # 補完メソッドは、イテレータブルなものを返す必要があります
    # （そのため、ジェネレーター関数として実装することも可能です）。
    # これにより、引数の補完機能を実装し、ユーザーがコマンドを入力するときに
    # 適切な候補を提示することができます。
    def complete_argone(self, prefix):
        return ("zippy", "bungle", "george")

    # コマンドのエントリーポイントです。引数はself.argsに事前に設定されています。
    def main(self):
        if self.args.option:
            print(self.args.argument)

```

上記のように、describe.flow.pyとmycmd.pyを追加した結果、自分のオリジナルのコードを追加することができました。以下は.helpを実行した時に”.mycmd zippy”コマンドが新たに追加されており、実行することが出来るようになったことを示します。

 ![08.mycmd](https://d3kjluh73b9h9o.cloudfront.net/original/4X/e/8/f/e8fae04ade497add1204cc879993174baecbfa3c.png)

Unrealのブランチを扱うためには、unrealcmdモジュールがあり、これはflow.cmd.Cmdオブジェクトを専門に扱います。最も便利なメソッドは get\_unreal\_context() で、これを使ってbranch, project, target などにアクセスできます（詳細はchannels/unreal/core/pylib/unreal/\_context.pyで確認できます）。以下はその例です。

```auto
import unrealcmd

class MyUnrealCmdClass(unrealcmd.Cmd):
    """ This command works with an Unreal branch and/or project """
    # """ このコマンドはUnreal Branchと、またはプロジェクトで動作します """
    argument = unrealcmd.Arg(int, "...")
    optional = unrealcmd.Opt(False, "...")

    ue_context = self.get_unreal_context()
    if project := ue_context.get_project():
        print("Project name", project.get_name())

```

### その他

既存のコマンドに対して、呼び出し時に使用する単語と一致させることで挿入することができます。例えば、ケーススタディの例を my\_cmd.invoke(“build”, “editor”) に変更すると、.build editor を実行することで実際には MyCmdClass.main() が呼び出されます。その後、super().main() を呼び出すことで、エディタのビルドに必要なushellコマンドが実行されます。

また、チャンネルに関するいくつかの詳細もあります。例えば、チャンネルのpylibフォルダは PYTHON\_PATH に追加され、モジュールを定義すんることが可能です（これはコマンド間での共有に便利です）。チャンネルはブートプロセスやプロンプト構築にも参加できます。具体的な例はブートやプロンプトコマンドを持つチャンネルで確認できます。

チャンネル名はファイルシステムの場所から派生し、たとえば channels/geoffrey は geoffrey 、channels/mr/hayes は mr.hayes という名前になります。

## プロジェクトコマンドのカスタマイズ

現在プロジェクト内で独自のコマンドを用意して反映するカスタマイズはできませんが、前述の「ユーザーコマンドのカスタマイズ」を拡張して実現することが可能です。それにあたって、ユーザー独自のコマンドは Engine/Extras/ushell/channels/flow/nt/boot.bat 内の以下の場所で展開されているので、以下のパス %userprofile% を、プロジェクトで用意したパス(例:d:\projects\TestProject\Scripts)に置き換えることで、プロジェクトのスクリプトを展開するように変更することもできます。

**例:Engine/Extras/ushell/channels/flow/nt/boot.bat**

```auto
:: Make it easier for users to add their own channels
set _channels=%_channels% "%userprofile%\.ushell\channels"
if defined flow_channels_dir (
    set _channels=%_channels% %flow_channels_dir%
)

```

## ushell拡張の準備

現在チャンネルを追加する最良の方法は、クライアントスペックを作成し、//depot/usr/martin.ridgers/ushellをビューに含めるとともに、独自のチャンネルをchannel/Xフォルダにマッピングすることです。一方で、UnrealGameSync(UGS)でデプロイされたushellを拡張するのは現時点ではほぼ不可能で、その理由は以下の通りです。

1. 新しいバージョンが利用可能になるとUGSがデプロイメントを上書きする
2. flowがデプロイされた場所のchannels/サブフォルダのみを参照するため

しかし、ユーザーが任意のushellディストリビューションでチャンネルを追加できるように、この仕様は今後変更される予定です。

# UE4への統合

ushellスクリプトはUE5.3のブランチから導入されたものですが、ushellのコード(/Engine/Extras/ushell)を最新のブランチ ue5-main などからUE4の同じディレクトリにコピーするなどして配置することで、変更を加えることなく殆ど同じ方法で利用することが可能です。  
スクリプト自体がUE4で利用することも考慮したコードになっているため、UE4で利用する場合はプラットフォーム名を ”WindowsNoEditor” で指定するなど、少し考慮が必要ですが、ほぼほぼそのまま利用できるはずです。当然のことですが、zenシリーズなど、元々UE5に存在する機能、UE4に存在していない機能などは利用することができません。

---

<div class="post-metadata">

**Author:** ![Arata.Toki](https://d3kjluh73b9h9o.cloudfront.net/original/4X/2/8/5/28502927f1d97ba1051b3b47ccfe17233bf41ef0.png) [@Arata.Toki](https://forums.unrealengine.com/u/Arata.Toki)\
**Post date:** [December 6, 2024, 5:14am UTC](https://forums.unrealengine.com/t/unreal-engine-commandline-interface-ushell/1993246/3 "2024-12-06T05:14:38Z")

</div>

p4 のワークスペースをリンクフォルダ(ジャンクション)の中に作っていたりするとuprojectのファイルパスがワークスペースのディレクトリではなく､リンク元のパスになってしまうようですね

channels 内のスクリプトがPythonだったのでトライアンドエラーしやすく､修正が思ったより簡単で済みました 😀
