⤴️

[PowerShell]コマンド出力結果のインデントを上げて少し見やすくするFunction

2025/03/12に公開

コマンドを連続して実行した結果って見づらくありませんか。
Write系のコマンドレットと組み合せて出力結果を整えたい時に便利かなと思って作ってみました。

この記事のターゲット

  • PowerShellユーザーの方
  • 出力結果を少しだけ見やすくしたい方

コマンド出力結果のインデントを上げるFunction

コマンド出力結果のインデントを上げるFunction
function Write-IndentedOutput {
    [CmdletBinding()]
    param (
        # パイプラインまたは直接渡されたオブジェクト
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [System.Object]$InputObject,
        
        # インデントに使用するインデックス数 ※デフォルトは1インデント(1インデント = 半角スペース4つ分)
        [Parameter(Mandatory = $false)]
        [System.Int32]$IndentCount = 1
    )

    begin {
        # インデント文字列を作成
        $indentString = New-Object System.String(" " , ($IndentCount * 4))
        # パイプラインで受け取ったオブジェクトを格納するためのコレクションを初期化
        $collectedObjects = @()
    }

    process {
        # 各入力オブジェクトを順に配列に格納
        $collectedObjects += $InputObject
    }

    end {
        # 収集したオブジェクトが存在しない場合は何もしない
        if ($collectedObjects.Count -eq 0) {
            Write-Warning "入力オブジェクトが指定されていません。"
            return
        }

        try {
            $outputText = if ($collectedObjects -is [System.String[]]) {
                # すでに文字列(または多数の文字列)の場合は連結する
                $collectedObjects -join [Environment]::NewLine
            } else {
                # オブジェクト全体を文字列化して出力
                $collectedObjects | Out-String
            }

            # 改行ごとに文字列を分割し、それぞれの行にインデント文字列を付加して出力
            $lines = $outputText -split [Environment]::NewLine
            foreach ($line in $lines) {
                if ($line.Trim() -ne "") {
                    Write-Output "$indentString$line"
                }
            }
        } catch {
            Write-Error "出力処理中にエラーが発生しました: $($_.Exception.Message)"
        }
    }
}

自作Functionを使った実例

Before:普通にコマンドレットを実行した結果

そのままコマンドレットを実行した結果(Before)
PS C:\Users\XXXX> Get-Process

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    169       9     2152       3216              4216   0 AdminService
    136       7     2432       6572              8028   0 AggregatorHost
    277      17     8328       5080              4260   0 AGMService
    509      29    20232      23980       4.34  10104   1 ApplicationFrameHost
    133       8     1624       1988              4208   0 armsvc
    137       9     1320       2448              4224   0 bgsvcg
    468      36    16440       2268       0.22  11624   1 CalculatorApp

~~~~ (省略)~~~

PS C:\Users\XXXX>

After:自作Functionを使って実行結果のインデントを上げる

After - A:パイプラインで渡しインデントを上げた場合

実際に実行したコマンド
Get-Process | Write-IndentedOutput -IndentCount 1
実際の結果
PS C:\Users\XXXX> Get-Process | Write-IndentedOutput -IndentCount 1
    Handles NPM(K)  PM(K)  WS(K)   CPU(s)    Id SI ProcessName
    ------- ------  -----  -----   ------    -- -- -----------
        169      9   2152   2984           4216  0 AdminService
        136      7   2432   6392           8028  0 AggregatorHost
        277     17   8328   4580           4260  0 AGMService
        509     29  19500  24952     4.58 10104  1 ApplicationFrameHost
        133      8   1624   1944           4208  0 armsvc
        137      9   1320   2272           4224  0 bgsvcg
        468     36  16440   2152     0.22 11624  1 CalculatorApp

    ~~~~ (省略)~~~

PS C:\Users\XXXX>

After - B:引数で渡しインデントを上げた場合

実際に実行したコマンド群
$result = Get-Process
Write-IndentedOutput -InputObject $result -IndentCount 2
実際の結果
PS C:\Users\XXXX> $result = Get-Process
>> Write-IndentedOutput -InputObject $result -IndentCount 2
        Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName                                           
        -------  ------    -----      -----     ------     --  -- -----------                                           
            169       9     2152       3216              4216   0 AdminService                                          
            136       7     2432       6572              8028   0 AggregatorHost                                        
            277      17     8328       5080              4260   0 AGMService                                            
            509      29    20232      23980       4.34  10104   1 ApplicationFrameHost                                  
            133       8     1624       1988              4208   0 armsvc                                                
            137       9     1320       2448              4224   0 bgsvcg                                                
            468      36    16440       2268       0.22  11624   1 CalculatorApp 

        ~~~~ (省略)~~~

PS C:\Users\XXXX>

まとめ

  • 複数のコマンドレットやFunctionを実行する時に効果を発揮してくれそう
  • 課題としてはインデントを下げる方法も考慮した方が良いかも。

今回のコードで ValueFromPipeline = $true をはじめて使いました。
色々な場面で使えそうなパラメーターのオプションという事がわかったので今後、有効活用できればと思います!

関連記事

https://haretokidoki-blog.com/pasocon_powershell-startup/
https://zenn.dev/haretokidoki/articles/7e6924ff0cc960
https://zenn.dev/haretokidoki/articles/fb6830f9155de5

GitHubで編集を提案

Discussion