検索
連載

第2回 PowerShellの基礎PowerShell的システム管理入門(1/3 ページ)

PowerShellを使いこなすために必要な、最低限の基礎文法知識を身に付けよう。PowerShell 2.0の新機能についても解説する。

Share
Tweet
LINE
Hatena
[運用] PowerShell的システム管理入門 ―― PowerShell 2.0で始める、これからのWindowsシステム管理術 ―― 
Windows Server Insider

 

「[運用] PowerShell的システム管理入門 ―― PowerShell 2.0で始める、これからのWindowsシステム管理術 ―― 」のインデックス

連載目次

 前回はPowerShellの概要およびインストールと使用方法について解説した。次回からはPowerShellを使ったシステム管理法をテーマ別に解説するが、その際に必要となるPowerShellの基礎文法を今回取り上げ、解説しておく。またPowerShell 1.0から2.0にバージョンアップした際に追加された新機能についても説明する。

 前回説明したとおり、PowerShellはシェルであり、コンソールを用いて対話的にコマンドレット(PowerShellのコマンド)を実行していくことができる。またPowerShellがシェルであると同時に、スクリプト言語でもあることも前回述べた。PowerShellにおいてはコンソールで入力するものとスクリプトに記述するものは同じ文法である。ここではPowerShellの文法のうち、重要な基礎文法について取り上げ説明する。

オブジェクトと配列について

 PowerShellは従来のテキスト・ベースのシェルとは異なり、オブジェクトを扱うシェルであることは前回も述べたが、ここではまずオブジェクトとは何かということについて説明する。簡単にいうと、オブジェクトとはクラスという設計図を基にして、それを実体化(インスタンス化)したものである。例を挙げると、前回プロセスの一覧を取得するGet-Processというコマンドレットを紹介したが、このコマンドレットによって得られるのは.NET 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つの使用法がある。

1.オブジェクトのうち、特定のプロパティだけを選択して出力する

例:

Get-Process | Select-Object -property Id,ProcessName


 パイプに渡されたProcessオブジェクトの配列のうち、-propertyパラメータに指定したIdとProcessNameプロパティの値だけを取り出して出力する。このように複数指定する場合は「 , 」で区切る。-propertyパラメータ名は省略可能だ。

2.オブジェクトの配列から、任意数のオブジェクトだけを選択して出力する

例:

Get-Process | Select-Object -first 5


 パイプに渡されたProcessオブジェクトの配列のうち、最初の5個のオブジェクトだけを選択して出力する。-firstのほかに、末尾から取得する-lastなども存在する。

Where-Objectコマンドレット(エイリアスwhere、?)

 オブジェクトの配列をフィルタにかけ、条件に一致するオブジェクトだけを出力する。

例:

Get-Process | Where-Object -filterScript {$_.Handles -gt 1000}


 Processオブジェクトの配列のうち、Handlesプロパティの値が1000より大きいものだけを取り出して出力する。{ } 内にはPowerShellの条件文を記述する。$_ はパイプラインに渡されたオブジェクトを表す変数であり、そのHandlesプロパティの値を参照するために「 .(ドット)」演算子を用いている。-gtは「左辺値が右辺値より大きい」ということを表す比較演算子である。変数、演算子については後で説明する。-filterScriptパラメータ名は省略可能である。

ForEach-Objectコマンドレット(エイリアスforeach、%)

 配列に含まれるすべてのオブジェクトに対して繰り返し同じ操作を行う。

例:

Get-ChildItem | ForEach-Object -process {Write-Host $_.FullName}


 カレント・ディレクトリに含まれるすべてのファイルとフォルダのフルパスを、Write-Hostコマンドレット(-Objectパラメータに指定されたオブジェクトをコンソールに出力するコマンドレット。パラメータ名-Objectは省略可能)を用いて表示する。「 $_ 」には配列の1つの要素が格納され、配列の要素数だけ { } 内のコードが繰り返される。-processパラメータ名は省略可能である。

 ForEach-ObjectコマンドレットはWhere-Objectと併用してよく用いられる。

例:

Get-ChildItem | Where-Object {$_.Extension.ToLower() -eq ".txt"} | ForEach-Object {Write-Host $_.FullName}


 カレント・ディレクトリに含まれるファイルのうち、拡張子が.txtのものだけをフィルタし、そのフルパスを表示する。ここでToLower()は文字列を表すSystem.Stringオブジェクトのメソッドで、小文字に変換した文字を返す。-eqは「右辺と左辺が等しい」ことを表す演算子である。

 これまでのスクリプト言語では、配列のうち、特定の条件を満たすものだけに処理を行いたい場合は、次のようにしていた。まずforeachステートメントで配列の各要素について繰り返し処理を行い、その中でifステートメントを使って、それぞれの配列要素から条件に合致するものだけを対象にして処理を記述していた。PowerShellでもこれらのステートメントは用意されているが、Where-ObjectコマンドレットとForEach-Objectコマンドレットを併用することで、簡潔に記述できる。


Copyright© Digital Advantage Corp. All Rights Reserved.

       | 次のページへ
ページトップに戻る