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

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

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

ファイルおよびフォルダの情報取得

 WSHではFileSystemObjectオブジェクトというCOMオブジェクトを使用し、そのメソッドを呼び出すことでファイル操作を行っていたが、PowerShellでは多くの操作がPSドライブを扱うコマンドレットによって簡便に行える。

 フォルダ内のファイルやフォルダの一覧は、これまでにも示したようにGet-ChildItemコマンドレットで容易に取得できる。WSHではFileSystemObjectオブジェクトのGetFolderメソッドでFolderオブジェクトを取得したうえで、そのFolderオブジェクトのFiles/SubFoldersプロパティを呼び出し、列挙する必要があった。

 Get-ChildItemコマンドレットがデフォルトで表示するプロパティは次のとおりである。

プロパティ名 説明
Mode ファイル/フォルダの属性
 ・d=ディレクトリ
 ・a=アーカイブ
 ・r=読み取り専用
 ・h=隠しファイル
 ・s=システム
LastWriteTime 更新日時
Length ファイル・サイズ(bytes)
Name ファイルまたはフォルダ名
Get-ChildItemコマンドレットがデフォルトで表示するプロパティ

 先ほども述べたが、Get-ChildItemコマンドレットをFileSystemドライブで用いるとFileInfoオブジェクトもしくはDirectoryInfoオブジェクトの配列を返すので、これらに定義されているほかのプロパティを参照することもできる。例えば作成日時、更新日時、アクセス日時、名前の4つのプロパティの値を取り出して表示するには、

Get-ChildItem | Select-Object CreationTime,LastWriteTime,LastAccessTime,Name

とする。

任意のプロパティを表示させる
Select-Objectコマンドレットによって、Get-ChildItemコマンドレットが出力するプロパティを変更している。

 なお、どのようなプロパティがあるかは先ほども述べたとおり、Get-Memberコマンドレットで調べることができる。

 このように複数のプロパティ値を表示できるが、数が増えると表形式では見づらくなってしまう。そのため数多くのプロパティ値を表示する場合は、Format-Listコマンドレットを使って、出力形式をリスト形式にするとよい。

 例えば、属性、作成日時、更新日時、アクセス日時、サイズ、名前、フルパスをリスト形式で表示するには次のようにする。

Get-ChildItem | Select-Object Mode,CreationTime,LastWriteTime,LastAccessTime,Size,Name,FullName | Format-List

出力形式の変更
Format-Listコマンドレットを用いてGet-ChildItemコマンドレットの出力をリスト形式で表示している。

 Sort-Objectコマンドレットを併用すると、ファイルの表示順を並べ替えることが可能だ。例えば更新日時の順に並べ替えるには次のようにする。

Get-ChildItem | Sort-Object LastWriteTime

 逆順にするには次のようにする。

Get-ChildItem | Sort-Object LastWriteTime -descending

 フォルダのみ、あるいはファイルのみを表示するには、Where-Objectコマンドレットを使って結果を絞り込む。

# フォルダのみ表示
Get-ChildItem | Where-Object {$_ -is [System.IO.DirectoryInfo]}

# ファイルのみ表示
Get-ChildItem | Where-Object {$_ -is [System.IO.FileInfo]}

 ここで「-is」はPowerShellの演算子の1つで、左辺の値が右辺の型である場合にTrueを返す。

 以上の方法は異なる型を含んだ配列を分別するのに汎用的に使えるが、フォ ルダとファイルを分別するにはPowerShell独自のプロパティPSIsContainerを使う方法もある。PSIsContainerプロパティはそのアイテムがコンテナである場合はTrueとなる。

# フォルダのみ表示
Get-ChildItem | Where-Object {$_.PSIsContainer}

# ファイルのみ表示
Get-ChildItem | Where-Object {-not $_.PSIsContainer}

 Where-Objectコマンドレットを用いたファイルの絞り込みをいくつか例示しよう。

# 拡張子が.txtのファイルのみ取得する
Get-ChildItem | Where-Object {$_.Extension.ToLower() -eq ".txt"}

# 1年以上更新されていないファイル/フォルダのみ取得する
Get-ChildItem | Where-Object {$_.LastWriteTime -le (Get-Date).AddYears(-1)}

# 読み取り専用属性が付けられたファイル/フォルダのみ取得する
Get-ChildItem | Where-Object { $_.Attributes -band [System.IO.FileAttributes]::ReadOnly}

注:ここで「-band」はビット演算子と呼ばれるもので、左辺の値に右辺のビットが立っている場合にTrueを返す(ビットごとのAND演算を表す「bitwise and」の略。ほかにビットごとのOR演算を行う-bor、NOT演算を表す-bnotがある)。「[System.IO.FileAttributes]::ReadOnly」はSystem.IO.FileAttributes列挙体のReadOnlyメンバの値を参照している。


 なお、-recurseパラメータを用いるとディレクトリの配下にあるすべてのファイルとフォルダを再帰的に列挙することができる。

