# バッチ設計書 72-lnkd.bat

## 概要

本ドキュメントは、lnkd.exe（コンソールショートカットファイルのプロパティダンプツール）のラッパーバッチ `lnkd.bat` のバッチ設計書である。

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

ビルドツリー（`%_NTTREE%`）に配置されたlnkd.exeを呼び出し、指定された.lnkファイル（Windowsショートカット）に格納されたコンソールプロパティ（V1プロパティおよびV2プロパティ）をダンプ表示する。lnkd.exeはIShellLink/IShellLinkDataList COMインターフェースを使用して、.lnkファイルからNT_CONSOLE_PROPSおよびV2拡張プロパティを読み取り、標準出力に表示する。

**業務上の目的・背景**：Windows Terminalおよびコンソールホスト（conhost.exe）の開発において、コンソールショートカット（.lnkファイル）に保存されたプロパティ設定を確認・デバッグする必要がある。コンソールの.lnkファイルには、ウィンドウサイズ、バッファサイズ、フォント設定、カラーテーブル、QuickEditモード、挿入モード、V2プロパティ（ForceV2、WrapText、FilterOnPaste、CtrlKeyShortcutsDisabled、LineSelection、WindowTransparency）などの情報が格納されている。本バッチはこれらの設定値を迅速に確認するための診断ツールとして使用される。

**バッチの実行タイミング**：開発者がコンソールショートカットのプロパティを確認する必要がある場合に手動で随時実行する。.lnkファイルの設定値のデバッグ時や、コンソールプロパティの移行・互換性テスト時に使用される。

**主要な処理内容**：
1. ビルドツリー（`%_NTTREE%`）のlnkd.exeにコマンドライン引数を透過的に渡して実行する
2. lnkd.exeが.lnkファイルを読み込み、V1プロパティ（NT_CONSOLE_PROPS：wFillAttribute、wPopupFillAttribute、dwScreenBufferSize、dwWindowSize、dwWindowOrigin、フォント情報、カーソルサイズ、FullScreen、QuickEdit、InsertMode、AutoPosition、HistoryBufferSize、NumberOfHistoryBuffers、HistoryNoDup、ColorTable[16]、CodePage）をダンプ
3. V2プロパティ（ForceV2、WrapText、FilterOnPaste、CtrlKeyShortcutsDisabled、LineSelection、WindowTransparency）をダンプ

**前後の処理との関連**：本バッチは独立した診断ツールであり、ビルドプロセス（bcz.cmd等）によってlnkd.exeがビルドされた後に使用可能となる。

**影響範囲**：読み取り専用の診断ツールであり、.lnkファイルの読み取りのみを行う。ファイルの変更やシステム設定への影響はない。

## バッチ種別

診断ツール / デバッグユーティリティ

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時 |
| 実行時刻 | 任意 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | 手動実行 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| ビルド環境 | `%_NTTREE%` 環境変数が設定されていること（razzle.cmdで設定される） |
| lnkd.exe | ビルドツリーにlnkd.exeが存在すること（ビルド済みであること） |
| Windows環境 | Windows OS上で実行する必要がある（COM APIを使用するため） |

### 実行可否判定

`%_NTTREE%\lnkd.exe` が存在すること。存在しない場合はコマンドが見つからないエラーとなる。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| %1 | ファイルパス | Yes | なし | ダンプ対象の.lnkファイルのパス |
| %2〜%9 | 文字列 | No | なし | lnkd.exeに透過的に渡される追加引数（現在のlnkd.exeは引数1のみ使用） |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| .lnkファイル | Windowsショートカットファイル | コンソールプロパティを含むショートカットファイル |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力（コンソール） | テキスト | V1プロパティおよびV2プロパティのダンプ表示 |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | 標準出力への表示（ファイル出力なし） |
| 出力先 | コンソール（標準出力） |
| 文字コード | Unicode（wprintf使用） |
| 区切り文字 | タブ区切り・ラベル付きテキスト |

