ページ)PowerShellを使いこなすために必要な、最低限の基礎文法知識を身に付けよう。2.0の新機能についても解説する。前回はPowerShellの概要およびインストールと使用方法について解説した。次回からはPowerShellを使ったシステム管理法をテーマ別に解説するが、その際に必要となるPowerShellの基礎文法を今回取り上げ、解説しておく。1.0から2.0にバージョンアップした際に追加された新機能についても説明する。前回説明したとおり、PowerShellはシェルであり、コンソールを用いて対話的にコマンドレット(PowerShellのコマンド)を実行していくことができる。PowerShellがシェルであると同時に、スクリプト言語でもあることも前回述べた。PowerShellにおいてはコンソールで入力するものとスクリプトに記述するものは同じ文法である。ここではPowerShellの文法のうち、重要な基礎文法について取り上げ説明する。オブジェクトと配列についてPowerShellは従来のテキスト・ベースのシェルとは異なり、オブジェクトを扱うシェルであることは前回も述べたが、ここではまずオブジェクトとは何かということについて説明する。簡単にいうと、オブジェクトとはクラスという設計図を基にして、それを実体化(インスタンス化)したものである。Frameworkに含まれるProcessクラスのオブジェクト(インスタンスともいう)である。クラスにプロパティが定義されていると、インスタンス化した際、そのオブジェクトの性質をオブジェクトごとに保持することができる。ProcessクラスにはHandlesプロパティ(注:このプロパティ名はHandleCountプロパティのPowerShell用に設けられた別名)が定義されており、プロセスがオープンしたハンドルの数を格納することができる。ProcessクラスにはProcessNameやHandlesなどのプロパティが定義されており、インスタンス化するとそれらのプロパティにそれぞれ値を持ったProcessオブジェクトが生成される。プロセスは複数存在しているはずなので、Get-Processコマンドレットをパラメータを付けずに実行すると、結果は複数のProcessオブジェクトとして得られる。このときProcessオブジェクトの集まりはProcessオブジェクトの「配列」である。PowerShellにおいて配列とは、複数のオブジェクトが格納されたセット(集合)であると考えて差し支えない。Get-Processコマンドレットによって、それぞれHandlesやProcessName(プロセス名)などのプロパティの値が格納されているProcessオブジェクトの配列が取得でき、その値はコンソールのヘッダ行以下に表示される。Get-Processコマンドレットの実行例Get-Processコマンドレットを実行すると、結果として複数のProcessオブジェクト(配列)が得られる。何も指示しないとこのように、先頭にヘッダ行が表示され、それに続いて各オブジェクトが1行ずつ表示される(1)ヘッダ行。プロパティの名前が表示される。(2)プロセスの一覧(Processオブジェクトの配列)が表示される。1行が1つのProcessオブジェクトを表す。Processクラスの正式名称は「System.Diagnostics.Process」クラスである。System.Diagnostics名前空間(クラスをまとめるフォルダのようなもの)に存在するProcessクラスという意味になり、これをクラスの完全修飾名という。プロセス操作については第4回で詳しく取り上げる予定である。パイプラインについてオブジェクトもしくはその配列がコマンドレットによって得られると、そのオブジェクトのプロパティの値が表形式で出力される(リスト形式などの場合もある)が、得られたオブジェクトの配列をパイプ(「|」記号。正式には「パイプライン」という)を通して後続のコマンドレットの入力とすることもできる。従来のシェルにもパイプ機能は存在したが、パイプを渡る(通る)ものは「テキスト・データ(文字列)」であったのに対し、PowerShellではパイプを「オブジェクトもしくはその配列」が「プロパティ値を保持したまま」渡ることがポイントである。従来のシェルでは、コマンドの出力文字列をパイプに渡すことで、コマンド同士が文字列データで連携していた。PowerShellでは、コマンドレットの出力オブジェクト(の配列)がプロパティ値を保持したままパイプを渡り、後続のコマンドレットに入力されて、コマンドレット同士が連携する。ここではパイプを通じて入力されたオブジェクトの配列に対して操作を行う代表的な3つのコマンドレットについて解説する。Select-Objectコマンドレット(エイリアスselect)このコマンドレットには2つの使用法がある。Id,ProcessNameパイプに渡されたProcessオブジェクトの配列のうち、-propertyパラメータに指定したIdとProcessNameプロパティの値だけを取り出して出力する。-propertyパラメータ名は省略可能だ。5パイプに渡されたProcessオブジェクトの配列のうち、最初の5個のオブジェクトだけを選択して出力する。-firstのほかに、末尾から取得する-lastなども存在する。Where-Objectコマンドレット(エイリアスwhere、?)オブジェクトの配列をフィルタにかけ、条件に一致するオブジェクトだけを出力する。1000}Processオブジェクトの配列のうち、Handlesプロパティの値が1000より大きいものだけを取り出して出力する。内にはPowerShellの条件文を記述する。.(ドット)」演算子を用いている。-gtは「左辺値が右辺値より大きい」ということを表す比較演算子である。変数、演算子については後で説明する。-filterScriptパラメータ名は省略可能である。ForEach-Objectコマンドレット(エイリアスforeach、%)配列に含まれるすべてのオブジェクトに対して繰り返し同じ操作を行う。$_.FullName}カレント・ディレクトリに含まれるすべてのファイルとフォルダのフルパスを、Write-Hostコマンドレット(-Objectパラメータに指定されたオブジェクトをコンソールに出力するコマンドレット。パラメータ名-Objectは省略可能)を用いて表示する。内のコードが繰り返される。-processパラメータ名は省略可能である。ForEach-ObjectコマンドレットはWhere-Objectと併用してよく用いられる。$_.FullName}カレント・ディレクトリに含まれるファイルのうち、拡張子が.txtのものだけをフィルタし、そのフルパスを表示する。ここでToLower()は文字列を表すSystem.Stringオブジェクトのメソッドで、小文字に変換した文字を返す。-eqは「右辺と左辺が等しい」ことを表す演算子である。これまでのスクリプト言語では、配列のうち、特定の条件を満たすものだけに処理を行いたい場合は、次のようにしていた。foreachステートメントで配列の各要素について繰り返し処理を行い、その中でifステートメントを使って、それぞれの配列要素から条件に合致するものだけを対象にして処理を記述していた。PowerShellでもこれらのステートメントは用意されているが、Where-ObjectコマンドレットとForEach-Objectコマンドレットを併用することで、簡潔に記述できる。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。