はじめに
この連載では、Microsoftが提供している新しいシェル「Windows Power Shell」の使い方を解説します。今回は、関数をファイルに作成する方法、関数のプロファイルへの登録方法、パイプライン引数、begin/process/endについて説明します。
これまでの記事
- Windows PowerShell 入門(1)-基本操作編
- Windows PowerShell 入門(2)-基本操作編 2
- Windows PowerShell 入門(3)-スクリプト編
- Windows PowerShell 入門(4)-変数と演算子編
- Windows PowerShell 入門(5)-制御構文編
- Windows PowerShell 入門(6)-関数編1
対象読者
- Windows PowerShellでコマンドレット操作ができる方
- 何らかのプログラミング経験があればなお良い
必要環境
- Windows PowerShell
関数をファイルに作成する
PowerShellの関数をファイルに作成するには、テキストエディタがあれば十分です。
まずは、テキストエディタを開いて下記のように入力し、「MyFunction.ps1」として保存してください(説明の都合上、「C:\Work」に保存するものとします)。
function funcA { Write-Host "funcAです" }
では、この「MyFunction.ps1」にあるfuncA
を実行するにはどうしたらよいでしょうか?
1つの方法としては、この「MyFunction.ps1」に下記のように1行追加すると関数funcA
を呼び出すことになります。
function funcA { Write-Host "funcAです" } funcA #この行を追加することでfuncAを呼び出す
この「MyFunction.ps1」は function funcA { ~ }
までが関数の定義で、ファイルにこの部分が書かれているだけでは実行されません。関数を実行するには、最後に追加した行のように、関数を呼び出す必要があります。
「MyFunction.ps1」はfuncA
を呼び出すように1行追加したので、下記のようにすれば、funcA
が実行されることとなります(PowerShell入門(3) スクリプト編の「スクリプトファイルの実行とセキュリティ」を参照ください)。
PS C:\Work> ./MyFunction.ps1 funcAです
では、この関数をコマンドラインから、コマンドレットであるかのように関数名を指定するだけで呼び出すにはどうしたら良いでしょうか?
「C:\Work」の下に「MyFunction.ps1」がある状態で、関数名を記述して[Enter]を押すと、
PS C:\Work> funcA 用語 'funcA' は、コマンドレット、関数、操作可能なプログラム、またはスクリプト ファイルと して認識されません。用語を確認し、再試行してください。 発生場所 行:1 文字:5 + funcA <<<<
のようにエラーが表示され実行することができません。関数名を記述するだけではだめなようです。
では、いったいどのようにすればよいでしょうか?
実は、コマンドラインから直接関数を呼び出すには、関数名の先頭にglobal修飾子が必要です。「MyFunction.ps1」を下記のように修正してください。
function global:funcA { Write-Host "funcAです" }
そして関数を使用するために、下記のようにしてPowerShellに関数を登録します。
PS C:\Work> ./MyFunction.ps1 PS C:\Work>
これで準備はOKです。後は下記のように、コマンドラインで関数名を記述すれば実行されます。
PS C:\Work> funcA funcAです
このようにして登録を行った関数はGet-ChildItem
コマンドレットで確認することができます。
PS C:\Work> Get-ChildItem function: CommandType Name Definition ----------- ---- ---------- Function prompt 'PS ' + $(Get-Location) + $(if ($... Function Clear-Host $spaceType = [System.Management.A... : :長いので省略 : Function funcA Write-Host "funcAです"...
実は、この方法で登録した関数はPowerShellを終了すると無効になってしまいます。ということで、次はこの問題を解決する方法について説明したいと思います。