質問: ### 前提・実現したいこと Powershellコマンドレットの結果をPowershellスクリプトの引数として渡す方法がわかりません。 よい方法をご存知でしたら教えて頂けないでしょうか。 具体的にはログファイルを加工するPowershellスクリプトがあり、このスクリプトは引数なしで実行するとスクリプトがあるディレクトリ内のログを、第一引数でディレクトリパスを渡すと引数のディレクトリ内のログを加工します。 加工対象のディレクトリが複数あるため、複数ディレクトリを処理できるように拡張しようと思うのですが、折角のPowershellなのでパイプ渡しできた方がエレガントと考えましたが実装方法がわかりませんんでした。 おそらく標準入力をうまく扱えればできるのだとは思いますが・・・ ``` pwd > C:\temp .\convert_log.ps1 # C:\temp内のログをコンバート .\convert_log.ps1 "C:\temp\archive" # C:\temp\archive内のログをコンバート # やりたいことは以下のイメージ # 2016-08で始まるディレクトリを対象にconvert_log.ps1を実行したい Get-ChildItem -Recurse -Directory | Where-Object {$_.name -match "^2016-08"} | .\convert_log.ps1 ``` ### 試したこと こちらのサイトを参考にさせて頂きましたが、Powershell関数やC#であれば実現できる模様 http://winscript.jp/powershell/253 http://blog.shibata.tech/entry/2015/06/28/093743
回答: こんにちは。 PowerShellではスクリプトファイルの先頭で`param`を定義することで名前付き引数を定義できます。 細かい話はこちらを参照してください。 そして、パイプラインで引数を受け取るには引数に`ValueFromPipeline`属性を付ける必要があります。 簡単な例を出すと、`convert_log.ps1`の先頭を以下の様にしてみてください。 `$Directory`引数にパイプラインから流れてきた値がセットされるはずです。 ``` param( [parameter(ValueFromPipeline=$true)] [IO.DirectoryInfo]$Directory ) # あとは実際の処理を適当に書く Write-Output $Directory.FullName ```