Windows PowerShell ドライブを参照したり、Windows PowerShell ドライブ上の項目を操作したりすることは、Windows の物理ディスク ドライブ上のファイルやフォルダーを扱うことと似ています。このセクションでは、ファイルやフォルダーを操作するための特定のタスクについて説明します。
フォルダー内のすべてのファイルとフォルダーを一覧表示する
Get-ChildItem を使用すると、フォルダー内のすべての項目を直接取得できます。非表示の項目やシステム項目を表示するには、オプションの Force パラメーターを追加します。たとえば、次のコマンドでは、Windows PowerShell ドライブ C (Windows の物理 C ドライブと同じ) の直下にあるコンテンツが表示されます。
Get-ChildItem -Force C:\
Cmd.exe の DIR コマンドや UNIX シェルの ls と同様、このコマンドでは、直下に存在する項目しか表示されません。格納されているすべての項目を表示するには、-Recurse パラメーターも指定する必要があります (その場合、処理が完了するまでに時間がかかることがあります)。C ドライブのすべての内容を一覧表示するには、次のコマンドを実行します。
Get-ChildItem -Force C:\ -Recurse
Get-ChildItem では、Path、Filter、Include、Exclude パラメーターを使って項目をフィルターできますが、通常、フィルターが適用されるのは名前のみです。他の項目のプロパティも使用した複雑なフィルターを実行するには、Where-Object を使用します。
次のコマンドでは、Program Files フォルダーから、最終更新日が 2005 年 10 月 1 日以降で、サイズが 1 メガバイト以上、10 メガバイト以下という条件を満たすすべての実行可能ファイルが検索されます。
Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe | Where-Object -FilterScript {($_.LastWriteTime -gt "2005-10-01") -and ($_.Length -ge 1m) -and ($_.Length -le 10m)}
ファイルとフォルダーをコピーする
コピーを実行するには、Copy-Item を使用します。C:\boot.ini を C:\boot.bak にバックアップするには、次のコマンドを使用します。
Copy-Item -Path c:\boot.ini -Destination c:\boot.bak
コピー先のファイルが既に存在する場合、コピー操作は失敗します。既存のファイルを上書きするには、Force パラメーターを使用します。
Copy-Item -Path c:\boot.ini -Destination c:\boot.bak -Force
このコマンドは、コピー先のファイルが読み取り専用であっても使用できます。
フォルダーのコピーも同様に作用します。次のコマンドでは、C:\temp\test1 フォルダーを再帰的に新しいフォルダー c:\temp\DeleteMe にコピーします。
Copy-Item C:\temp\test1 -Recurse c:\temp\DeleteMe
項目を選択してコピーすることもできます。次のコマンドでは、c:\data 以下の任意の場所に格納されている、拡張子が .txt のすべてのファイルを c:\temp\text にコピーします。
Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination c:\temp\text
ファイル システムにおけるコピー操作には、他のツールを使用することもできます。XCOPY、ROBOCOPY、および COM オブジェクト (Scripting.FileSystemObject, など) は、どれも Windows PowerShell から実行できます。たとえば、Windows Script Host の Scripting.FileSystem COM クラスを使用して、C:\boot.ini を C:\boot.bak にバックアップするには、次のように入力します。
(New-Object -ComObject Scripting.FileSystemObject).CopyFile("c:\boot.ini", "c:\boot.bak")
ファイルとフォルダーを作成する
新しい項目の作成方法は、すべての Windows PowerShell プロバイダーに共通しています。Windows PowerShell プロバイダーに項目の種類が複数存在する場合は、項目の種類を指定する必要があります。たとえば、FileSystem Windows PowerShell プロバイダーではディレクトリとファイルが区別されます。
C:\temp\New Folder というフォルダーを新規作成するには、次のコマンドを使用します。
New-Item -Path 'C:\temp\New Folder' -ItemType "directory"
C:\temp\New Folder\file.txt という空のファイルを新規作成するには、次のコマンドを使用します。
New-Item -Path 'C:\temp\New Folder\file.txt' -ItemType "file"
フォルダー内のすべてのファイルとフォルダーを削除する
格納されている項目を削除するには Remove-Item を使用します。ただし、その項目に子項目が含まれている場合は、削除してよいかどうかを確認するメッセージが表示されます。たとえば、子項目が格納されている C:\temp\DeleteMe フォルダーを削除しようとすると、このフォルダーを削除する前に、Windows PowerShell から次のような確認メッセージが表示されます。
Remove-Item C:\temp\DeleteMe Confirm The item at C:\temp\DeleteMe has children and the -recurse parameter was not specified. If you continue, all children will be removed with the item. Are you sure you want to continue? [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):
子項目が見つかるたびに確認メッセージが表示される動作を抑制するには、Recurse パラメーターを指定します。
Remove-Item C:\temp\DeleteMe -Recurse
ローカル フォルダーを Windows でアクセス可能なドライブとしてマッピングする
subst コマンドを使用して、ローカル フォルダーをマッピングすることもできます。次のコマンドは、ローカルの Program Files ディレクトリをルートとするローカル ドライブ P を作成します。
subst p: $env:programfiles
ネットワーク ドライブの場合と同様、Windows PowerShell 内で subst を使用してマッピングされたドライブは、直ちに Windows PowerShell シェル セッションで表示できるようになります。
テキスト ファイルを配列に読み込む
テキスト データの格納形式として最も一般的なものは、異なるデータ要素を別々の行に記述することです。Get-Content コマンドレットを使用すると、ファイル全体を 1 回の手順で読み込むことができます。次にその例を示します。
PS> Get-Content -Path C:\boot.ini [boot loader] timeout=5 default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS [operating systems] multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=AlwaysOff /fastdetect multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=" Microsoft Windows XP Professional with Data Execution Prevention" /noexecute=optin /fastdetect
Get-Content は、ファイルから読み込んだデータを、ファイルの各行を 1 つの要素とする配列として扱います。このことは、返された内容の Length を調べることで確認できます。
PS> (Get-Content -Path C:\boot.ini).Length 6
このコマンドは、一連の情報を直接取得する場合に便利です。たとえば、C:\temp\domainMembers.txt ファイルに記述されている一連のコンピューター名または IP アドレスを保存するとします。このファイルには、1 行につき 1 つの名前が入力されています。Get-Content を使用して、ファイルの内容を取得し、それを $Computers という変数に格納するには、次のように入力します。
$Computers = Get-Content -Path C:\temp\DomainMembers.txt
このコマンドを実行すると、各要素が 1 つのコンピューター名を表す配列が $Computers に格納されます。