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

 

 

関連情報

Hey, Scripting Guys! のその他の記事もチェックしてください。

Hey, Scripting Guy! Windows PowerShell 関数をスクリプトで再利用する方法はありますか

 

概要: コードを再利用することで Windows PowerShell スクリプトを迅速に作成できます。Ed Wilson が、コードの再利用のベスト プラクティスについて説明します。


 

Scripting Guy さん、よろしくお願いします。私は Windows PowerShell スクリプトを頻繁に作成していますが、別のスクリプトで作成した関数を使用する必要がある場合、その関数をコピーして新しいスクリプトに貼り付けています。これは関数を再利用する最善の方法ですか。それとも、別の方法を使用した方がよいですか。ですが、本当にお聞きしたいのは、Windows PowerShell 関数の再利用に関するベスト プラクティスです。これを教えていただけませんか。

 

-- JE

 

 

JE さん、こんにちは。

 

Microsoft Scripting Guy の Ed Wilson です。数年前、フロリダ州のタンパで、クライアント向けに Windows PowerShell ワークショップを開催したとき、スキューバ ダイビング用品を持ち出して、クリスタル川に行きました。傾斜 70 度の水面に飛び込むことの大きな魅力と言えば、川の名前が示すほど視界は良くありませんが、この辺りで最も美しい海洋ほ乳類を写真に収められることです。それはマナティーです。マナティーに近づいたり攻撃したりしてはいけません。フロリダ州法に抵触することになりますし、みっともない行為だからです。しかし、川底に座って、マナティーが現れるのを待つことに異論を唱える人はいないでしょう。マナティーは、成長すると体長約 3.7 m で、体重 1,360 kg 以上になります。4 ~ 5 頭のマナティーが鼻を鳴らしながらやって来ると、実に気味が悪いです。私が撮影した次の写真に写っているマナティーは、本当に写真を撮ってもらいたいようすでした。動きを止めてポーズを取り、カメラに向かってほほえんでいました。

JE さん、時には、マナティーの写真を撮影するときのように、インスピレーションを得られるまで座って待つことも必要です。ですが、ちょっとした検証を行った方がよい場合もあります。今回ご質問いただいたケースは、検証を行った方がよい例の 1 つです。

2 つの関数を含む、Include.ps1 という名前の Windows PowerShell スクリプトがあるとします。1 つ目の関数では、入力値に 1 を追加し、2 つ目の関数では、入力値に 2 を追加します。スクリプトをドット ソース形式で読み込むことで、スクリプトに 2 つの関数を含めることができます。Include.ps1 スクリプトは次のとおりです。

Include.ps1

PowerShell
Function addOne($intIN) 
{ 
$intIN + 1 
} 
Function addTwo($intIN) 
{ 
$intIN + 2 
}
 

Include.ps1 スクリプトに含まれる関数を使用するには、昨日の Hey, Scripting Guy! コラムで紹介したのと同じ方法を活用します。つまり、スクリプトをドット ソース形式で使用します。これは以下の UseInclude.ps1 スクリプトで確認できます。

UseInclude.ps1

PowerShell
. "c:\fso\include.ps1" 
addone -intIn 3 
addTwo -intIn 3
 

スクリプトを実行すると、どちらの関数もスクリプトで実行でき、スクリプトにコピーして貼り付けたかのように、スクリプト内から直接呼び出せます。Include.ps1 スクリプトの 2 つの関数は、UseInclude.ps1 スクリプトを実行する以前の段階では、Function ドライブに存在しません。スクリプトが完了すると、これらの関数は Function ドライブに存在しなくなります。Windows PowerShell コンソール内で関数にアクセスするには、昨日の Hey, Scripting Guy! コラムで説明したように、Windows PowerShell コンソールに関数を直接ドット ソース形式で読み込む以外に方法はありません。この方法は、次の画像のとおりです。

しかし、useInclude.ps1 スクリプトを Windows PowerShell ISE で実行すると、まったく異なる動作が発生します。先ほどと同じように、スクリプトを実行するまで、addone 関数と addtwo 関数のどちらも、Function ドライブには存在しません。つまり、これらの関数は現在の Windows PowerShell セッションでは使用できません。useInclude.ps1 スクリプトを実行すると、結果からわかるように、実行中のスクリプトでは、この 2 つの関数を使用できるようになります。また、興味深いことに、useInclude.ps1 スクリプトの実行が完了しても、addone 関数と addtwo 関数は、Function ドライブに保持されます。この状態は、次の画像で確認できます。

