⤴️
[PowerShell]コマンド出力結果のインデントを上げて少し見やすくするFunction
コマンドを連続して実行した結果って見づらくありませんか。
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
をはじめて使いました。
色々な場面で使えそうなパラメーターのオプションという事がわかったので今後、有効活用できればと思います!
関連記事
Discussion