[運用]
|
|
PowerShellに限らず、すべてのプログラミング/スクリプト言語を記述するうえで欠かせないのが「変数」だ。いまさらいうまでもなく変数とは、コード上で値を格納し、処理した結果を反映し、また、ほかへと引き渡す、すべての処理を行う上での基本となる仕組みのことだ。もっとも、(例えば)言語によっては変数を利用するうえで、あらかじめデータ型と名前を宣言する必要があるものもあるが、PowerShellにおいては、(多くのスクリプティング言語と同様)あらかじめ変数を宣言する必要はない。PowerShellでは、初めて値が代入されたタイミングで、必要に応じて変数が生成される(*)。
| * 従って、厳密にはPowerShellの変数には「未初期化」という状態はない。PowerShellでは「値を持つ変数」か「存在しない変数」があるだけである。 |
変数の命名規則
さてその変数を利用するに当たって、まず理解しておく必要があるのが変数の命名規則だ。前編でも簡単に触れたように、PowerShellでは変数名を以下の規則に従って命名する必要がある。
- 先頭文字は「$」で始まること
- 2文字目以降は任意の英数字、またはアンダースコア(_)であること
厳密には${〜}のように、中カッコで変数名を囲めば任意の文字を利用できる。例えば以下のような変数名でもよい。
${Windows PowerShell + .NET Framework} |
もちろん、変数名にはできるだけ内容が類推できる程度に簡潔な(必要以上に短く、ということではない)名前を付けることが重要であり、通常は上のような変数名を付けることは好ましくない。必要以上に長い変数名はタイプミスにもつながる一因であるので(しかも、PowerShellのように変数宣言が不要な言語ではタイプミスを検出するのが困難である)、通常は一般的な命名規則の中で変数名を決めるのが好ましいだろう。
変数のデータ型
PowerShellは、(やはり多くのスクリプティング言語と同様)データ型を区別しない言語である。ただし厳密にはデータ型を持たないわけではなく、与えられた実データに応じてPowerShellが自動的に適切なデータ型を与えてくれる。従って、次のようなコードもPowerShellでは正しい。
$x = 123 |
最初の文では変数$xには整数型が割り当てられ、次に文字列が代入されたところで$xは文字列型となる(文字列はクォート記号で囲む必要がある)。PowerShellがデータ型を持たないわけではない証拠に、変数のデータ型をGetTypeメソッドで確かめてみると、以下のようにSystem.Int32型が割り当てられていることが確認できる。
PS > $x = 123 |
このようなデータ型の動的な認識は、多くのケースで便利なものであるが、時として思わぬ不具合をもたらす場合もある。例えば次のようなケースだ。
PS > $x = "1" |
| * Write-Outputはコマンドレットの1つで、指定された式の値を標準出力に出力する。 |
PowerShellの「+」演算子には加算演算子と文字列連結演算子としての2つの役割がある。そのため「文字列+数値」ならば文字列連結演算子としての役割が優先され、「数値+文字列」ならば加算演算子としての役割が優先されるようである。規則を覚えてしまえばよいといえばそれまでであるが、当然、複雑なコードを記述していく中では誤解を招く一因ともなるもので、好ましくない。
そこでPowerShellでは明示的に変数の型を宣言する方法も提供している。具体的には、以下のリストのように変数名の先頭に角カッコで囲んだデータ型を明示する(*)。
PS > [System.Int32] $x = 10 |
| * これはPowerShellにおけるキャスト構文である。例えば、「$x = [System.Int32] 1.3」のようにすることで、右辺の値(1.3)をInt32型にキャストすることもできる。 |
変数に型属性を明示的に宣言することで、PowerShellは代入する値を強制的にその型にキャスト(変換)しようと試みる。上のリストを見ても分かるように、Int32型として作成された変数に小数点数を格納した場合、整数にキャストされるし、もしもInt32型に変換できないような(例えば)文字列が渡された場合にはエラーを発生する。
このようにPowerShellでは「データ型があいまいなままに使用することも、厳密にデータ型を区別して利用することも可能であること」「厳密にデータ型を指定した場合にもできるだけデータをその型に合致するように自動変換が行われること」を覚えておいていただきたい。
| [コラム]型名のエイリアス PowerShellでは.NET Frameworkで提供される型名をそのまま利用できるが、一部のよく利用するデータ型についてはエイリアス(別名)が用意されており、より短い型名で表記できる。以下に、PowerShellで利用可能な主な型エイリアスをまとめておく。
|
||||||||||||||||||||||||||||||
文字列の自動展開
変数に格納できる重要なデータ型の1つとして「文字列」がある。PowerShellでは、この文字列を表すために、細かく分けると4種類の文字列リテラルを提供している。
- シングルクォートで囲まれた文字列
- ダブルクォートで囲まれた文字列
- シングルクォートで囲まれたヒア・ドキュメント
- ダブルクォートで囲まれたヒア・ドキュメント
ヒア・ドキュメントについては後述するとして、まず押さえておいていただきたいのは、文字列はシングルクォート/ダブルクォートのいずれかで囲む必要があるということ、そして、このいずれで囲むかによってPowerShellの挙動が異なるということだ。具体的には次の例を見てほしい。
PS > $name="山田" |
このように、文字列に含まれる「$name」がシングルクォートで囲まれた場合にはそのまま出力されるのに対して、ダブルクォートで囲まれた場合には評価された結果(ここでは「山田」)として表示される。このように、PowerShellではダブルクォートで囲まれた文字列では「変数展開」が行われるというわけだ。
ちなみにPowerShellでは、改行文字やタブ文字のような特殊文字をエスケープ・シーケンスを利用して表現できる(以下はエスケープ・シーケンスの例だ)。
| エスケープ・シーケンス | 概要 |
| `b | バックスペース |
| `n | 改行 |
| `r | キャリッジ・リターン |
| `t | タブ |
![]() |
|
| PowerShellの文字列における主なエスケープ・シーケンス | |
| 「`(バッククォート)」記号と1文字の英字で特殊文字を表現する。多くの言語ではエスケープのために「\」記号を利用しているが、Windows OSではフォルダの区切り文字として「\」が用いられていることから、あえてバッククォート記号がエスケープ文字として採用されたようである。 | |
これらエスケープ・シーケンスも、シングルクォートの中では認識されないので、要注意である。
PS > Write-Output "私の名前は`n $name です。" |
ヒア・ドキュメント
そして、先ほど解説を保留したヒア・ドキュメント(here document)とは、(通常は複数行にまたがる)大量のテキストをスクリプト・インラインで記述するための仕組みだ。ヒア・ドキュメントは「@"<改行>〜<改行>"@」(または「@'<改行>〜<改行>'@」)の形式で記述できる。
|
|
| ヒア・ドキュメントを利用した長い文字列の定義 |
もっとも、このような例であれば、ヒア・ドキュメントという新しい仕組みを持ち出さなくても、通常のダブルクォート/シングルクォートでもよいと思われるかもしれない。事実、上の例はヒア・ドキュメントを使わずに次のように記述できる。
|
|
| ヒアドキュメントを利用しないで長い文字列を定義(1) |
しかし、以下のような例ではどうだろう。
|
|
| ヒアドキュメントを利用しないで長い文字列を定義(2) |
このように、文字列にシングルクォート/ダブルクォートを含み、かつ、ヒア・ドキュメントを利用しない場合にはクォートをエスケープする必要がある。もちろん、これは大量のテキストをインラインで記述する場合には、エスケープ漏れの原因にもなるし、そもそもエスケープが必要な個所を確認すること自体が煩雑な作業だ。そこでヒア・ドキュメントの登場というわけである。ヒア・ドキュメントは(繰り返しであるが)「@"<改行>〜<改行>"@」(または「@'<改行>〜<改行>'@」)を文字列の区切りとしているので、文字列中にクォートを自由に含めることができる。後々に文字列を変更した場合に、思わぬ不具合の原因とならないよう、複数行に及ぶ長いテキストを表す場合には(クォートの有無にかかわらず)ヒア・ドキュメントを利用することをお勧めしたい。
配列と連想配列
文字列と並び、スクリプトを記述するうえで重要なデータ型が「配列」と「連想配列(ハッシュテーブル)」である。まずはさっそく、それぞれ配列と連想配列を宣言する具体的なコードを見てみることにしよう。
PS > $x = 1,2,3 |
配列/連想配列を生成する一般的な構文は、以下のとおりだ。
要素, 要素, 要素, ... ……配列 |
ただし配列はカンマ演算子(,)で生成するほか、以下のように記述することもできる。
@(要素, 要素, 要素, ...) |
空の配列を明示的に宣言するには、単に「()」とするのではなく、「@()」のように記述する(空の連想配列を生成する場合は「@{}」)。
宣言された配列/連想配列にアクセスするには、
$変数名[インデックス番号] |
のように角カッコ表記でインデックス番号やキー名を指定すればよい。ただし連想配列についてはドット演算子を利用して、
$変数名.キー名 |
の形式で取得することも可能である(プロパティ表記)。キー名が静的に決まる場合には角カッコ表記/プロパティ表記いずれを利用しても構わないが、キー名を変数として渡したいなど動的に変更する必要がある場合には、角カッコ表記を使用する必要がある。
| INDEX | ||
| [運用]Windows PowerShellコマンド&スクリプティング入門(前編) | ||
| PowerShellの基本 | ||
| 1.PowerShellを始めよう | ||
| 2.PowerShellをインストールする | ||
| 3.キーワード1「コマンドレット」―PowerShellを操作する基本コマンド | ||
| 4.キーワード2「.NETオブジェクト」―コマンドレットの戻り値はオブジェクト | ||
| 5.キーワード3「ドライブ」―データソースへのアクセスを一元化する | ||
| [運用]Windows PowerShellコマンド&スクリプティング入門(後編) | ||
| PowerShellスクリプティングの第一歩 | ||
| 1.PowerShellスクリプトの基本 | ||
| 2.PowerShellの変数 | ||
| 3.PowerShellの制御構文 | ||
| 4.PowerShellの関数 | ||
| 5..NET Frameworkのクラスを利用する | ||
| Windows運用 |
ホワイトペーパー(TechTargetジャパン)
- Windows 7のファイアウォール機能 (2010/3/18)
Win 7のファイアウォールの概要解説。ルールセットを切り替えるプロファイル機能が強化され、ドメインでもVPNでも、適切なルールが自動選択される - 第212話 プリンタ用紙 (2010/3/16)
致命的なディスク・クラッシュが起きる確率は、クラッシュによってもたらされる被害の大きさに比例する… - WindowsTIPS (2010/3/12)
− 不要なアドオンを無効化してIE8の起動を高速化する
− IE8のソース表示エディタを変更する
− RRASのNATでポートマッピングを定義する - PowerShell 2.0で始めるWindowsシステム管理 (2010/3/11)
コマンド・プロンプトやWSHスクリプトはもう古い!? これからのWindowsシステム管理はPowerShellでスマートに片付けよう
|
|
スキルアップ/キャリアアップ(JOB@IT)
スポンサーからのお知らせ
- - PR -
| 「いつかは壊れるサーバ」そんな故障に 迅速で安価に手軽に対応する方法とは? New! |
| 「特権ユーザー」の事件を防げ! 万能権限を持つユーザーの管理方法とは? New! |
| 仮想環境の構築とデータ保護の特効薬?! 実績と信頼性の高いパッケージで安心運用 |
| 仮想環境のバックアップもこれまでどおり 「まるごと取ってまるごと戻す」簡単運用 |
| おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |
| その数、なんと400台以上! グループ内 サーバの「統合管理」によるメリットは? |
| 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |
| 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |
- - PR -
お勧め求人情報

