【PowerShell】MVA対策講座 Windows PowerShell 3.0 を基礎から学ぶ ‐ Part3 単純なスクリプトと関数 編

Microsoft Virtual Academy で公開されているオンライントレーニングコース「PowerShell 3.0 を使用した高度なツールとスクリプト」のテスト解説シリーズ、第3回目です。

腕に自信のある方は、まずはテストを受けてみてくださいね!

通過できない場合には、こちらの解説講座に戻ってきてください。

Microsoft Virtual Academy - PowerShell 3.0 を使用した高度なツールとスクリプト
https://www.microsoftvirtualacademy.com/training-courses/advanced-tools-and-scripting-with-powershell-3-jump-start-japanese#?fbid=pJeqjxv8UId

前回までの投稿は以下より。

今回は PowerShell の「単純なスクリプトと関数」について解説します。

是非とも満点でテストを通過してください!

 

PowerShell スクリプトを作成する理由は何ですか

  1. 自動化のため
  2. 互換性のため
  3. PowerShell v2 を操作できるようにするため
  4. .NET Framework の機能を使用するため

うーん、なんか、いろいろ考えすぎてしまいますね。でもここはシンプルに「自動化のため」と考えましょう。

MCPもそうですが、マイクロソフト本社が作成するこの手の問題は「マイクロソフトの意図が理解できているかどうか」を問うものが多いです。「スクリプト」に込められた第一の意図は、やはり「自動化」なんですね。

PowerShell スクリプトを作成するには、どのツールを使用しますか

  1. PowerShell PowerTools
  2. Visual Studio 2012
  3. Windows PowerShell ISE
  4. Windows PowerShell Editor

ここは迷わず 3. Windows PowerShell ISE と回答していただきたいところです。4. PowerShell Editor というツールが世の中には存在しないわけではありませんが、ISEが選択してとして挙げられている以上、マイクロソフトはこれを選んで欲しいのです。

ちなみに、Visual Studio 2012 でスクリプトの作成が不可能かといえば、そんなことはありません。.NET Frameork には PowerShell Class が用意されており、これを使えばPowerShell スクリプトを Run Space 上で実行し、結果を Visual Studio で受け取ることもできます。が、スクリプト作成の最適なツールではありません。

もしかすると、PowerToys for Windows PowerShell ISE と勘違いして PowerTools を選んでしまった方がいらっしゃるかもしれません。PowerTools は CodePlex で公開されている Open XML 用のツール群です。

PowerTools for Open XML https://powertools.codeplex.com/

PowerShell スクリプトにはコマンドレットが 1 つ以上含まれている必要がある

Windows PowerShell のスクリプトには必ずしもコマンドレットが含まれている必要はありません。なんなら、DOSのコマンドだけでスクリプトを作成しても問題ありません。

スクリプトのパラメーター化に使用する PowerShell コンポーネントの種類は何ですか

  1. モジュール
  2. スナップイン
  3. 関数
  4. 変数

これもわかりずらい問題ですね。。。

そもそも「スクリプトのパラメーター化」って言い回しが難解です。英語版では「Parameterize」と書かれていますので、まぁ、日本語としては間違いではないのですが。。。

何を言いたいかというと、「スクリプトを汎用化する際には、値をハードコードするのではなくパラメタ化したほうがよいわけですが、その際使用するのは何ですか?」という問いです。

答えは「変数」ですが、ちょっと意図が分かりずらいですね。

例えば、以下のようなスクリプトがあったとしましょう。

image

これだと、値がスクリプトに埋め込まれているので、処理を変更するには毎回スクリプトを編集する必要があります。

これを以下のように「Param」で囲んであげることで、変数をスクリプトのパラメタ(引数)として扱うことができます。

image

このことを「パラメタ化」と言っているのですね。

PowerShell スクリプトに使用するファイル拡張子は何ですか

  1. .vbs
  2. .cs
  3. .psm1
  4. .ps1

