前回はカレントディレクトリの移動、ファイルの検索、削除を紹介しました。今回も、前回に引き続き、Windows PowerShell(以下PowerShell)のファイル管理を紹介します。

ディレクトリの作成と削除

PowerShellでディレクトリ(フォルダ)を作成するにはNew-Item(短縮形ni)コマンドレット、ディレクトリを削除するにはRemove-Item(短縮形ri)を使います。

ディレクトリdocsを作成するには、以下のように実行します。

New-Item docs  -type  directory

サブディレクトリ docs を作成。

カレントディレクトリ以外のディレクトリ: 例えば D:\publicのサブディレクトリとしてphotosを作成するときは、以下のように実行します。

New-Item  -path  D:\public  -name  photos  -type  directory

なお、「New-Item ディレクトリ名」とだけ実行すると、何を作成するのか「type:」というプロンプトを表示します。「directory」と入力すればサブディレクトリを作成します。

作成するアイテムのタイプの問い合わせ。

ファイルのコピー

ファイルのコピーにはCopy-Item(短縮形cp)コマンドレットを使用します。最も基本的な使い方としては、コマンドプロンプトのcopyコマンドと同様に、「Copy-Item コピー元ファイル コピー先ファイル」と実行します。

photo0001.bmpというファイルをSummer01.bmp という名前にコピー。何もメッセージを表示しません。

コピー先がディレクトリであれば、その中にコピーします。

カレントディレクトリの拡張子.tifのファイルすべてを、サブディレクトリbackupにコピー。

サブディレクトリごと他のディレクトリにコピーするときは、-Recurseオプションを使用し、「Copy-Item コピー元ディレクトリ コピー先ディレクトリ -Recurse」と実行します。

さて、前回の記事ではGet-ChildItemを使って、条件指定でファイルを検索し、パイプでRemove-Itemに渡してファイルを削除する方法を紹介しました。Copy-ItemでもGet-ChildItemの検索結果を利用できます。Copy-Itemではコピー先を-Destinationオプションで指定できますので、Get-ChildItemでコピー元を収集し、Copy-Item -Destinationでコピー先にコピーします。

カレントディレクトリ以下の拡張子.bmpと.tifのファイルをすべてC:\Tempにコピー。

なお、ファイルの移動にはMove-Itemコマンドレットを使用します。基本的な使い方はCopy-Itemと同様ですが、移動元、移動先にディレクトリのパスを指定してディレクトリ構造ごと移動するときに-Recurseオプションは不要です。

※ Copy-Item、Move-Itemとも-WhatIfオプションを使用できます。複雑な処理をするときは、念のために-WhatIfオプションで動作を検証しましょう。-WhatIfオプションについては前回記事を参照して下さい。また-Confirmオプションをつけると、確認メッセージを表示します。

※(編集部注) 掲載当初、ファイル移動のコマンドレット「Move-Item」を誤って「Remove-Item」と表記しておりました。ご迷惑をお掛けした皆様には深くお詫び申し上げます。

ロケーションとプロバイダ

さて、PowerShellのコマンドレットでは、場所をディレクトリではなくロケーション(Set-Location、Get-Location等)、操作対象をファイルやディレクトリではなくアイテム(New-Item、Copy-Item等)と呼びます。これには理由があります。

PowerShellは操作対象の世界を意味するプロバイダという新しい概念が導入しました。今までNew-ItemやCopy-Itemの対象がファイルやディレクトリだったのは、ファイルシステムが既定のプロバイダになっていたからです。プロバイダを切り替えることによって、同じコマンドレットで、ファイルやディレクトリだけでなく、レジストリや環境変数なども操作できます。プロバイダは従来のファイルシステムのドライブ名と似た感覚で使用できます。

Cドライブにtest.txtというファイルを作成。

testという環境変数を作成し、「PowerShell Test」を設定。

Cドライブのファイル、ディレクトリ一覧を表示。

環境変数の一覧を表示。

既定のプロバイダはファイルシステムですが、Set-Locationでプロバイダを切り替えることができます。たとえば「Set-Location env:」と実行すると、環境変数がカレントプロバイダになり、いちいちenv:とドライブ名をつけなくともコマンドレットは環境変数を操作します。カレントロケーションをファイルシステムに戻すときは、「Set-Location C:」などのようにファイルシステムのパスを指定します。

カレントロケーションを環境変数にしたため、プロンプトが「PS Env:\>」に。

※ もちろん、Push-Location、Pop-Locationなども、プロバイダを超えて機能します。

プロバイダ名 ドライブ文字 プロバイダ内容
Alias Alias: エイリアス(別名)登録。
Certificate Cert: デジタル署名電子証明書
Environment Env: 環境変数
FileSystem ファイルシステムのドライブ、ディレクトリ、ファイル
Function Function: 関数
Registry HKLM: HKCU: レジストリ
Variable Variable: PowerShell変数
WS-Management WSMan: WS-Management構成情報(PowerShell Ver.2のみ)

従来のコマンドプロンプトのコマンドやユーティリティであれば、ファイル管理はファイル管理の、環境変数には環境変数の、レジストリにはレジストリの...異なるプログラムが必要で、操作も統一されていませんでした。PowerShellではオブジェクト対応の機能を生かし、対象物を気にせずに同様の操作でいろいろなものを扱えるように工夫してあります。.Net Frameworkで開発すれば、独自のプロバイダを追加することもできます。

次回は、PowerShellで関数やシェルスクリプト(コマンドプロンプトのバッチプログラムに相当)を作成する方法を紹介します。