Windows Powershell変数の機能

Don Jones

VBScript や KiXtart などの Windows ベースのスクリプト言語を使用している方は、データ記憶の 1 手段として変数に慣れていることでしょう。Windows PowerShell にも変数がありますが、従来のスクリプト言語の変数よりもはるかに強力です。Windows

PowerShell の変数は、実際には基盤となる Microsoft® .NET Framework のクラスにマッピングされています。Framework では、変数はオブジェクトです。つまり、変数にデータを格納して、そのデータをさまざまな方法で操作することもできます。実際、Windows PowerShell™ スクリプト言語に組み込みのデータ操作関数がないのは、Windows PowerShell の変数が強力な機能を持っているためなのです。変数自体に機能が備わっているので、そのような関数は必要ないのです。

変数を宣言する

Windows PowerShell の New-Variable コマンドレットを使用して変数を宣言し、初期値を割り当てることもできますが、必ずしもコマンドレットを使用する必要はありません。代わりに、次のように変数に値を割り当てるだけで、新しい変数をすぐに作成できます。

$var = "Hello"

Windows PowerShell では、変数名は必ずドル記号 ($) で始まり、文字、数字、記号、およびスペースを組み合わせて指定できます。スペースを使用する場合は、変数を ${My Variable} = "Hello" のように中かっこで囲む必要があります。この例では、$var という名前の新しい変数を作成し、その変数に初期値 "Hello" を割り当てています。この場合は、値が文字列なので、Windows PowerShell は String データ型を使用して値を格納します。.NET Framework の用語では、これは System.String クラスです。このクラスには、おそらくどの種類の変数よりも多くの機能が組み込まれています。たとえば、$var の値をすべて小文字で表示するには、次のように記述できます。

PS C:\> $var.ToLower()
hello
PS C:\>

ToLower メソッドは System.String クラスに組み込まれており、文字列の値をすべて小文字で出力します。ただし、この場合、変数 $var の実際の内容は変わりません。System.String クラスのすべての機能を確認するには、次のように、パイプを使用して文字列変数を Get-Member コマンドレットに渡します。

$var | get-member

図 1 に示す出力を見ると、文字列の操作に使用される数十個のメソッドを確認できます。VBScript の文字列操作関数が提供するほとんどすべての機能は、Windows PowerShell では文字列変数のメソッドによって提供されます。

Figure 1 A look at the System.String class output

Figure 1** A look at the System.String class output **(画像を拡大するには、ここをクリックします)

管理コンテキストでは、多くの場合、VBScript のような言語の文字列関数よりも、文字列変数の機能を使用した方が便利です。たとえば、ファイルから UNC (汎用名前付け規則) パスを読み取って、何らかの処理を行うスクリプトを作成したとします。読み取ったパスを実際に使用する前に、そのパスが UNC であることを確認する必要がある場合は、StartsWith メソッドを使用します。このメソッドにより、文字列の先頭が UNC に必要な円記号であるかどうかを確認できます。

PS C:\> $path = "\\Server\Share"
PS C:\> $path.StartsWith("\\")
True
PS C:\>

StartsWith は True または False を返すので、論理コンストラクトで使用できます。

if ($path.StartsWith("\\")) {
 # code goes here
}

Windows PowerShell は、変数のメソッドのオートコンプリート機能も備えているため、タイプ入力の手間が省けます。$var に文字列が格納されている場合は、次のように入力し

$var. 

Tab キーを押すと、$var 変数の最初のメソッド名がポップアップ表示されます。再度 Tab キーを押すと次のメソッドが表示され、Shift キーを押しながら Tab キーを押すと前のメソッドが表示されます。このように操作して、必要なメソッドが見つかるまで使用可能なすべてのメソッドを表示することができます。

変数の混同

これまでの例では、変数のデータ型を Windows PowerShell が判別可能でした。変数に文字列を割り当てると、変数は本質的に System.String 型となります。一方、変数に数値を割り当てた場合は、通常、変数は Integer 型 (より詳しくは、特定の範囲の値を格納できる Int32 型) となります。たとえば、次の例について考えてみましょう。

PS C:\> $int = 5
PS C:\> $int | get-member

  TypeName: System.Int32

この出力例 (一部省略) は、Windows PowerShell が $int を独自のメソッドとプロパティのセットを持つ Int32 型として扱っていることを示しています。そして実のところ、Int32 型のメソッドとプロパティは、String 型よりもはるかに少ないのです。

$int が Int32 型と判別されたのは、値が引用符で囲まれておらず、さらに数字だけで構成されていたからです。引用符で囲まれていたならば、System.String 型と解釈されます。

