[備忘録]  PowerShellで長い出力を分割して読む：Out-Host -Pagingの使い方

PowerShellでコマンドを実行した際、出力が長すぎて画面からはみ出してしまい、最初の部分が見えなくなってしまった経験はありませんか？そんな時に便利なのが`Out-Host -Paging`コマンドです。

複数の標準出力、ファイルの内容などコマンド経由でページごとに分割してか確認したいときに使えます。

![powershell-paging-diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/6d23a823-71c6-4e35-8ea8-083a37cda03f.png)

## Out-Host -Pagingとは

`Out-Host -Paging`は、PowerShellの出力を1画面ずつ表示できるようにするコマンドです。長い出力を「ページ」単位に分割し、ユーザーが任意のタイミングで次のページに進むことができます。

## 基本的な使い方

### 構文
```powershell
コマンド | Out-Host -Paging
```

### 実例

#### 1. プロセス一覧をページ分けして表示
```powershell
Get-Process | Out-Host -Paging
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/a64958a4-8bc4-4b13-9f6b-d54b9db38028.png)

#### 2. ファイル一覧をページ分けして表示
```powershell
Get-ChildItem -Recurse | Out-Host -Paging
```

#### 3. イベントログをページ分けして表示
```powershell
Get-EventLog -LogName System -Newest 100 | Out-Host -Paging
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/028e11da-ae16-4a59-845a-c08d52a2e24b.png)

## 操作方法

`Out-Host -Paging`を使用すると、画面下部に以下のようなプロンプトが表示されます：


この状態で使用できるキー操作：

| キー | 動作 |
|------|------|
| **Space** | 次のページを表示 |
| **Enter** | 次の行を表示 |
| **q** | 表示を終了 |

備忘録: 自分の環境だとqだとエラーが発生したので、ctrl + cで終了している。

## 実践的な活用例

### 1. ログファイルの内容確認
```powershell
Get-Content "C:\Logs\application.log" | Out-Host -Paging
```

### 2. コマンド履歴の確認
```powershell
Get-History | Out-Host -Paging
```

### 3. 大量のオブジェクトプロパティの確認
```powershell
Get-WmiObject -Class Win32_ComputerSystem | Format-List * | Out-Host -Paging
```

### 4. CSVファイルの内容確認
```powershell
Import-Csv "data.csv" | Format-Table | Out-Host -Paging
```

## 類似コマンドとの比較

### More コマンドとの違い

従来のWindowsコマンドプロンプトの`more`コマンドと似ていますが、PowerShellオブジェクトをそのまま扱えるのが大きな違いです。

```powershell
# Moreコマンド（テキストのみ）
Get-Process | Out-String | more

# Out-Host -Paging（PowerShellオブジェクト対応）
Get-Process | Out-Host -Paging
```

### Out-GridViewとの使い分け

- `Out-Host -Paging`: コンソール上でページ分けして表示
- `Out-GridView`: 別ウィンドウでGUIテーブル表示

```powershell
# コンソール上でページ分け
Get-Process | Out-Host -Paging

# GUIウィンドウで表示
Get-Process | Out-GridView
```

## Tips & Tricks

### 1. 特定の条件でフィルタしてからページ分け
```powershell
Get-Process | Where-Object {$_.CPU -gt 10} | Out-Host -Paging
```

### 2. ソートしてからページ分け
```powershell
Get-ChildItem | Sort-Object Length -Descending | Out-Host -Paging
```

### 3. Select-Objectと組み合わせて必要な情報のみ表示
```powershell
Get-Process | Select-Object Name, CPU, WorkingSet | Out-Host -Paging
```

## 注意点とトラブルシューティング

### NotImplementedExceptionエラーについて

一部の環境（特にPowerShell ISEやVS Code統合ターミナルなど）では、以下のようなエラーが発生する場合があります：

```
out-lineoutput : メソッドまたは操作は実装されていません。
System.NotImplementedException,Microsoft.PowerShell.Commands.OutLineOutputCommand
```

このエラーが発生した場合の対処法：

#### 1. 通常のPowerShellコンソールを使用
Windows PowerShellまたはPowerShell Coreのコンソールで直接実行してください。

#### 2. 代替手段を使用

**More コマンドを使用：**
```powershell
Get-Process | Out-String | more
```

**Out-GridView を使用（GUI表示）：**
```powershell
Get-Process | Out-GridView
```

**Format-Table で幅を調整：**
```powershell
Get-Process | Format-Table -AutoSize | Out-String -Width 120
```

### その他の注意点

- `Out-Host -Paging`はパイプラインの終端で使用する必要があります
- 出力が既に画面に収まる場合は、ページング表示にはなりません
- リモートセッションでは動作が制限される場合があります
- PowerShell ISEでは正常に動作しない場合があります

## まとめ

`Out-Host -Paging`は、対応環境では長い出力を扱う際の非常に便利なコマンドです。特に以下の場面で威力を発揮します：

- 大量のログファイルを確認する時
- システム情報を詳細に調べる時  
- データベースやCSVの内容を確認する時

ただし、環境によっては動作しない場合があるため、その際は`more`コマンドや`Out-GridView`などの代替手段を活用しましょう。PowerShellでの作業効率を向上させるために、環境に応じて適切なページング手法を選択することが重要です！

moreコマンド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/7eb5c0cd-5ec1-440e-b476-0142e23bb118.png)

Out-GridView
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/e9b222c0-f3c7-457d-ae1a-f330776fb786.png)


## 参考リンク

- [Microsoft公式ドキュメント - Out-Host](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/out-host)
- [PowerShell Gallery](https://www.powershellgallery.com/)