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
とする。
なお、どのようなプロパティがあるかは先ほども述べたとおり、Get-Memberコマンドレットで調べることができる。
このように複数のプロパティ値を表示できるが、数が増えると表形式では見づらくなってしまう。そのため数多くのプロパティ値を表示する場合は、Format-Listコマンドレットを使って、出力形式をリスト形式にするとよい。
例えば、属性、作成日時、更新日時、アクセス日時、サイズ、名前、フルパスをリスト形式で表示するには次のようにする。
Get-ChildItem | Select-Object Mode,CreationTime,LastWriteTime,LastAccessTime,Size,Name,FullName | Format-List
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
■削除
ファイルやフォルダの削除には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.