Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Microsoft Virtual Academy で公開されているオンライントレーニングコース「PowerShell 3.0 を使用した高度なツールとスクリプト」のテスト解説シリーズ、第2回目です。
腕に自信のある方は、まずはテストを受けてみてくださいね!通過できない場合には、こちらの解説講座に戻ってきてください。
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 で変数を宣言するには、どの記号を使用しますか
- !
- @
- #
- $
これは比較的簡単ですね。正解は “$” です。文字列の頭に $ をつけることで変数として扱うことができます。
他のスクリプト言語同様、Windows PowerShell でも特殊記号を使用することで文字列に特別な意味を持たせることができます。
!(エクスクラメーション)は 論理否定(-not)の短縮形です。変数が NULL 値かどうかの判定なんかで使います。”NULL 値は論理値的には False” なので、! $null と書けば、True を意味することになります。ちなみに、$null は NULL 値を表現する既定の変数です。
@ を使用するとアレイ値を宣言することができます。 @(1,2,3) とすれば、数値の1,2,3それぞれが入った配列が定義できます。文字列も同様に、@(“a”,”b”,”c”) などとするだけです。
配列と似たものでハッシュテーブルと呼ばれるものもあります。これはキーと値のペアで格納できるものです。
例えば各国の人口をプログラムの中で使いたい場合、事前に以下のように定義しておきます。
$P = @{“Japan” = 127600000 ; “USA” = “313900000” }
こうすれば、日本の人口を取り題したいときには $P.Item("Japan") とすればよいわけです。いちいちデータベース等にアクセスする必要がなくなるので、繰り替えし処理が多い場合などは処理を高速化できます。
# はご存知ですよね。これはコメント行を意味します。
文字列内の変数と併用した二重引用符の機能はどれですか
- すべての変数を解決する
- 変数が置換されないようにする
- 一般的な変数を置換する
- 個別の変数が置換されないようにする
これ、意味が分かりずらいかもしれません。次の問題とも関係するのですが、文字列の中に$で始まる文字列を書いた場合を考えてみてください。例えば、以下のように。
$a = “6”
$b = “12345$a”
このとき、$b の中に格納されているのは、”123456” です。なぜならば文字列を二重引用符(ダブルクオーテーション)で括っているからです。
つまり、正解は「1. すべての変数を解決する」です。ここでいう「解決」とは、「名前解決」と同じような意味です。変数を置き換えることを意味しています。
文字列内の変数と併用した単一引用符の機能はどれですか
- すべての変数を解決する
- 変数が置換されないようにする
- 一般的な変数を置換する
- 個別の変数が置換されないようにする
前問の続きになりますが、以下のように単一引用符(シングルクオーテーション)で文字列をくくった場合を考えてみます。
$a = “6”
$b = ’12345$a’
この場合、変数は展開されずに、そのまま文字列として扱われます。
よって、正解は「2. 変数が置換されないようにする」です。
文字列内の変数と併用したアクサン グラーブの機能はどれですか
- すべての変数を解決する
- 変数が置換されないようにする
- 一般的な変数を置換する
- 個別の変数が置換されないようにする
アクサン グラーブって、どれのことかわかりますか?106/109日本語キーボードですと以下がアクサングラーブです。
これはスクリプトの継続行を意味する記号として使われますが、それ以外にも $ の前に付加することで、$ を単なる文字列として扱うことができます。
つまり答えは「4. 個別の変数が置換されないようにする」です。
PowerShell でオブジェクトに関するプロパティやメソッドを取得する必要があります。どのコマンドレットを使用しますか
- Get-Object
- Get-Service
- Get-ChildItem
- Get-Member
これは覚えておきましょう。「4. Get-Member」です。
PowerShell のコマンドレットは高機能なので、その戻り値がどのようなプロパティやメソッドを持っているかを記憶することは不可能ですし、かといっていちいち調べるのも面倒です。
なので出力結果から、どのような値が得られ、どのような処理が可能になるのかを簡単に予測できることは、効率的なスクリプティングにとってとても重要です。
例えば、 Get-Process というコマンドレットを考えてみましょう。
このコマンドレットの結果、プロセス一覧が取れるであろうことは予測できますが、具体的にどのような値が取れるのかを調べるには、以下のように、Get-Process の出力結果を、パイプを介して Get-Memeber に渡します。
知っているととても便利です。
PowerShell の論理構文は次のうちどの構文ですか (2 つ選択してください)。
- If .. ; Then .. ; Else
- If .. ; ElseIf .. ; Else
- Case .. ; Select
- Switch
- While
「論理構文」って意味わかります?ググっても、もといBingってもそんな言葉出てこないんですけど。。。。
英語版のテストでは「Logical construct」と書いてあるので「論理構文」なのでしょうが、日本だと「条件分岐構文」のほうがしっくりくるでしょうかね。
じゃ、上記の中で条件分岐はどれかといえば 1,2,3,4 になりますが、問題文では「2つ選択」と書かれています。
頭の中に???が並びますよね。
これ、ひっかけ問題です。
PowerShell には、 if .. then .. else はありません!正確に書くと、PowerShell には「Then」は書きません!!だから、1. は × です。
それから、PowerShell には Case 文、Select 文はありません!! これらは Switch 文に吸収されています。
よって正解は 2 と 4 になります。
意外と難しいですねぇ。
PowerShell のループ処理構文は次のうちどの構文ですか (2 つ選択してください)
- If ..; Then .. ; Else
- Do
- Case ..; Select
- Switch
- While
これは解説の必要はないですね。
2、5 が正解です。
PowerShell のオブジェクトを反復処理する一般的な方法は次のうちどの構文ですか (2 つ選択してください)
- If ..; Then ..; Else
- ForEach
- Case ..; Select
- Switch
- ForEach-Object コマンドレット
「オブジェクトの反復処理」というところがミソです。
PowerShell では、Do や While を含め様々なループ処理があります。
"For” だけでも、以下の3種類があります。
- For
- Foreach
- ForEach-Object コマンドレット
この中でオブジェクトに対する反復処理に対応しているのは、Foreach と ForEach-Object コマンドレットの2つです。
例えば、「WUA で始まるサービスの一覧を取得し、それらをすべて停止する」という処理を考えてみると、以下のように書けます。
$S には Get-Service の戻り値がオブジェクトとして格納されています。$S から個々のサービスのインスタンスを取り出して Stop() しています。
てことで正解は 2、5 ですね。
ということで、第2回目の講義は終わりです。
テストに通過できなかった方は、上記を踏まえて再度チャレンジしてください!目指せ満点!
Microsoft Virtual Academy - PowerShell 3.0 を使用した高度なツールとスクリプト
https://www.microsoftvirtualacademy.com/training-courses/advanced-tools-and-scripting-with-powershell-3-jump-start-japanese#?fbid=pJeqjxv8UId
次回は 「第3回 単純なスクリプトと関数」編です。
Comments
- Anonymous
February 09, 2014
The comment has been removed - Anonymous
February 12, 2014
The comment has been removed