関数は Function ドライブに保持されているので、新しいスクリプトで使用できます (保存されていないスクリプトでも使用できます)。関数は、コマンド ウィンドウ (既定のビューの下部ウィンドウ)、またはスクリプト ウィンドウ (既定のビューの上部ウィンドウ) で使用できます。これらの関数が Windows PowerShell 環境に存在しているのは、関数が含まれているスクリプトを実行したからです。Windows PowerShell ISE を終了しない限り、関数は使用できます (ただし、関数を明示的に削除した場合は話が別です)。次の画像では、useInclude.ps1 スクリプトを実行後、そのコードを含むスクリプト ウィンドウは閉じられています。新しいスクリプトを作成しているところですが、この新しいスクリプトを実行すると、先ほどの 2 つの関数を使用することができます。

ただし、Windows PowerShell ISE を終了し、再び起動して、新しいスクリプトで addone 関数と addtwo 関数を使用すると、エラーが発生します。"用語 'addone' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません" というエラー メッセージが表示されます。そのため、Windows PowerShell ISE では addone 関数を実行できません。実際のエラーは次の画像のとおりです。

これは、トラブルシューティングが困難なエラーの厄介な原因となる可能性があります。このようなエラーが発生する可能性に対処する方法は 2 つあります。1 つ目は、スクリプトを保存し、Windows PowerShell ISE を終了して、再び起動するという方法です。これで、Windows PowerShell ISE 環境を、他のスクリプトで使用していた変数や関数の影響を受けていないクリーンな状態にできます。

2 つ目の方法は、スクリプトを Windows PowerShell コンソール (青色の対話型コンソール) で実行する方法です。Windows PowerShell コンソールでは、スクリプトの実行が完了すると、関数は保持されないので、スクリプトの実行や外部依存関係を確認するには安全な場所と言えます。クリーンな状態の Windows PowerShell コンソールを起動することで、初期状態の Windows PowerShell 環境でテストを実行できます。また、この方法では、Windows PowerShell ISE で実行するスクリプトと Windows PowerShell コンソールで実行するスクリプトの互換性を確認することもできます。2 つの環境には違いがあるので、スクリプトを使用する場所や使用方法が明確でない場合は、両方の環境でテストを実行する必要があります。

Windows PowerShell ISE で保持される以前の関数の問題に対処する 3 つ目の方法は、関数を使用するスクリプトで、関数を明示的に削除する方法です。この例を、次の useIncludeRemoveFunction.ps1 スクリプトに示します。Remove-Item コマンドレットを使用して、関数を使用後に削除します。

useIncludeRemoveFunction.ps1

PowerShell
. "c:\fso\include.ps1" 
addone -intIn 3 
addTwo -intIn 3 
Remove-Item function:\add*
 

useIncludeRemoveFunction.ps1 スクリプトを実行すると、ドット ソース形式の手法を使用して、2 つの関数が追加されます。関数は使用できる状態になり、実行されます。その後、Remove-Item コマンドレットを使用して、Function ドライブから関数を削除します。次の画像のとおり、スクリプトの実行前と完了後のどちらも、関数は存在しません。

JE さん、Windows PowerShell スクリプトで関数を使用する方法についてお伝えできることは、これで全部です。明日も Windows PowerShell スクリプトの実行週間は続きます。明日は、Windows PowerShell スクリプトを実行する際にパスワードをマスクすることについてお話します。

ぜひ、私たちの Twitter (英語)Facebook (英語) をチェックしてください。質問がある場合は、scripter@microsoft.com (英語のみ) 宛てに電子メールをお送りいただくか、公式の Scripting Guys フォーラム (英語) に質問をご投稿ください。それでは、また明日。それまでの間、しばしのお別れです。

Scripting Guys (Ed Wilson、Craig Liebendorfer)


* このコンテンツは、Hey, Scripting Guy! Blog (英語) の日本語版です。

ページのトップへ