システム管理の主要な仕事の一つはディスク管理、ファイル管理です。今回はファイル管理を想定してWindows PowerShell(以下PowerShell)を紹介します。

カレントディレクトリの移動

PowerShellのカレントディレクトリの移動には Set-Location (省略形 sl)コマンドレットを使用します。

Set-Location  移動先のパス

移動先のパスの指定は、基本的にコマンドプロンプトのcdコマンドと同様に指定できますが、パスにドライブ文字が含まれていた場合、Set-Locationではカレントドライブも変更します。

Set-Locationで、D:\64Bitに移動。パス区切り文字には¥だけでなく/も使用できます。

現在のパスを知りたいときは、Get-Locationコマンドレットを使用します。また、Push-Locationで現在位置を記憶し、Pop-Locationで記憶したパスに戻ります。

ファイルの検索

ファイル管理の基本は、目的のファイルを特定(検索・絞り込み)し、そのファイルに対して操作(コピー、移動、削除、ファイル名変更など)することの繰り返しです。まず、検索...コマンドプロンプトでいうdirコマンド...を紹介します。

PowerShellでファイルを一覧表示するコマンドレットはGet-ChildItem(省略形gci)で、カレントディレクトリのファイルを一覧表示するだけであればdirコマンドとあまり違和感なく使えます。しかし、より使いこなすためには、以下の基本パターンを覚えて下さい。

Get-ChildItem  検索開始パス  -Include  検索ファイル名 -Exclude 除外ファイル名 -Recurse

-Recurseはサブフォルダも含めて検索するときに指定するオプションで、-Recurseを使用するときは、検索開始パスも指定しなければなりません。またファイル名を列挙するときはカンマ(,)で区切ります。たとえば、C:\Usersディレクトリ以下のディレクトリから、拡張子が.jpgか.bmpで、ファイル名がpで始まらないファイルを検索するには、以下のように実行します。

Get-ChildItem  C:\Users  -Include  *.jpg,*.bmp  -Exclude p*  -Recurse

複雑な条件も比較的簡単に設定できるGet-ChildItem。

カレントディレクトリ以下から検索するのであれば、検索開始パスにカレントディレクトリを意味するピリオド(.)を指定します。

※ ファイル名のみを出力したいときは-Name、隠しディレクトリ・ファイルも検索したいときは-Forceなどのオプションもあります。ただし、アクセス権を持たないディレクトリを検索することはできません。

ファイルの削除とパイプライン

PowerShellでファイルを削除するコマンドレットはRemove-Item(省略形ri)です。たとえば、カレントディレクトリの拡張子.tmpのファイルをすべて削除するなら、コマンドプロンプトのdelコマンドと同様に以下のように実行します。

Remove-Item *.tmp

削除したいファイルをカンマで区切って複数指定することもできます。

*.tmpと*.bakの両方を削除。削除しても特にメッセージは表示しません。確認メッセージを表示させるには -Confirm オプションを指定します。

Rmove-Itemには、Get-ChildItemと同様に-Include、-Exclude、-Recurse等のオプションがありますが、-Recurseオプションを使用にはいくつかの面倒な条件があります。そこで活躍するのがPowerShellのパイプラインです。Child-Itemの出力をパイプでRemove-Itemに受け渡せば、Get-ChildItemの使い方を覚えるだけでファイルの削除に応用できます。

たとえば、カレントディレクトリ以下の*.jpgと*.bmpをまとめて削除するには、以下のように実行します。

Get-ChildItem  .  -Include *.jpg,*.bmp -Recurse | Remove-Item

単なるテキストではなくオブジェクトを受け渡すPowerShellのパイプでなければできない処理です。

実行のシミュレーション機能、-WhatIfオプション

ところで、うっかりワイルドカードでファイル名を指定して削除を実行し、必要なファイルを消してしまったことに気がついて青ざめたことはないでしょうか? 削除したファイルがごみ箱に入っていればいいですが...必ずしもごみ箱に残っているとは限りません。

こうした「事故」防止のため、PowerShellのコマンドレットで対象物を直接操作するコマンドレット(Remove-ItemやCopy-Itemなど)には、-WhatIfオプションが用意されています。-WhatIfオプションをつけて実行すると、実際には処理を行っていないのに、処理を行ったかのようにメッセージを表示します。

Get-ChildItem  .  -Include *.jpg,*.bmp -Recurse | Remove-Item  -WhatIf

-WhatIfをつけて実行すると、「削除しました」と表示しますが、実際には削除していません。

-WhatIfで実行結果を確認してから、それでまちがいがなければ、-WhatIfオプションをはずして再実行します。

コマンドラインの再実行

PowerShellには、コマンドラインの履歴機能があります。-WhatIfオプションをつけて実行結果を確認した後、-WhatIfをはずして本番を実行したいときには、↑キーを押して下さい。前回の入力行を呼び出して、最後の-WhatIfだけ削除して再実行します。

PowerShellの履歴機能には以下のようなキー操作があります。

キー 機能
一つ前の行を表示します。
一つ次の行を表示します。
F7 履歴をウィンドウで表示し、選択実行できます。
F8 1つ以上の文字を入力した後にF8キーを押すと、該当するコマンドラインを検索して表示します。
F9 履歴IDを入力して実行します。

F7キーで履歴を表示。↑↓キーで選択してEnterキーで実行できます。

また、関連して以下のようなコマンドレットがあります。

コマンドレット 機能
Get-History コマンドライン履歴の履歴IDとコマンドラインを一覧表示します。このIDは、前述のF9キーの機能や、後述のInvokeコマンドレットで使用できます。
Invoke-History 履歴IDを指定して、コマンドライン履歴を実行します。
Add-History 指定した文字列をコマンドラインとして履歴に追加します。
Clear-History コマンドライン履歴を消去します。

Get-Historyで履歴を表示。Invoke-Historyで実行。

こうした履歴機能を使うことで、コマンドライン入力をかなり軽減できます。