# バッチ設計書 37-echokey.cmd

## 概要

本ドキュメントは、OpenConsoleプロジェクトにおいてビルド成果物の `conechokey.exe` を使用してキー入力のエコーテストを行うバッチスクリプト `echokey.cmd` の設計仕様を記載する。

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

本バッチは、ビルドで生成された `OpenConsole.exe` と `conechokey.exe` を一時ディレクトリにコピーし、conechokey.exeを実行してキー入力のエコーテストを行う。キーボード入力がコンソールでどのように処理されるかをデバッグ・確認するためのツールである。

**業務上の目的・背景**：コンソールアプリケーションの開発において、キー入力の処理は重要な機能の一つである。特にVTシーケンスやIME入力、特殊キーの処理が正しく行われているかを確認する必要がある。conechokey.exeはキー入力をそのままエコーバック（画面に表示）するツールであり、入力処理のデバッグに使用される。

**バッチの実行タイミング**：開発者が手動で随時実行する。キー入力処理の動作確認やデバッグ時に使用される。

**主要な処理内容**：
1. ビルド成果物ディレクトリに `OpenConsole.exe` と `conechokey.exe` が存在するか確認する
2. ランダムな名前の一時サブディレクトリを生成する
3. `OpenConsole.exe` と `conechokey.exe` を一時ディレクトリにコピーする
4. conechokey.exeを実行する（startコマンドではなく直接実行）

**前後の処理との関連**：`opencon.cmd`（No.33）と同様に `razzle.cmd`（No.1）の環境変数を前提とする。ビルドバッチによるビルド完了が必要。

**影響範囲**：`%TEMP%` ディレクトリ配下にバイナリのコピーが作成される。conechokey.exeが同期的に実行される（バッチの終了はconechokey.exeの終了を待つ）。

## バッチ種別

実行・起動

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時 |
| 実行時刻 | - |
| 実行曜日 | - |
| 実行日 | - |
| トリガー | 手動（開発者がデバッグ時に実行） |

## 実行条件

### 前提条件

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

### 実行可否判定

`OpenConsole.exe` と `conechokey.exe` の両方の存在チェックを行い、いずれかが存在しない場合はエラーメッセージを出力して終了する。

## 入力仕様

### 入力パラメータ

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

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| `%_last_build%\OpenConsole.exe` | EXE | メインバイナリ |
| `%_last_build%\conechokey.exe` | EXE | キーエコーテストツール |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| `%TEMP%\OpenConsole\%_r%\` | ディレクトリ | コピー先の一時ディレクトリ |
| 標準出力 | テキスト | キー入力のエコー結果 |

### 出力ファイル仕様

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

## 処理フロー

### 処理シーケンス

```
1. setlocalで環境変数のローカルスコープ開始
2. ビルド成果物パスの構築
   └─ %OPENCON%\bin\%ARCH%\%_LAST_BUILD_CONF%
3. OpenConsole.exeの存在チェック
   └─ 存在しない場合 → エラーメッセージ出力して終了
4. conechokey.exeの存在チェック
   └─ 存在しない場合 → エラーメッセージ出力して終了
5. ランダム値を生成（%random%）
6. コピー先ディレクトリパスを構築
7. 各バイナリをxcopyでコピー
   ├─ OpenConsole.exe → OpenConsole.exe
   └─ conechokey.exe → conechokey.exe
8. conechokey.exeを直接実行（同期実行）
   └─ 渡された引数（%*）を付加
```

### フローチャート

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

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

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

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

## エラー処理

### エラーケース一覧

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

### リトライ仕様

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

### 障害時対応

バイナリが存在しない場合は、ビルドを実行して成果物を生成する。

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

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

## パフォーマンス要件

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

## 排他制御

ランダムなサブディレクトリ名（`%random%`）を使用するため、同時実行しても互いのコピー先が競合しない設計となっている。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| エラーメッセージ | OpenConsole.exe不在時 | "Could not locate the OpenConsole.exe in %_last_build%..." |
| エラーメッセージ | conechokey.exe不在時 | "Could not locate the conechokey.exe in %_last_build%..." |

## 監視・アラート

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

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

## 備考

- opencon.cmd等とは異なり、`start` コマンドではなく直接 `conechokey.exe` を実行する。これはキー入力のエコーテストのため、現在のコンソールウィンドウで同期的に実行する必要があるため。
- ソースコード内にコメントアウトされた行（`rem %_last_build%\conechokey.exe %*` および `rem start %TEMP%\%copy_dir%\OpenConsole.exe %TEMP%\%copy_dir%\conechokey.exe %*`）があり、以前はOpenConsole.exe経由での起動も検討されていた形跡がある。
- ソースファイル: `tools/echokey.cmd`
