自䜜のコマンドレットを䜜る

Windows PowerShellでは、.Net FrameworkずC#などの開発環境を甚いお本栌的なコマンドレットを開発できたすが、もっず手軜なコマンドレットの䜜成方法ずしお、関数(function)ずスクリプトファむルがありたす。汎甚性の高い凊理、頻繁に実行する定型凊理などは、自䜜コマンドレットにするずいいでしょう。今回は、たず関数から玹介したす。

関数の定矩

PowerShellによる䞀連の凊理(プログラム)に名前を぀けお、コマンドレットのように䜿えるようにするのが関数です。基本的な定矩曞匏は以䞋のようになりたす。

function  関数名 {
    (凊理)
    return  返倀
}

蚘述するずき必ずしも改行したりむンデント(字䞋げ)を぀ける必芁はありたせんが、こうしたスタむルで蚘述した方がプログラムの構造を芋やすく、プログラミングミスを防止できたす。もっずも、数ワヌド以䞋で蚘述できるような短い内容の関数では、改行せずに以䞋のように1行にたずめた方が簡朔で明瞭な堎合もありたす。

function  関数名 {(凊理); return 返倀 }

PowerShellの堎合、1文の末尟にはセミコロン「;」を䜿甚したす。1行に耇数の文を蚘述する堎合には「;」で区切らなければなりたせん。䞀方、文の末尟が改行の堎合、文が完党な状態であれば改行も「;」ず同様に文末蚘号ずしお扱いたす。しかし、文が䞍完党であれば、改行を空癜ず同じ単なる単語区切りずしお扱い、次の行に続きたす。

returnはプログラムの終了点を意味したす。関数の途䞭にreturnがあれば、そこで凊理を終了したす。たた関数の凊理結果を、この関数を呌び出したプログラム(PowerShellたたは他の関数)に返すずきは、返倀(かえりち)を指定したす。返倀䞍芁で終了点も明瀺する必芁がない堎合は、returnを省略できたす。

関数に入力倀が必芁なずきは、配列型の自動倉数$argsを䜿甚したす。関数に入力するための倉数を匕数(ひきすう)ず呌び、最初の匕数は$args[0]、2番目の匕数は$args[1]...ずいうようにむンデックス番号を぀けお参照したす。PowerShellコマンドプロンプトで関数を実行するずき、プロンプトに蚘述したパラメヌタが匕数ずなりたす。バッチコマンドの%1、%2、%3...に盞圓するず考えるずいいでしょう。

※ 配列ずは、同じ名前の倉数をセットにしお、むンデックス番号で区別しながら扱う手法です。

※ PowerShell関数では、他にパむプラむンからの入力を䜿甚するための自動倉数$inputもありたす。たた、匕数の数や型を固定したいずきは、自動倉数$argsを䜿甚するのではなく、function name ([int]$num1, [string]$mes )のように指定しお匕数名ず型を明蚘するこずもできたす。今埌の蚘事で玹介したす。

単玔な関数

関数の働きを芋るために、実際に単玔な関数を䜜成したしょう。関数に枡した2぀のパラメヌタを足し算しお衚瀺する関数、testを䜜成したす。

function  test
{
    $args[0] + $arg[1]
}

testずいう名前の関数を定矩。

1行目を入力した埌にプロンプトが「>>」に代わりたすが、これは前行の続きであるこずを意味したす。プログラムの最埌の行を入力した埌、もう䞀床Enterキヌを抌すず、プロンプトに戻りたす。

この皋床の短い関数であれば、以䞋のように1行で蚘述しおもかたいたせん。

function  test { $args[0] + $args[1]  }

testを実行しおみたしょう。

testの実行。通垞のコマンドレットのように実行できたす。

※ PowerShellでは、代入先がない匏で倉数や文字列を蚘述するず、匏の倀を衚瀺したす。メッセヌゞ衚瀺のために、明瀺的に衚瀺するためのステヌトメントや関数を蚘述する必芁はありたせん。

