PowerShellでファイルやフォルダーを操作する:Tech TIPS
PowerShellでは、ファイル/フォルダーを操作するためにさまざまなコマンドレットが用意されている。新規のファイル/フォルダーを作成するには、New-Itemコマンドレットを使用する。既存のファイル/フォルダーを削除するには、Remove-Itemコマンドレットを使用する。既存のファイル/フォルダーをコピーするには、Copy-Itemコマンドレットを使用する。既存のファイル/フォルダーを移動するには、Move-Itemコマンドレットを使用する。
対象ソフトウェア:Windows PowerShell
解説
TIPS「PowerShellのGet-ChildItemコマンドレットでファイル名の一覧を取得する(基本編)」「PowerShellのGet-ChildItemコマンドレットでファイル名の一覧を取得する(応用編)」では、ファイル・システムからファイルの一覧を取得する方法について解説した。本稿では、引き続きPowerShellでファイルやフォルダーを操作する方法について解説する。本稿で紹介するのは、以下のコマンドレットである。
コマンドレット | 主なエイリアス | 概要 |
---|---|---|
New-Item | ni | 新規のファイル/フォルダーを作成 |
Remove-Item | rm/rmdir/del | 既存のファイル/フォルダーを削除 |
Copy-Item | copy/cp | 既存のファイル/フォルダーをコピー |
Move-Item | move/mv | 既存のファイル/フォルダーを移動 |
PowerShellにおけるファイル操作にかかわるコマンドレット |
これらコマンドレットによって提供される機能は、コマンド・プロンプトのユーザーであれば、ごくおなじみのものであり、実際、PowerShellで提供されるエイリアスによって、(基本的な機能であれば)ほぼコマンド・プロンプトと同じ感覚で利用できる。
もっとも、使えるオプションなどはコマンドレット独自のものも多くあるので、コマンド・プロンプト・ユーザーの方はおなじみの機能との違いも意識しながら、PowerShellのこれら基本的な機能を理解していってほしい。
操作方法
●ファイル/フォルダーを新規に作成する
まずはファイル/フォルダーを新規に作成する方法を解説する。ファイル/フォルダーを作成するには、New-Itemコマンドレットを使用する。例えば「c:\tmp」フォルダーの中に新規のwindows_tipsフォルダーを作成するには、以下のように記述する。
PS > New-Item c:\tmp\windows_tips -itemType Directory
ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\tmp
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2008/08/16 23:58 windows_tips
相対パスを使って、次のように記述しても構わない。
PS > Set-Location c:\tmp
PS > New-Item windows_tips -itemType Directory
-itemTypeパラメータは、新規に作成する新しい項目の種類を表すものである。ここでは「Directory」を指定しているのでフォルダー(ディレクトリ)が新規に作成されるが、ファイルを作成したい場合には「File」と指定すればよい。
ちなみに、ここでは「C:\tmp」とすでにあるフォルダーの直下にフォルダー(ファイル)を作成しているが、上位フォルダーが存在しない場合にもNew-Itemコマンドレットは再帰的に上位のフォルダーを作成してくれる。例えば、以下のようなケースだ。
PS C:\tmp> New-Item c:\tmp\x\y\z -itemType Directory
ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\tmp\x\y
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2008/08/17 0:16 z
新規に作成する「z」フォルダーの上位に「x\y」フォルダーが存在しなくても、「x」と「y」フォルダーが再帰的に生成され、(もちろん)「z」フォルダーも正しく生成されることが確認できるはずだ。
さらに、ファイルを新規に作成する場合には、-Valueオプションを指定することで、ファイルの内容も同時に作成できる。例えば、次の例を見ていただきたい。
PS > New-Item c:\tmp\item.dat -itemType File -Value "今日も暑いです。"
ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\tmp
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2008/08/17 0:22 24 item.dat
生成されたitem.datを開いてみると、確かに-Valueプロパティで指定された内容が出力されていることが確認できるはずだ。ただし、New-Itemコマンドレットで文字列を出力する場合、文字エンコーディングは固定でUTF-8となるので注意してほしい。異なる文字コードでの出力を行う方法については、TIPS「PowerShellで複数のファイルの文字コードを一括変換する」も参考にしていただきたい。
●同名のファイル/フォルダーが存在する場合
同名のファイル/フォルダーがすでに存在する場合、New-Itemコマンドレットはエラーを返す。
PS > New-Item c:\tmp\item.dat -itemType File
New-Item : ファイル 'C:\tmp\item.dat' は既に存在します。
発生場所 行:1 文字:9
+ New-Item <<<< c:\tmp\item.dat -itemType File
既存のファイル/フォルダーが存在する場合にもこれを強制的に上書きしたい場合には-Forceオプションを付ける。
PS > New-Item c:\tmp\item.dat -itemType File -Force
ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\tmp
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2008/08/17 0:34 0 item.dat
このとき、作成する対象がファイルである場合には、内容は新たに作成されたファイルで上書きされるが(デフォルトでは空のファイルが作成される)、対象がフォルダーならば、New-Itemコマンドレットは何も処理を行わない。
また、処理対象のファイルが読み取り専用になっている場合には、-Forceオプションを付与しても上書きは行われず、処理は失敗する。
PS > New-Item c:\tmp\item.dat -itemType File -Force
New-Item : パス 'C:\tmp\item.dat' へのアクセスが拒否されました。
発生場所 行:1 文字:9
+ New-Item <<<< c:\tmp\item.dat -itemType File -Force
●ファイルを削除する
ファイルを削除するのは、Remove-Itemコマンドレットの役割だ。例えば「c:\tmp」フォルダー配下のitem.datを削除するには、以下のように記述する。
PS > Remove-Item c:\tmp\item.dat
Remove-Itemコマンドレットではワイルドカードも利用できるので、もしも「c:\tmp」フォルダー配下の「.txt」ファイルをすべて削除したいという場合には、以下のように記述してもよい。
PS > Remove-Item c:\tmp\*.txt
そのほか、より細かく削除対象の要素を指定したい場合には、-Include、-Excludeオプションを使用することも可能であるが、これらの使い方はTIPS「PowerShellのGet-ChildItemコマンドレットでファイル名の一覧を取得する(基本編)」を参照していただきたい。
これがファイルを削除する基本的な方法であるが、読み取り専用のファイルを削除する場合は気を付けてほしい。
PS > Remove-Item c:\tmp\item.dat
Remove-Item : 項目 C:\tmp\item.dat を削除できません: 操作を実行するために十分なアクセス許可がありません。
発生場所 行:1 文字:12
+ Remove-Item <<<< c:\tmp\item.dat
これは、読み取り専用属性の付いたitem.datを削除しようとした場合の例だ。デフォルトではRemove-Itemコマンドレットは読み取り専用のファイルを削除できずにエラーとなってしまう。読み取り専用のファイルを強制的に削除したい場合には、次のように-Forceオプションを指定する。
PS > Remove-Item c:\tmp\item.dat -Force
●フォルダーを削除する
フォルダーを削除する場合にもRemove-Itemコマンドレットは使用できるが、配下にサブファイル/フォルダーが存在する場合には、要注意だ。以下は、配下にファイルを含むフォルダーを削除した場合の結果例である。
PS > Remove-Item c:\tmp\windows_tips
確認
C:\tmp\windows_tips の項目には子があり、Recurseパラメータが指定されていませんでした。続行した場合、項目と共にすべての子が削除されます。続行しますか?
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "Y"):
このようにすべての子要素を併せて削除するか、確認のメッセージが返される。ここで[Y]を選択すると子要素をまとめて削除できるが、もちろん、スクリプト実行の局面では、このような確認メッセージが表示されること自体、煩わしいということもあるだろう。そのような場合には、-Recurseオプションを付与することで、配下の要素を再帰的に削除することができる(この場合、確認メッセージは表示されない)。
PS > Remove-Item c:\tmp\windows_tips -Recurse
●ファイル/フォルダーをコピー/移動する
ファイル/フォルダーをコピー/移動するのは、それぞれCopy-Item/Move-Itemコマンドレットの役割である。両者の使い方はほぼ共通しているので、本稿ではまとめて解説する。以下は、それぞれ「C:\tmp\windows_tips」フォルダーを「c:\tmp\tips」フォルダーに移動/コピーする例である。
PS > Move-Item C:\tmp\windows_tips c:\tmp\tips
PS > Copy-Item C:\tmp\windows_tips c:\tmp\tips
フォルダーを移動/コピーする場合には、(単に移動とコピーという違い以上に)挙動が異なるので要注意である。というのも、フォルダー配下に何らかの要素が含まれる場合、Move-Itemコマンドレットは無条件にすべての要素を移動するが、Copy-Itemコマンドレットは指定されたフォルダーのみをコピーする。もしも配下の要素をまとめてコピーしたい場合には、-Recurseオプションを指定する必要がある。
そのほか、Move-Item/Remove-Itemコマンドレットでは対象の要素を指定するに当たって、ワイルドカードや-Include/-Excludeオプションを指定することも可能であるが、これらについてはTIPS「PowerShellのGet-ChildItemコマンドレットでファイル名の一覧を取得する(基本編)」を参照してほしい。
●ファイル/フォルダー操作を安全に行う方法
ファイル/フォルダー操作――特に削除や作成(上書き)といった操作は、元に戻すことができないという意味で、特に慎重に行うべき操作だ。このような操作を行う場合に便利な2つのオプションが、これらコマンドレットには用意されている。
まずは-WhatIfコマンドレットである。-WhatIfコマンドレットは、指定されたコマンドを実際には実行せず、コマンドを実行した場合の結果だけが表示される。例えば、以下のようになる。
PS > Remove-Item c:\tmp\* -Recurse -WhatIf
WhatIf: 対象 "C:\tmp\tips2" に対して操作 "ディレクトリの削除" を実行しています。
WhatIf: 対象 "C:\tmp\tmp" に対して操作 "ディレクトリの削除" を実行しています。
WhatIf: 対象 "C:\tmp\windows_tips" に対して操作 "ディレクトリの削除" を実行しています。
WhatIf: 対象 "C:\tmp\windows_tips2" に対して操作 "ファイルの削除" を実行しています。
これにより、コマンドを実行する前に、コマンドが意図した動作をしているのかを確認できるので、(例えば)削除対象の要素をワイルドカードや-Include/-Excludeオプションで複雑に指定していた場合にも、意図しない要素が処理されてしまったというようなことを防ぐことができる。
また、-Confirmオプションを付与することで、コマンドを実行する際に実行の是非を確認することも可能である。
PS > Remove-Item c:\tmp\* -Recurse -Confirm
確認
この操作を実行しますか?
対象 "C:\tmp\tips2" に対して操作 "ディレクトリの削除" を実行しています。
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "Y"):
……(以下省略)……
このように、対象の要素それぞれについて実行前にメッセージが表示される。これによって、実行過程を目視確認しながら作業を進めることができるようになる。
元に戻せない(戻しにくい)操作を行う場合には、これらのオプションも併用しつつ、確実にファイル/フォルダー操作を行ってほしい。
■この記事と関連性の高い別の記事
- PowerShellのGet-ChildItemコマンドレットでファイル名の一覧を取得する(基本編)(TIPS)
- WindowsのPowerShellでパス文字列を操作する(TIPS)
- PowerShellのGet-ChildItemコマンドレットでファイル名の一覧を取得する(応用編)(TIPS)
- PowerShellを使って指定したファイルをインターネットからダウンロードする(TIPS)
- PowerShellでレジストリ情報を操作する(TIPS)
Copyright© Digital Advantage Corp. All Rights Reserved.