ファイルとフォルダーの操作

PowerShell ドライブ間の移動と、そこにある項目の操作は、Windows の物理ディスク ドライブ上のファイルやフォルダーの操作と似ています。 この記事では、PowerShell を使用して特定のファイルとフォルダーを操作するタスクについて説明します。

フォルダー内のすべてのファイルとフォルダーの一覧表示

Get-ChildItem を使うと、フォルダー内のすべての項目を直接取得することができます。 非表示の項目やシステム項目を表示するには、オプションの Force パラメーターを追加します。 たとえば、このコマンドを使うと、PowerShell ドライブ C: の直下にある内容が表示されます。

Get-ChildItem -Path C:\ -Force

このコマンドを使うと、直下にある項目のみが一覧表示されます。これは cmd.exedir コマンドや UNIX シェルの ls を使った場合と同様です。 サブフォルダー内の項目を表示するには、Recurse パラメーターを指定する必要があります。 次のコマンドを使うと、C: ドライブ上のすべての項目が一覧表示されます。

Get-ChildItem -Path C:\ -Force -Recurse

Get-ChildItem は、PathFilterIncludeExclude の各パラメーターを使用して項目をフィルター処理できますが、通常、これらは名前にのみ基づいています。 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 1mb) -and ($_.Length -le 10mb)
    }

ファイルとフォルダーのコピー

コピーは Copy-Item を使用して行われます。 次のコマンドは、PowerShell プロファイル スクリプトをバックアップします。

if (Test-Path -Path $PROFILE) {
    Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak')
}

Test-Path コマンドは、プロファイル スクリプトが存在するかどうかを確認します。

コピー先のファイルが既に存在する場合、コピー操作は失敗します。 既存のコピー先ファイルを上書きするには、Force パラメーターを使用します。

if (Test-Path -Path $PROFILE) {
    Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', '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.exerobocopy.exe などのネイティブ コマンドを実行してファイルをコピーすることもできます。

ファイルとフォルダーの作成

新しい項目の作成は、すべての PowerShell プロバイダーで同じ方法で行われます。 PowerShell プロバイダーに複数の種類の項目が含まれている場合 (たとえば、FileSystem 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

重要

Force スイッチを New-Item コマンドで使用してフォルダーを作成し、そのフォルダーが既に存在している場合は、フォルダーが上書きされたり、置き換えたりすることはありません。 単に既存のフォルダー オブジェクトを返します。 ただし、既に存在するファイルに対して New-Item -Force を使用すると、ファイルは上書きされます。

フォルダー内のすべてのファイルとフォルダーの削除

内包されている項目を削除するには、Remove-Item を使用します。ただし、その項目に他の何らかの項目が含まれている場合は、削除の確認を求められます。 たとえば、他の項目を含むフォルダー C:\temp\DeleteMe を削除しようとすると、フォルダーが削除される前に、PowerShell から次のような確認メッセージが表示されます。

Remove-Item -Path C:\temp\DeleteMe
Confirm
The item at C:\temp\DeleteMe has children and the Recurse parameter wasn't
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 -Path C:\temp\DeleteMe -Recurse

ローカル フォルダーのドライブとしてのマップ

New-PSDrive コマンドを使用することにより、ローカル フォルダーをマッピングすることもできます。 次のコマンドでは、ローカルの Program Files ディレクトリをルートとする PowerShell セッションからのみ参照できる、ローカル ドライブ P: が作成されます。

New-PSDrive -Name P -Root $env:ProgramFiles -PSProvider FileSystem

ネットワーク ドライブと同様に、PowerShell 内でマッピングされたドライブは、直ちに PowerShell シェルに表示されます。 エクスプローラーから見えるマップ済みドライブを作成するには、Persist パラメーターを使います。 ただし、Persist で使用できるのはリモートのパスのみです。

配列へのテキスト ファイルの読み込み

テキスト データの一般的な格納形式の 1 つに、個々の行を個別のデータ要素として扱うファイルを使用する方法があります。 Get-Content コマンドレットを使用することにより、1 つのステップでファイル全体を読み取ることができます。以下にその例を示します。

Get-Content -Path $PROFILE
# Load modules and change to the PowerShell-Docs repository folder
Import-Module posh-git
Set-Location C:\Git\PowerShell-Docs

Get-Content は、ファイルから読み取ったデータを、1 行のファイル内容につき 1 つの要素を含む配列として扱います。 これを確認するには、返された内容の Length をチェックします。

PS> (Get-Content -Path $PROFILE).Length
3

このコマンドは、情報の一覧を PowerShell に取得するときに最も役立ちます。 たとえば、コンピューター名または IP アドレスの一覧を、ファイルの各行に 1 つの名前を入力して C:\temp\domainMembers.txt ファイルに保存できます。 Get-Content を使用してファイルの内容を取得し、変数 $Computers に格納するには、次のように入力します。

$Computers = Get-Content -Path C:\temp\DomainMembers.txt

$Computers には、各要素に 1 つのコンピューター名が含まれた配列が格納されます。