使用するデータ型の決定を Windows PowerShell に委ねると、期待した結果にならないことがあります。たとえば、ファイルから値を読み取り、それらの値を常に文字列として扱う必要があるとします。しかし、一部の値には数字しか含まれていないため、Windows PowerShell によって Int32 型または別の数値型として扱われる可能性があります。そのことが原因で、スクリプトで問題が生じることがあります。Windows PowerShell によって値が文字列と認識されない場合は、System.String クラスのすべてのメソッドを使用できませんが、スクリプトでこれらの使用できないメソッドのいずれかを利用している可能性があるためです。

このような問題を回避するには、最初に変数を使用するときに特定の型を宣言して、強制的に Windows PowerShell が変数をその型として扱うようにできます。次に例を示します。

[string]$var = 5

通常であれば、$var は Int32 型と解釈されますが、ここでは Windows PowerShell に $var を String 型として扱うように強制しています。これにより、System.String クラスに関連付けられているすべてのメソッドを使用できるようになります。変数の型を宣言することで、$var のデータ型が明確になるため、コードの簡単な自己文書化としても役立ちます。実際、私は常にすべての変数について特定の型を宣言する習慣が付いているので、Windows PowerShell から完全に決定権を取り上げてしまっています。このため、スクリプトの動作が予測しやすく、デバッグの時間を大幅に節約できています。

お察しのとおり、強制的に変数を宣言することで、さまざまな影響が生じます。ただし、必ずしも悪影響とは限りません。変数の型を宣言していない次の例について考えてみましょう。

PS C:\> $me = 5
PS C:\> $me = "Don"

$me 変数は、最初は Int32 型でしたが、値 "Don" が追加されたときに Windows PowerShell によって String 型に変更されました。Windows PowerShell では、変数が明示的に特定の型に設定されていなければ、必要に応じて変数の型が変更されます。

次の例では、[int] という型名を使用して $me を強制的に Int32 型として宣言しています。

PS C:\> [int]$me = 5
PS C:\> $me = "Don"
Cannot convert value "Don" to type 
"System.Int32". Error: "Input string 
was not in a correct format."
At line:1 char:4
+ $me <<<< = "Don"

そのため、この変数に文字列を割り当てようとしたときに、エラー メッセージが表示されました。$me が明示的に Int32 型として宣言されているため、Windows PowerShell は文字列 "Don" を整数値に変換しようとしました。これは不可能であり、$me の型を String 型に変更することもできませんでした。

多数の型

Windows PowerShell では、多数の型を使用できます。実際には、.NET Framework のすべての型を使用できます。したがって、使用可能な型は何百種類にもなります。ただし、Windows PowerShell では、よく使用されるデータ型のショートカットがいくつか定義されています。図 2 は、データ型のショートカットの一部について、最もよく使用される 10 種類を示しています。完全な一覧については、Windows PowerShell のドキュメントを参照してください。

Figure 2 よく使用される型のショートカット

ショートカット データ型
[datetime] 日付または時刻
[string] 文字列
[char] 1 文字
[double] 倍精度浮動小数点数
[single] 単精度浮動小数点数
[int] 32 ビット整数
[wmi] Windows Management Instrumentation (WMI) インスタンスまたはコレクション
[adsi] Active Directory サービス オブジェクト
[wmiclass] WMI クラス
[Boolean] True または False

次のように、.NET Framework の完全なクラス名を使用して変数の型を宣言することもできます。

[System.Int32]$int = 5

この方法により、Windows PowerShell に特定のショートカットがない .NET Framework の型を使用することができます。

型を拡張する

Windows PowerShell の最も便利な機能は、おそらくこれらの変数型の機能を拡張できることでしょう。Windows PowerShell のインストール フォルダ (通常は %systemroot\system32\windowspowershell\v1.0 ですが、64 ビット システムではパスが少し異なります) に、types.ps1xml というファイルがあります。このファイルは、メモ帳や、PrimalScript などの XML エディタで編集できます。既定では、System.String クラスは記載されていませんが、他の多くの型が記載されています。ただし、types.ps1xml ファイルに System.String 型を追加すれば、この型に新しい機能を追加できます。

ファイルを変更したら、Windows PowerShell を閉じて、再度開く必要があります。また、types.ps1xml は署名されていないので、次のようにローカル スクリプト実行ポリシーで未署名のスクリプトの実行を許可する必要があります。

Set-executionpolicy remotesigned

これで、Windows PowerShell を再起動したら、次のように新しい機能を使用できます。

PS C:\> [string]$comp = "localhost"
PS C:\> $comp.canping
True
PS C:\>

ご覧のとおり、私は CanPing プロパティを System.String クラスに追加しました。このプロパティは、True または False を返して、文字列に含まれているアドレスにローカル コンピュータが ping を実行できるかどうかを示します。図 3 では、WMI クエリで特殊な変数 $this が使用されているのがわかります。$this 変数は文字列に含まれている現在の値を表しており、これを使用して文字列変数の内容を WMI クエリに渡しています。

Figure 3 System.String 型の拡張

