Hey, Scripting Guy!

Scripting Guys が皆さんの質問にお答えします

Hey, Scripting Guy!

TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。

詳細情報

Hey, Scripting Guy! カテゴリ別アーカイブ

Hey, Scripting Guy! 日付別アーカイブ

Hey, Scripting Guy! ダウンロード (英語)

Spacer

*

Windows PowerShell スクリプトに関数を追加する方法はありますか

Hey, Scripting Guy! Question

Scripting Guy さん、よろしくお願いします。Windows PowerShell スクリプトに関数を追加する方法はありますか。

-- TT

SpacerHey, Scripting Guy! AnswerScript Center

TT さん、こんにちは。今日は少し趣向を変えましょう。年に一度の Apple Cup と呼ばれるフットボールの試合でワシントン大学がワシントン州立大学を破ったという事実には触れません。いつもなら、このコラムの書き出しに "もってきそうな" 話題ですよね。しかし、Scripting Guys の上司がワシントン州立大学の卒業生であることがわかりました。彼と違って、私たちは UW が勝ったことにも、現在 Huskies が史上最高のシリーズ 64 勝 29 敗でリードしていることにも触れないことにします。WSU の学生だっただけでも不運なのに、傷口に塩をぬることもないでしょう。

その代わりに、今日はスクリプトのことだけを話すという、いつもとは "本当に" 違うことをしようと思います。Windows PowerShell スクリプトに関数を追加するにはどうすればいいでしょうか。ここでは、1 つの方法を紹介します。

function multiplynumbers 
    {$args[0] * $args[1]} 
 
multiplynumbers 446 282

ご覧のとおり、このプロセスはそれほど複雑ではありません。関数を作成するには、function キーワードの後ろに関数名を続けて呼び出します。ここでは、関数に multiplynumbers という名前を付けます。中かっこ内には、関数に実行させるコードを入れます。ここでは、かなりシンプルです。関数パラメータとして提供された 2 つの値を乗算するだけです。コード ブロックは次のようになります。

{$args[0] * $args[1]}

おっしゃるとおりです。$args 変数は通常、スクリプトを開始するときに指定するコマンド ライン引数を表します。しかし、ここでは、$args には 2 つの目的があります。変数を関数の外部で使用すると、この変数にはスクリプトの開始時に使用されるコマンド ライン引数が含まれます。しかし、関数内では、$args は関数の呼び出し時に指定するパラメータを表します。ご想像のとおり、$args[0] はセット内の第 1 パラメータを表し、$args[1] は第 2 パラメータを表します。少し紛らわしいですが、機能します。関数は渡されたパラメータを使用し、コマンド ライン引数も使用できます。

パラメータといえば、関数を呼び出すには、関数名の後ろにこれらのパラメータを続けて指定するだけです。この例では、「multiplynumbers」と入力し、その後ろに乗算する 2 つの数字を入力します。

multiplynumbers 446 282

これで、スクリプトによって次の結果がエコー バックされます。

125772

かなりクールでしょう。

ここで注意しなければならないのは、呼び出す前に関数を定義する必要があるということです。定義せずに、このスクリプトを実行したとしましょう。

multiplynumbers 446 282 
 
function multiplynumbers 
    {$args[0] * $args[1]}

上のスクリプトで、446 と 282 は乗算されるでしょうか。いいえ。それどころか、次のエラー メッセージが表示されます。

The term 'multiplynumbers' is not recognized as a cmdlet, function, operable program, or script file.  
Verify the term and try again. 
At C:\scripts\test.ps1:1 char:16 
+ multiplynumbers  <<<< 446 282

なぜエラー メッセージが表示されるのでしょうか。答えは簡単です。スクリプトが、まだ定義されていない関数を呼び出したからです。まず、スクリプトの最初に関数を定義してください。そうすればこのような問題は避けられます。

ここで、便利なトリックを紹介しましょう。スクリプトで関数を定義せずに、コマンド プロンプトで定義できます。次の例を試してみてください。Windows PowerShell コマンド プロンプトで次のように入力し、Enter キーを押します。

function multiplynumbers {$args[0] * $args[1]}

「それが何か」と言われそうですね。信じられないかもしれませんが、これで、スクリプト本体内で関数を定義せずに、"任意" のスクリプトから呼び出せる関数が作成されました。つまり、次の 1 行のスクリプトによって、値 125772 が返されます。

multiplynumbers 446 282

実際、コマンド プロンプトで上のコマンドを入力しても、正しい答えが返されます。試してみて結果をご覧になってください。

これはちょっと便利なトリックだと言いました。

もちろん、この関数は、現在の Windows PowerShell セッション中のみ有効です。multiplynumbers を Windows PowerShell に常時追加するには、関数を Windows PowerShell プロファイルに追加します。"それ" を行うには、「notepad $profile」と入力して、既定のプロファイルを呼び出し、関数呼び出しを追加し、プロファイルを保存します。

Cougars のメンバにもできるくらい簡単です。

これで準備はできましたね、TT さん。そうです。UW 同窓生の多くが、この機会に少しほくそ笑んだことでしょう。なにしろ、1 週間前のひどい試合を考えると、Huskies が Cougars と善戦し、勝利するなど考えもしなかったでしょうから。事実、いつもなら、「WSU の卒業生が望める最高の仕事は、食料品店の袋詰め作業者かファースト フード店員だ」などと言って、Huskies が Cougars をあざけるところです。しかし、今日はやめておきます。結局、Scripting Guys の上司は、食料品の袋詰めもしなければ、ファースト フード店でも働かない、Microsoft の管理職なのですから。

言うまでもなく、それが食料品の袋詰めほどいい仕事とは "とうてい" 言えません。でも、WSU の卒業生だったら、就ける仕事ならなんでもしなければならないですよね。

行け、Huskies!


ページのトップへページのトップへ