これについては解説は必要ないですね。4. ps1 が正解です。

.vbs は言うまでもなく VBScript。.cs は C# で書かれたソースコードが保存されるファイルの拡張子です。

.psm1 については知らない方もいらっしゃるかもしれませんが、スクリプトをモジュール化する際に使用する拡張子です。

(参考)Windows PowerShell: スクリプトを簡単に共有できるようになりました
https://technet.microsoft.com/ja-jp/magazine/ff625835.aspx

パラメーターを受け取るためにスクリプトに追加する必要があるブロックの種類は何ですか

  1. Comment ブロック
  2. Script ブロック
  3. Param ブロック
  4. Function ブロック

パラメーターとは、ここではスクリプトの引数を意味しています。

スクリプト内で引数を受け取るには、以下のように Param ブロックを使用します。

image

Comment ブロックとは、以下のように複数行にわたるコメントを記述する際に使用します。

<#
This is
a
block comment
#>

Scriptブロック とは、その中に書かれたスクリプトを実行する際に使用するのですが、例えば以下のようにリモートコンピューター上で実行したいコマンドを記載するのに使用します。

Invoke-Command -ComputerName RemotePC -ScriptBlock{ Restart-Computer }

Functionブロックは、ある処理を関数化する際に使用します。例えば以下のように使用します。

Function EchoDateTime {

Get-Date

}

EchoDateTime

PowerShell で関数を定義するには、どのキーワードを使用しますか

  1. Module
  2. Function
  3. Param
  4. While

前問で書いた通り、関数を定義するには Function を使用します。

While はループを記述する際のキーワードですね。

Get-DiskInfo という関数を DiskUtilities.ps1 というスクリプトに追加しました。PowerShell ISE の外部でこの関数をテストするには、どのような手順を実行する必要がありますか (2 つ選択してください)。

  1. DiskUtilities.ps1 スクリプトを実行する
  2. スクリプトをモジュールとして読み込む
  3. Get-Diskinfo を呼び出す
  4. ドット ソース モードで DiskUtilities.ps1 スクリプトを実行する

まず初めに謝っておきます。

これ、答えが間違えています。。。。ごめんなさい。本社にフィードバックしておきます。

正解は、3,4 ですが、2,4と回答しないと正解になりません。。。ほんとごめんなさい。

気を取り直して解説しておきましょう。

おそらく、以下のようなスクリプトを作成して、DiskUtilities.ps1 というファイル名で保存したのでしょう。「関数を保存した」というところに注目してください。

image

このスクリプトを ISEの「実行ポタン」ではなくPSコンソールやタスクマネージャー等から起動するにはどうしたらよいか?という問いです。

ここで注意していただきたいのは、保存したスクリプトは「関数」であるということです。

上記のような関数が書かれたスクリプトを単純に実行すると「関数が定義」されるだけで、関数そのものは実行されません。

でもって、定義された関数はスクリプトが終われば消えてしまいます

つまり、以下のように行っても、関数は実行されないのです。

PS C:\> .\DiskUtilities.ps1

PS C:\> Get-DiskInfo

よって、「1.」は不正解です。

じゃ、「2. スクリプトをモジュールとして読み込む」はどうかといえば、一見よさげですが、これも × です。

モジュールとして読み込むには、.psm1 という拡張子で保存し、所定のモジュールフォルダに格納する必要があります。

拡張子 .ps1 で保存したスクリプトファイル内にある関数を呼び出すには、「ドット ソース モード」と呼ばれる手法でスクリプトを実行する必要があります。

具体的には以下のように、先頭にドット スペースを追記します。

PS C:\>. .\DiskUtilities.ps1

ドット 半角スペース ドット\DiskUtilities.ps1 と書かれてます。

これにより、ps1 内の Get-DiskInfo 関数は、同じ PSセッション内であればいつでも呼び出して実行できます。

PowerShellコンソールを閉じてしまうと、PSセッションも消滅するので、関数も使えなくなります。