<Type>
  <Name>System.String</Name>
  <Members>
    <ScriptProperty>
      <Name>CanPing</Name>
      <GetScriptBlock>
      $wmi = get-wmiobject -query "SELECT *
FROM Win32_PingStatus WHERE Address = '$this'"
      if ($wmi.StatusCode -eq 0) {
        $true
      } else {
        $false
      }
      </GetScriptBlock>
    </ScriptProperty>
  </Members>
</Type>

変数に処理を行わせる

Windows PowerShell には、柔軟性の高い機能豊富な変数型と、型の機能を拡張するための同様に柔軟性の高いシステムが用意されています。これらの機能を使用すると、スクリプトに多くの機能を簡単に組み込むことができます。実際、変数は複雑なスクリプトにおいては主要な構成要素となり、多くの場合、より複雑な関数に通常見られるような、高度な機能を備えています。

オンラインで学習する

毎月第 3 または第 4 火曜日に開催される一連の Web キャスト (英語) に参加してください。Windows PowerShell の豊富なスクリプト機能について詳しく説明します。microsoft.com/events/series/donjonesscripting.mspx (英語) にアクセスして、今すぐサインアップしてください。

2007 年 2 月 20 日 Windows PowerShell: The Scripting Crash Course (スクリプトに関する短期集中コース)

この Web キャスト (英語) では、Windows PowerShell の変数、言語コンストラクト、スクリプト、および関数について学習します。1 時間の短期集中コースで、Windows PowerShell の簡単かつ有効なスクリプト言語によって Windows® 管理の自動化を迅速に行う方法を示します。Windows PowerShell のスクリプト作成を可能な限り簡易化するサードパーティ製のツールもいくつか紹介します。

2007 年 3 月 20 日 Windows PowerShell: Functions, Filters, and Efficiency (関数、フィルタ、および効率)

Windows PowerShell の関数とフィルタにおいて、効率的なモジュール化されたコードを作成する方法を学習します。関数とフィルタを完全にカプセル化するための Windows PowerShell の強力なスコープ規則と、これらの関数とフィルタをプロジェクトで簡単に再利用する方法を説明します。また、Windows PowerShell のグローバル スコープに独自のカスタム関数を追加して、便利なユーティリティ関数のライブラリを簡単に構成できることを示します。

2007 年 4 月 17 日 Windows PowerShell and Windows Management Instrumentation (Windows PowerShell および Windows Management Instrumentation)

Windows PowerShell では、Windows Management Instrumentation (WMI) のすべての機能にアクセスできます。この Web キャスト (英語) では、Windows PowerShell を使用して WMI にアクセスする方法と、Windows PowerShell パイプラインを使用して WMI のオブジェクトおよびコレクションを渡す方法について説明します。Windows PowerShell スクリプトで WMI のプロパティとメソッドを利用する方法や、基礎となる WMI のセキュリティと構成機能についても説明します。

2007 年 5 月 22 日 Windows PowerShell: Converting from VBScript (VBScript からの変換)

スクリプトを (またはあなたのスキルを) VBScript から Windows PowerShell に変換したい方はいますか。この Web キャスト (英語) に参加すれば、その方法がわかります。Windows PowerShell に VBScript の主要なコンストラクトと機能のすべてがどのように組み込まれているかを示し、あなたの VBScript スキルをこの新しい管理環境に簡単に移行できることを説明します。また、VBScript のツールを Windows PowerShell のネイティブのスクリプト言語に変換する方法も示します。また、Windows PowerShell 独自の構造と、作業をより効率的かつ効果的に行えるように Windows PowerShell スクリプト言語を使用する方法についても説明します。

2007 年 6 月 19 日 Windows PowerShell: Under-the-Hood Extensions (内部の拡張機能)

この Web キャスト (英語) では、Windows PowerShell が強力かつ柔軟性のある .NET Framework をどのように使用してデータを処理しているかについて説明し、文字列、日付、およびその他のデータ型を管理するための数百もの組み込み関数が提供されていることを示します。ところで、これらの機能を Windows PowerShell スクリプトでは拡張できることをご存知でしたでしょうか。コンピュータ名を含むだけでなく、そのコンピュータが稼働中であるかどうかを知らせる文字列変数の作成方法を示します。また、外部関数を使用しないでデータの書式を自動的に設定できる日付型と時刻型の変数の作成方法を学習します。このセッションに参加して、あらゆる新機能をわずか数分で Windows PowerShell に組み込んで、Windows の管理をより迅速かつ簡単にする方法を確認してください。

Don Jones は SAPIEN Technologies のプロジェクトおよびサービスの責任者であり、『Windows PowerShell: TFM』(SAPIEN Press) の共著者でもあります。Don の連絡先については、www.ScriptingAnswers.com (英語) を参照してください。

© 2008 Microsoft Corporation and CMP Media, LLC. All rights reserved; 許可なしに一部または全体を複製することは禁止されています.