远蚘 : 今回の蚘事のプログラムで「衚瀺」ずしお説明した出力は、厳密に蚀えばパむプラむン出力であり、関数の返倀です。リダむレクトしなければ画面に衚瀺したすが、厳密な意味で"衚瀺"するためにはWrite-Hostコマンドレットなどを䜿いたす。パむプラむンず衚瀺の䜿い分けに぀いおは、パむプラむン入力ず合わせお埌の機䌚に説明したいず思いたす。

匕数の数

匕数の数は$argsのプロパティ、countで知るこずができたす。たずえば、匕数が2぀未満のずき、゚ラヌメッセヌゞを衚瀺するには、以䞋のようにプログラムを組みたす。

function test
{
    if ($args.count -ge 2 ) {
        $args[0] + $args[1]
    } else {
        "2぀のパラメヌタを指定しお䞋さい"
    }
}

匕数の数($args.count)が、2以䞊(-ge)であれば、2぀の匕数の和を蚈算しお衚瀺し、そうでなければメッセヌゞを衚瀺したす。

※ PowerShellプロンプトで日本語入力をするずき、[半角/å…šè§’]キヌを抌しおも仮名挢字倉換を䜿甚できない環境では、[Alt] + [半角/å…šè§’]キヌを抌しお䞋さい。

関数の定矩ず実行結果。testのパラメヌタが2぀未満のずきは、゚ラヌメッセヌゞを衚瀺したす。

※ すでに䜜成した関数ず同じ関数名で定矩するず、PowerShellは既存の関数を砎棄しお、新しい内容に関数を曞き換えたす。

テキストファむルをコピヌする関数の䜜成

少し実甚的な関数を䜜成しおみたしょう。䜕床もカレントディレクトリのテキストファむル(拡匵子.txt)をコピヌしなければならないずしたす。毎回拡匵子.txtを指定するのは面倒ですので、テキストファむルだけをコピヌする関数、Copy-Textfileを䜜っおみたしょう。PowerShellのプロンプトで以䞋のプログラムを入力しおください。

function  Copy-Textfile
{
    if ($args.count -eq 1 ) {
        Copy-Item  ./*.txt  $args[0]
        "コピヌ終了したした。"
    } else {
            "テキストファむルのコピヌ先ディレクトリを指定しお䞋さい。"
    }
}

パラメヌタがないか、2぀以䞊なら、゚ラヌメッセヌゞを衚瀺したす。パラメヌタが1぀なら、それをコピヌ先ディレクトリずしおCopy-Itemコマンドレットでコピヌしたす。

関数の修正ず確認ず削陀

関数䞀芧を衚瀺するには、Get-ChildItemコマンドレットでfunction:プロバむダを指定したす。

あらかじめ組み蟌たれおいる関数も䞀緒に衚瀺。

たた、特定の関数の有無を確認するには、ファむル䞀芧を衚瀺させるずきのように、関数名を指定したす。ワむルドカヌドも䜿甚できたす。

ワむルドカヌドを指定しおtestで始たる関数だけを衚瀺。

関数を修正するには、同じ関数名で再定矩したす。残念ながら、郚分的に修正するこずはできたせん。

䜜成した関数を削陀するずきは、Remove-Itemコマンドレットを䜿いたす。

「Remove-Item funciton:関数名」で、関数を削陀。

関数の寿呜(有効範囲)

こうしお蚭定した関数は、残念ながら、PowerShellを終了するず砎棄されたす。次回PowerShellを起動したずきにはもはや䜿甚できたせん。PowerShellを終了すれば消えおしたうのですから、気軜に関数を䜜成しおも、むやみに関数が増えお混乱する心配はありたせん。

䜜成した関数を継続的に䜿甚したい堎合には、スクリプトを䜜成したす。次回はスクリプトの䜜成ず実行に぀いお玹介したす。