# バッチ設計書 33-opencon.cmd

## 概要

本ドキュメントは、OpenConsoleプロジェクトにおけるビルド成果物 `OpenConsole.exe` を一時ディレクトリにコピーして起動するバッチスクリプト `opencon.cmd` の設計仕様を記載する。

### 本バッチの処理概要

本バッチは、ビルドで生成された `OpenConsole.exe` および関連バイナリを一時ディレクトリにコピーし、コピー先から `OpenConsole.exe` を起動する。複数のリビジョンを同時にデバッグできるよう、ランダムなサブディレクトリ名を使用する。

**業務上の目的・背景**：開発者がビルド成果物のOpenConsole.exeを手軽にテスト実行するためのユーティリティである。ビルドディレクトリから直接実行するとファイルロックの問題やリビルド時の競合が発生するため、一時ディレクトリにコピーしてから起動することでこれらの問題を回避する。また、ランダムなディレクトリ名を使用することで、異なるリビジョンのバイナリを同時に起動してデバッグ・比較テストを行うことが可能となる。

**バッチの実行タイミング**：開発者が手動で随時実行する。ビルド完了後にOpenConsole.exeの動作確認を行う際に使用される。

**主要な処理内容**：
1. ビルド成果物ディレクトリにOpenConsole.exeが存在するか確認する
2. ランダムな名前の一時サブディレクトリを生成する
3. OpenConsole.exe、conhost.exe（OpenConsole.exeのコピー）、VtPipeTerm.exe、Nihilist.exe、console.dllを一時ディレクトリにコピーする
4. コピー先のOpenConsole.exeを引数付きで起動する（startコマンド使用）

**前後の処理との関連**：本バッチは `razzle.cmd`（No.1）により設定される環境変数（`%OPENCON%`, `%ARCH%`, `%_LAST_BUILD_CONF%`）を前提とする。また、`bcz.cmd`（No.2）や `bz.cmd`（No.4）等のビルドバッチでビルドが完了していることが必要。`openps.cmd`（No.34）および `openbash.cmd`（No.35）は本バッチのラッパーである。

**影響範囲**：`%TEMP%` ディレクトリ配下にバイナリのコピーが作成される。起動されたOpenConsole.exeは独立したプロセスとして実行される。

## バッチ種別

実行・起動

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時 |
| 実行時刻 | - |
| 実行曜日 | - |
| 実行日 | - |
| トリガー | 手動（開発者がビルド後に実行） |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| 環境変数 `%OPENCON%` が設定済み | OpenConsoleプロジェクトのルートディレクトリパス |
| 環境変数 `%ARCH%` が設定済み | ビルドアーキテクチャ（x64等） |
| 環境変数 `%_LAST_BUILD_CONF%` が設定済み | 最後にビルドした構成（Debug/Release等） |
| OpenConsole.exeがビルド済み | `%OPENCON%\bin\%ARCH%\%_LAST_BUILD_CONF%\OpenConsole.exe` が存在すること |

### 実行可否判定

`%OPENCON%\bin\%ARCH%\%_LAST_BUILD_CONF%\OpenConsole.exe` の存在チェックを行い、存在しない場合はエラーメッセージを出力して終了する。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| %* | 文字列 | No | なし | OpenConsole.exeに渡される引数（任意） |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| `%OPENCON%\bin\%ARCH%\%_LAST_BUILD_CONF%\OpenConsole.exe` | EXE | メインバイナリ |
| `%OPENCON%\bin\%ARCH%\%_LAST_BUILD_CONF%\VtPipeTerm.exe` | EXE | VTパイプターミナル |
| `%OPENCON%\bin\%ARCH%\%_LAST_BUILD_CONF%\Nihilist.exe` | EXE | Nihilistユーティリティ |
| `%OPENCON%\bin\%ARCH%\%_LAST_BUILD_CONF%\console.dll` | DLL | コンソールライブラリ |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| `%TEMP%\OpenConsole\%_r%\` | ディレクトリ | コピー先の一時ディレクトリ |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | OpenConsole.exe, conhost.exe, VtPipeTerm.exe, Nihilist.exe, console.dll |
| 出力先 | `%TEMP%\OpenConsole\{ランダム値}\` |
| 文字コード | バイナリ |
| 区切り文字 | - |

## 処理フロー

### 処理シーケンス

```
1. OpenConsole.exeの存在チェック
   └─ %OPENCON%\bin\%ARCH%\%_LAST_BUILD_CONF%\OpenConsole.exe
2. 存在しない場合 → エラーメッセージ出力して終了
3. setlocalで環境変数のローカルスコープ開始
4. ランダム値を生成（%random%）
5. コピー先ディレクトリパスを構築
   └─ %TEMP%\OpenConsole\%_r%
6. 各バイナリをxcopyでコピー
   ├─ OpenConsole.exe → OpenConsole.exe
   ├─ OpenConsole.exe → conhost.exe（別名コピー）
   ├─ VtPipeTerm.exe → VtPipeTerm.exe
   ├─ Nihilist.exe → Nihilist.exe
   └─ console.dll → console.dll
7. startコマンドでOpenConsole.exeを起動
   └─ 渡された引数（%*）を付加
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B{OpenConsole.exe存在?}
    B -->|なし| C[エラーメッセージ出力]
    C --> D[終了]
    B -->|あり| E[ランダム値生成]
    E --> F[一時ディレクトリにバイナリコピー]
    F --> G[start OpenConsole.exe %*]
    G --> H[バッチ終了]
```

## データベース操作仕様

### 操作別データベース影響一覧

データベース操作はない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ファイル不在 | OpenConsole.exeがビルドディレクトリに存在しない | ビルドを実行してからリトライ |
| - | 環境変数未設定 | %OPENCON%, %ARCH%, %_LAST_BUILD_CONF% が未設定 | razzle.cmdを実行して環境変数を設定 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | - |
| リトライ対象エラー | - |

### 障害時対応

OpenConsole.exeが存在しない場合は、ビルドを実行して成果物を生成する。

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | なし |
| コミットタイミング | - |
| ロールバック条件 | - |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 5ファイルのコピー |
| 目標処理時間 | 数秒以内 |
| メモリ使用量上限 | 特に定義なし |

## 排他制御

ランダムなサブディレクトリ名（`%random%`）を使用するため、同時実行しても互いのコピー先が競合しない設計となっている。これにより、異なるリビジョンのバイナリを同時にデバッグすることが可能。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 起動メッセージ | バイナリ起動時 | "Launching `%TEMP%\%copy_dir%\OpenConsole.exe %*`..." |
| エラーメッセージ | ファイル不在時 | "Could not locate the OpenConsole.exe in ..." |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| - | - | - |

本バッチはローカル開発ツールであり、監視・アラートの対象外。

## 備考

- `setlocal` を使用して環境変数のスコープをローカルに限定している
- OpenConsole.exeをconhost.exeとしてもコピーしている。これはWindowsがconhost.exeという名前のバイナリを特別に扱う場合があるため
- xcopyの出力はnulにリダイレクトされ、コピー進捗は表示されない
- `start` コマンドで起動するため、バッチの終了を待たずにOpenConsole.exeが別プロセスとして起動する
- openps.cmd（No.34）およびopenbash.cmd（No.35）のベースとなるバッチ
- ソースファイル: `tools/opencon.cmd`