## 処理フロー

### 処理シーケンス

```
1. バッチ実行
   └─ %_NTTREE%\lnkd.exe にコマンドライン引数（%1〜%9）を透過的に渡す
2. lnkd.exe内部処理
   ├─ 引数チェック（argc == 2の確認）
   ├─ ファイル存在確認（PathFileExists）
   ├─ COM初期化（CoInitialize）
   ├─ IShellLink COMオブジェクト作成
   ├─ IPersistFileで.lnkファイルをロード
   ├─ V1プロパティダンプ（IShellLinkDataList::CopyDataBlock）
   │   ├─ NT_CONSOLE_PROPS（wFillAttribute, dwScreenBufferSize等）
   │   └─ NT_FE_CONSOLE_PROPS（uCodePage）
   ├─ V2プロパティダンプ（IPropertyStore::GetValue）
   │   └─ ForceV2, WrapText, FilterOnPaste等
   └─ COM解放（CoUninitialize）
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[lnkd.exe 呼び出し]
    B --> C{引数チェック}
    C -->|引数なし| D[Usage表示]
    C -->|引数あり| E{ファイル存在確認}
    E -->|存在しない| F[エラー表示]
    E -->|存在する| G[COM初期化]
    G --> H[.lnkファイルロード]
    H --> I{ロード成功?}
    I -->|失敗| J[エラー表示]
    I -->|成功| K[V1プロパティダンプ]
    K --> L{コンソールプロパティあり?}
    L -->|なし| M[プロパティなしエラー]
    L -->|あり| N[V2プロパティダンプ]
    N --> O[COM解放]
    O --> P[バッチ終了]
    D --> P
    F --> P
    J --> P
    M --> P
```

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

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 戻り値 1 | ファイル不在 | 指定された.lnkファイルが存在しない | 正しいファイルパスを指定して再実行 |
| 戻り値 0 | 引数不足 | 引数が指定されなかった場合（Usage表示） | .lnkファイルのパスを引数として指定 |
| HRESULT | COMエラー | COM初期化やIShellLink操作の失敗 | HRESULTコードを確認し、COM環境を確認 |
| HRESULT | ロードエラー | .lnkファイルの読み込み失敗 | ファイルが破損していないか確認 |
| E_FAIL | プロパティなし | .lnkファイルにコンソールプロパティが含まれていない | コンソール用の.lnkファイルか確認 |

### リトライ仕様

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

### 障害時対応

エラーメッセージとHRESULTコードが標準出力に表示される。COMオブジェクトはRelease()で適切に解放される。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | 該当なし（読み取り専用） |
| コミットタイミング | 該当なし |
| ロールバック条件 | 該当なし |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1ファイル/回 |
| 目標処理時間 | 1秒未満 |
| メモリ使用量上限 | 最小限（COM操作のみ） |

## 排他制御

排他制御は不要。対象ファイルは読み取りアクセスのみ。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始メッセージ | 実行開始時 | ダンプ対象の.lnkファイルパス |
| プロパティ出力 | プロパティ読み取り成功時 | V1/V2プロパティの値一覧 |
| エラーメッセージ | エラー発生時 | エラー内容とHRESULTコード |
| Usageメッセージ | 引数不正時 | 使用方法 |

## 監視・アラート

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

## 備考

- 本バッチはビルドツリー環境（`%_NTTREE%`が設定された環境）での使用を前提としている
- lnkd.exeはWindowsの内部ビルドシステム（sources/NTMAKEENVベース）でビルドされるC++コンソールアプリケーションである
- V1プロパティはNT_CONSOLE_PROPS_SIG、V2プロパティはPKEY_Console_*プロパティキーで取得される
- East Asian環境のプロパティ（NT_FE_CONSOLE_PROPS: uCodePage）も対応している
- lnkd.exeが引数を1つのみ使用するが、バッチは%1〜%9まで透過的に渡す設計となっている