**先週の人気講座ランキング**
〜CCNA編〜
| ◆ | TomcatやJBossなどAPサーバ環境に関する 情報を集約! “業務”用APサーバ大百科 New! |
| ◆ | 一気に解説! 最新のクラスタストレージ 「RAIDを超えたストレージ基準」……など New! |
| ◆ | クラウド的ユーザー体験の変化は脅威か? 仮想化技術を使いこなす運用管理術を紹介 New! |

| ◆ | 上司や部下、部署内メンバーとの情報共有 を“ガラッ”と変えるコラボツールとは? New! |
| ◆ | おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| ◆ | 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |

| ◆ | Twitterのアカウントはなぜ突破された? メールによる新手の攻撃手法とその対策 |
| ◆ | もう仮想化のお試しフェイズは終わりだ! Hyper-V 2.0が基幹システムも仮想化 |
| ◆ | 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |

| ◆ | クライアント企業から求められる人材 ⇒IT技術と経営戦略を併せ持つ「戦略家」 |
| ◆ | .NET編集長が実践する「技術情報検索術」 サンプル・コードを簡単に探す“技”は? |
| ◆ | 業務効率と情報セキュリティ対策を両立! 手間なく確実に機密情報を守る方法とは? |

| ◆ | 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| ◆ | 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |

| ◆ | 【CTC事例】約30の基幹システムを統合! 膨大なバッジジョブを制御した方法は? |
| ◆ | 仮想化すればコストは削減できるか? 仮想化に必要な「3つの視点」を解説する |
| ◆ | その数、なんと400台以上! グループ内 サーバの「統合管理」によるメリットは? |