ファイル/フォルダの操作

 PowerShellではコマンドレットを使ってバッチファイルと同様に、簡便にファイル操作を行える。WSHではFileSystemObjectオブジェクトのCopyFile、CopyFolder、DeleteFile、DeleteFolderなどのメソッドを用いていたが、PowerShellでは*-Itemコマンドレットを使って、ファイルもフォルダも同様に扱える。

コピー
 ファイルやフォルダのコピーにはCopy-Itemコマンドレット(エイリアスはcpi、cp、copy)を用いる。

# カレント・ディレクトリにあるtest.txtファイルをC:\tempにコピー(“-path”および-destination”は省略可)
Copy-Item -path test.txt -destination C:\temp

# C:\work\before.jpgをC:\tempにafter.jpgという名前でコピー
Copy-Item C:\work\before.jpg C:\temp\after.jpg

# C:\workに含まれるすべてのファイルとフォルダをフォルダ構造を保ったままC:\tempにコピー(C:\temp\workというフォルダが作成される)
Copy-Item C:\work C:\temp -recurse

移動
 ファイルやフォルダの移動にはCopy-Itemコマンドレット(エイリアスはmi、mv、move)を用いる。

# カレント・ディレクトリにあるtest.txtファイルをC:\tempに移動
Move-Item test.txt C:\temp

# C:\temp\test.txtというファイルをカレント・ディレクトリに移動
Move-Item C:\temp\test.txt

# C:\workにある拡張子.txtのファイルをすべてC:\tempに移動
Move-Item C:\work\*.txt C:\temp

リネーム
 ファイルやフォルダのリネームにはRename-Itemコマンドレット(エイリアスはrni、ren)を用いる。

# C:\workにあるtest.txtをtest2.txtにリネーム
Rename-Item C:\work\test.txt test2.txt

# C:\workにある“script”フォルダをPowerShellScript”フォルダにリネームする。-confirmパラメータを付けると実行の際に確認のプロンプトが表示される
Rename-Item C:\work\script PowerShellScript -confirm

確認プロンプトの表示
Rename-Itemコマンドレットに-confirmパラメータを付けて確認プロンプトを表示させている。-confirmパラメータは多くのコマンドレットで共通して用いることができる。

削除
 ファイルやフォルダの削除にはRemove-Itemコマンドレット(エイリアスはdel、erase、rmdir、rd、ri、rm)を用いる。フォルダを削除する場合、中にファイルやフォルダが存在すると確認プロンプトが表示される(-recurseパラメータを付けると表示されない)。

# C:\workにある読み取り専用属性の付いたreadonly.txtを強制削除(この場合-forceパラメータを付けないとエラーになる)
Remove-Item C:\work\readonly.txt -force

# C:\workにある0.txt、1.txt、……、9.txtをまとめて削除
Remove-Item C:\work\[0-9].txt

# C:\work\test[0].htmlを削除する。ファイル名に[]が含まれている場合は-literalPathパラメータを使う
Remove-Item -literalPath C:\work\test[0].html

フォルダの作成
 フォルダを作成するにはNew-Itemコマンドレット(エイリアスはni)を用いる。

# カレント・ディレクトリにnewfolderという名前のフォルダを作成する
New-Item newfolder -type Directory

# フォルダを作成するには標準関数のmkdirを使ってもよい。以下のコマンドは同じ効果を持つ
mkdir newfolder

属性の変更
 ファイルやフォルダの属性を変更するにはSet-ItemPropertyコマンドレット(エイリアスはsp)を用いて行う。

# カレント・ディレクトリにあるnewFolderというフォルダに読み取り専用属性をセットする(ほかの属性は解除される)
Set-ItemProperty newFolder Attributes ReadOnly

# カレント・ディレクトリにあるtest.txtファイルに隠しファイル属性と読み取り専用属性を付与する(ほかの属性は解除される)
Set-ItemProperty test.txt Attributes ([System.IO.FileAttributes]::ReadOnly -bor [System.IO.FileAttributes]::Hidden)

# カレント・ディレクトリにあるtest.txtファイルにアーカイブ属性を付与する(ほかの属性は保持される)
Set-ItemProperty test.txt Attributes ((Get-Item test.txt -force).Attributes -bor [System.IO.FileAttributes]::Archive)

# カレント・ディレクトリにあるtest.txtファイルの読み取り専用属性を解除する(ほかの属性は保持される)
Set-ItemProperty test.txt Attributes ((Get-Item test.txt -force).Attributes -band (-bnot [System.IO.FileAttributes]::ReadOnly))

更新履歴
【2010/05/21】ファイルおよびフォルダの情報取得」において、ファイルとフォルダを分類する方法として、PSIsContainerプロパティを使う方法を追加しました。


Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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