PowerShell スクリプトで標準入力から受け入れるとかあまりやらないので、備忘録として残しておきます。
使い方などなどはソースを見てくださいw<おい!
ポイントは[CmdletBinding()]
で明示してやらないと受け入れることができないというところかな。
使い方はこんな感じ。オプションは必要な時だけつければいい格好。
cat ".\Sample.json" | .\StdinPipe.ps1 -RequireParam "必須パラメータ"
# StdinPipe.ps1 [-InputObject] <string[]> [-ReqireParam] <string> [[-OptionalParam] <string>] [<CommonParameters>]
[CmdletBinding()]
param (
[parameter(Mandatory=$true,ValueFromPipeline=$true,HelpMessage="標準入力か引数で受け取るデータ")]
[string[]]$InputObject,
[parameter(Mandatory=$true,ValueFromPipeline=$false,HelpMessage="必須パラメータ")]
[string]$ReqireParam,
[parameter(Mandatory=$false,ValueFromPipeline=$false,HelpMessage="オプションパラメータ")]
[string]$OptionalParam
)
begin{
# 初期化処理等はここに書く
Set-StrictMode -Version Latest
[string[]]$inputParam = @()
# 関数はここに記述して置くと分離できて見やすいのかな?
function Func( [Object]$dispParam ){
$dispParam | Out-String
}
}
process{
Write-Verbose "Called-`"$InputObject`""
$inputParam += $InputObject
}
end{
# ここをメイン関数みたいに使うのがすっきりする
# $inputParam は sting[]なのでそのままでは Write-Verbose出来ないため文字列に変換してやる
# パターン1
Write-Verbose "`$stringValue = Func `$inputParam; Write-Verbose `$stringValue"
$stringValue = Func $inputParam
Write-Verbose $stringValue
# パターン2
Write-Verbose "Write-Verbose `"`$inputParam`""
Write-Verbose "$inputParam"
# さらにパイプをつなぐような場合は、つぎに渡すオブジェクトを return。仕様は明確に!
return $inputParam
# バッチファイルのように失敗を明確化して返したい場合はexitを呼び出してやる($LASTEXITCODEで値が取れるようになる)
# exit 数値
}
おまけ
Write-Verbose は文字列しか受け取ってくれないので、複数行の場合はあらかじめOut-String
するか、""
でくくってやらないとだめ。