連載
» 2010年05月19日 00時00分 公開

第3回 ファイル/レジストリの操作PowerShell的システム管理入門(3/4 ページ)

[牟田口大介(Microsoft MVP for Data Center Management - PowerShell),著]

 PowerShellではテキスト・ファイルの読み書きをPSドライブのコマンドレット(*-Content)で簡便に行える。WSHではFileSystemObjectオブジェクトに含まれるTextStreamオブジェクトを利用してテキスト・ファイルをストリームとして開く必要があった。

読み込み
 テキスト・ファイルを読み込むにはGet-Contentコマンドレット(エイリアスはgc、cat、type)を用いる。

# カレント・ディレクトリにあるtest.txt(Shift-JIS)の中身を表示する
Get-Content test.txt

# カレント・ディレクトリにあるtest.txt(Shift-JIS)の最初の5行を表示する
Get-Content test.txt -totalCount 5

# C:\work\test2.txt(UTF-8)の中身を表示する
Get-Content C:\work\test2.txt -encoding UTF8

 Get-Contentコマンドレットで取得されるのは文字列の配列である。そのため、

$lines= Get-Content test.txt
$lines[2..7]

のようにすると、test.txtの3行目から8行目までだけを取得する、などといったことが可能である。

 ちなみに変数にテキスト・ファイルの全体を文字列として格納したい場合は、stringクラスのスタティック・メソッドJoin()を用いて、

$str = [string]::Join("`r`n",(Get-Content test.txt))

のように配列を連結する必要がある。(ここで`r`nは改行コードCR、LFを表す特殊文字)

 なおPowerShell 2.0では-joinという演算子が追加されているので、次のように簡単に記述できる。

$str = (Get-Content test.txt) -join "`r`n"

 Get-Contentコマンドレットを用いて取得した文字列に、各種文字列演算子を使用することでファイル内の文字列検索などが行える。例えば、

(Get-Content test.txt) -match "J"

のように-match演算子を用いると、“J”という文字列が含まれる行のみ表示することができる。

 このような文字列検索のための専用のコマンドレット、Select-Stringも用意されている。これはコマンド・プロンプトのfindコマンドに相当するもので、テキスト・ファイルもしくは文字列から特定の文字が含まれる行を検索する。先ほどと同様にtest.txt内の“J”という文字列が含まれる行を抽出するには次のようにする。

Select-String J test.txt

Select-Stringコマンドレットによる文字の検索
Select-Stringを使うと、テキスト・ファイルや文字列から特定の文字が含まれる行を検索できる。
  (1)このような内容のテキスト・ファイルがある場合を想定する。
  (2)文字列が存在するファイル名。
  (3)見つかった行番号。
  (4)見つかった行の内容。

 Select-Stringコマンドレットには、

  • ファイル名にワイルドカードを用いて複数ファイルを一括して検索する。
  • 文字列が見つかったファイル名と行番号を表示する。

という機能があるが、残念ながらPowerShell 1.0ではShift-JISコードのファイルには使用できなかった。PowerShell 2.0では-endocingパラメータが追加されていて、

Select-String あ *.txt -encoding Default

のようにしてShift-JISコードのファイルに含まれる日本語文字も正しく検索できる。

 なお、-match演算子もSelect-Stringコマンドレットも正規表現を使った検索が可能である。例えば数字が含まれる行を抽出するには、

Select-String \d test.txt

のようにする。“\d”は数字を表す正規表現だが、検索文字列に正規表現を用いたくない場合は、Select-Stringコマンドレットの-simpleMatchパラメータを使用する。

Select-String \d test.txt -simpleMatch

 このようにすると、検索文字列は正規表現とは解釈されず、「\d」という文字列を検索する。一方-match演算子は常に正規表現で検索を行うが、代わりにワイルドカード(*)を指定して検索する-like演算子を使えば、正規表現を用いない文字列検索が可能になる。

(Get-Content test.txt) -like "*\d*"

 これも「\d」という文字列を検索するコマンドになる。

 なお、-match演算子や-like演算子を配列ではない文字列に対して使用すると、検索文字列が見つかった場合はTrue、見つからなかった場合はFalseを返す。

書き出し
 文字列をテキスト・ファイルに書き込むことも可能である。それにはSet-Contentコマンドレット(エイリアスはsc)、Add-Contentコマンドレット(エイリアスはac)を用いる。

# カレント・ディレクトリにtest.txtというファイルを作成し、“あいうえお”という文字列を書き込む(もしすでに同名のファイルがある場合は上書きされる)
Set-Content test.txt "あいうえお"

# カレント・ディレクトリに存在するtest.txtというテキスト・ファイルの末尾に“かきくけこ”という文字列を追記する
Add-Content test.txt "かきくけこ"

# C:\work\test.txtというUTF-8のテキスト・ファイルを新規作成し、現在時刻を書き込む
Set-Content C:\work\test.txt (Get-Date) -encoding UTF8

 コマンド・プロンプトのように、リダイレクト記号を使って文字列をファイルに書き込むことも可能である。

# test.txtというファイルを作成し、“Hello PowerShell World!”という文字列を書き込む(もしすでに同名のファイルがある場合は上書きされる)
"Hello PowerShell World!" > test.txt

# カレント・ディレクトリに存在するtest.txtというテキスト・ファイルの末尾に“Have a happy Scripting Life!”という文字列を追加する
"Have a happy Scripting Life!" >> test.txt

 リダイレクト記号を用いた場合、Unicodeエンコーディングで保存される。なおPowerShell 1.0、2.0では入力リダイレクト(<)を用いることができないので注意してもらいたい。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。