# バッチ設計書 6-bx.ps1

## 概要

本ドキュメントは、ソリューションの metaproj ファイルを解析し、カレントディレクトリに対応する MSBuild ターゲット名を特定する PowerShell スクリプト `bx.ps1` のバッチ設計書である。

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

bx.ps1 は、OpenConsole ソリューションの .metaproj ファイル（MSBuild が生成する中間ファイル）を XML として解析し、カレントディレクトリに存在する .vcxproj または .wapproj ファイルに対応する MSBuild ターゲット名を特定して標準出力に出力する PowerShell スクリプトである。

**業務上の目的・背景**：bcz.cmd の exclusive モード（特定プロジェクトのみのビルド）において、MSBuild に渡すターゲット名を自動的に解決するために使用される。MSBuild のソリューションビルドでは、個別プロジェクトのビルドターゲット名はソリューション内での参照名に基づいており、単純にプロジェクトファイル名から推測できない。このスクリプトにより、開発者はターゲット名を手動で調べる必要なく、カレントディレクトリのプロジェクトをビルドできる。

**バッチの実行タイミング**：bcz.cmd の exclusive モード実行時に自動的に呼び出される。直接手動実行することも可能。

**主要な処理内容**：
1. カレントディレクトリから .vcxproj または .wapproj ファイルを検索
2. OpenConsole.slnx.metaproj ファイルを XML として読み込み
3. metaproj 内の Target 要素から、プロジェクトファイルパスに一致する MSBuild 条件を検索
4. まず `.metaproj` 拡張子付きの条件で検索し、見つからなければ拡張子なしで再検索
5. `:Clean` や `:Rebuild` などのサフィックスを持たないベースターゲット名を抽出
6. ターゲット名を標準出力に出力

**前後の処理との関連**：bcz.cmd の :get_project 関数から呼び出される。事前に `MSBuildEmitSolution=1` を設定した MSBuild 実行により metaproj ファイルが生成されている必要がある。出力されたターゲット名は bcz.cmd が MSBuild の /t オプションに使用する。

**影響範囲**：ファイルシステムや環境変数への変更はない。標準出力にターゲット名を出力するのみ。

## バッチ種別

コード解析・情報取得

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（bcz.cmd exclusive モード実行時） |
| 実行時刻 | 任意 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | bcz.cmd からの自動呼び出し、または手動実行 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| PowerShell | PowerShell が利用可能であること |
| プロジェクトファイル | カレントディレクトリに .vcxproj または .wapproj ファイルが存在すること |
| metaproj ファイル | OpenConsole.slnx.metaproj が OPENCON ディレクトリに存在すること（MSBuildEmitSolution=1 で事前生成） |
| OPENCON 環境変数 | razzle.cmd によりプロジェクトルートが設定されていること |

### 実行可否判定

カレントディレクトリに .vcxproj/.wapproj が存在しない場合は、終了コード -1 で即座に終了する。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| （なし） | - | - | - | コマンドライン引数は受け取らない |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| カレントディレクトリの *.vcxproj / *.wapproj | MSBuild プロジェクトファイル | プロジェクトのフルパスを取得するために使用 |
| $env:OPENCON\OpenConsole.slnx.metaproj | XML | ソリューション内のプロジェクトターゲット定義 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力（stdout） | テキスト | MSBuild ターゲット名（例: "Conhost\Server"） |
| 終了コード | 整数 | 0: 成功、-1: プロジェクトファイル未検出 |

### 出力ファイル仕様

ファイル出力はない。標準出力のみ。

## 処理フロー

### 処理シーケンス

```
1. カレントディレクトリのプロジェクトファイル検索
   └─ Get-ChildItem で *.vcxproj, *.wapproj を検索
2. プロジェクトファイル存在チェック
   └─ 見つからない場合は exit -1
3. プロジェクトファイルのフルパスを取得
   └─ $projects.FullName で絶対パスを取得
4. metaproj ファイルの読み込み
   └─ $env:OPENCON\OpenConsole.slnx.metaproj を XML として読み込み
5. MSBuild 条件文字列の構築（.metaproj 拡張子付き）
   └─ "'%(ProjectReference.Identity)' == '$projectPath.metaproj'"
6. ターゲットのフィルタリング（第1回）
   └─ Target 要素の MSBuild.Condition が条件文字列と一致するものを抽出
7. 未検出の場合、拡張子なしで再検索（第2回）
   └─ "'%(ProjectReference.Identity)' == '$projectPath'" で再フィルタリング
8. サフィックスなしターゲットの抽出
   └─ MSBuild 要素に Targets プロパティを持たないターゲットのみ残す
9. ターゲット名の出力
   └─ Write-Host でターゲット名を標準出力に出力
```

### フローチャート

```mermaid
flowchart TD
    A[スクリプト開始] --> B[カレントディレクトリで vcxproj/wapproj 検索]
    B --> C{プロジェクトファイル存在?}
    C -->|いいえ| D[exit -1]
    C -->|はい| E[プロジェクトのフルパス取得]
    E --> F[metaproj ファイルを XML で読み込み]
    F --> G[.metaproj 拡張子付き条件でターゲット検索]
    G --> H{ターゲット検出?}
    H -->|はい| J[サフィックスなしターゲット抽出]
    H -->|いいえ| I[拡張子なし条件でターゲット再検索]
    I --> J
    J --> K[ターゲット名を Write-Host で出力]
    K --> L[exit 0]
```

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

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

該当なし。本バッチはデータベース操作を行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| -1 | プロジェクト未検出 | カレントディレクトリに vcxproj/wapproj がない場合 | vcxproj が存在するディレクトリに移動して再実行 |

### リトライ仕様

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

### 障害時対応

metaproj ファイルが存在しない場合は、bcz.cmd の :get_project 関数で `MSBuildEmitSolution=1` が設定されて MSBuild が実行されるため、通常は自動生成される。手動実行時に metaproj がない場合は、先に MSBuildEmitSolution=1 を設定して MSBuild を実行する。

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

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

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1回/ビルド |
| 目標処理時間 | 1秒未満（XML 解析のみ） |
| メモリ使用量上限 | metaproj ファイルサイズに依存（通常数MB以下） |

## 排他制御

同時実行の制御は不要。読み取り専用の処理のため。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 結果出力 | 処理完了時 | ターゲット名（Write-Host） |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 該当なし | - | - |

## 備考

- 呼び出し元の bcz.cmd では、stderr を NUL にリダイレクトして呼び出される（`2^> NUL`）。
- metaproj ファイル内のプロジェクト参照には `.metaproj` 拡張子が付くものと付かないものがあるため、2段階の検索を行っている。
- `:Clean` や `:Rebuild` といったサフィックスを持つターゲットを除外するために、MSBuild 要素に Targets プロパティを持たないものだけをフィルタリングしている。
- bcz.cmd から呼び出される際は `-NoProfile -ExecutionPolicy Bypass -NonInteractive` オプション付きで実行される。
