関数をプロファイルに登録する
PowerShellコンソール上で直接入力して作成した関数は、PowerShellコンソールを閉じてしまうと利用できなくなります。この問題は、関数をプロファイルに登録することで解決することができます。
まずは、プロファイルについて説明します。プロファイルはPowerShell起動時に1度だけ読み込まれる特別なスクリプトファイルです。このファイルは、あらかじめパスが決まっており、$Profileという自動変数に格納されています。
試しにコマンドラインで$Profileを確認してみましょう(表示されるパスはお使いの環境によって異なります)。
PS > $Profile C:\Users\HIRO\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
コマンドラインで下記のように入力し、メモ帳でプロファイルを開いてみましょう。
PS > Notepad $Profile
後は、下記のように入力して、先ほど確認したパス(ここでは「C:\Users\HIRO\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1」)に保存します。
function funcA
{
Write-Host "funcAです"
}
保存が終わったら、PowerShellを再起動し、funcAを実行してみましょう。
PS > funcA funcAです
このように、プロファイルに関数を記述すると、毎回PowerShellに関数を手動で登録する必要がなくなります(スクリプトの実行にはセキュリティ設定が必要ですので、動作しない場合は「関連記事 Windows PowerShell 入門(3)-スクリプト編」を参考に設定してください)。
しかし、多数の関数を「Microsoft.PowerShell_profile.ps1」に記述するのはメンテナンスが大変です。
これを解決する方法としてよこけんさんのサイトの「プロファイル活用」でスマートな方法が紹介されています(よこけんさんの承諾を得て掲載しております。よこけんさん、ありがとうございます)。実は、筆者自身もこの方法を採用していて、関数の管理が容易になります。
ただし、1点だけ注意してもらいたいことがあります。それは、プロファイルに記述する関数はスコープを指定しなくても問題ありませんが、ファイルに記述する関数はglobalスコープが必要であるということです。
先ほどのfuncAを「MyFunction.ps1」というファイルにグローバルスコープを付けて保存する場合は、
function global:funcA
{
Write-Host "funcAです"
}
とします。
パイプライン引数
PowerShellでの関数は、パイプラインからの値を受け取ることが可能です。パイプラインからの渡された値は$inputという自動変数に格納されます。
まずは、コンソールで下記の通り入力し、pipe-func1という関数をPowerShellに登録しましょう。
PS > function pipe-func1
>> {
>> foreach ($a in $input)
>> {
>> Write-Host $a
>> }
>> }
>>
この関数は、パイプラインで受け取った値をforeachで1つずつ取り出し表示するという単純な関数です。
次のようにして、この関数を実験してみてください。
PS > 1..10 | pipe-func1 1 2 3 4 5 6 7 8 9 10
1..10というのは、1から10までを表します(Windows PowerShell 入門(4)-変数と演算子の範囲演算子を参照ください)。結果としてこの関数は、$inputに1から10までの数値を受け取り、その値を表示します。
もう1つ実験してみましょう。
PS > "apple","banana","orange" | pipe-func1 apple banana orange
こちらは"apple","banana","orange"という3つの値が$inputに渡され、結果その値を表示します。
