項目を直接操作する

ファイル、フォルダー、レジストリ キーなど、PowerShell ドライブ内の表示される要素は、PowerShell では "項目" と呼ばれます。 項目を操作するためのコマンドレットは、名前に Item という名詞の部分があります。

Get-Command -Noun Item コマンドの出力では、PowerShell 項目のコマンドレットが 9 個あることが示されています。

Get-Command -Noun Item
CommandType     Name                            Definition
-----------     ----                            ----------
Cmdlet          Clear-Item                      Clear-Item [-Path] <String[]...
Cmdlet          Copy-Item                       Copy-Item [-Path] <String[]>...
Cmdlet          Get-Item                        Get-Item [-Path] <String[]> ...
Cmdlet          Invoke-Item                     Invoke-Item [-Path] <String[...
Cmdlet          Move-Item                       Move-Item [-Path] <String[]>...
Cmdlet          New-Item                        New-Item [-Path] <String[]> ...
Cmdlet          Remove-Item                     Remove-Item [-Path] <String[...
Cmdlet          Rename-Item                     Rename-Item [-Path] <String>...
Cmdlet          Set-Item                        Set-Item [-Path] <String[]> ...

新しい項目の作成

ファイルシステムで新しい項目を作成するには、New-Item コマンドレットを使用します。 項目のパスを指定した Path パラメーターと、file または directory という値を指定した ItemType パラメーターを組み込みます。

たとえば、C:\Temp ディレクトリに New.Directory という名前の新しいディレクトリを作成するには、次のように入力します。

New-Item -Path c:\temp\New.Directory -ItemType Directory
    Directory: Microsoft.PowerShell.Core\FileSystem::C:\temp

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2006-05-18  11:29 AM            New.Directory

ファイルを作成するには、ItemType パラメーターの値を file に変更します。 たとえば、New.Directory ディレクトリに file1.txt という名前のファイルを作成するには、次のように入力します。

New-Item -Path C:\temp\New.Directory\file1.txt -ItemType file
    Directory: Microsoft.PowerShell.Core\FileSystem::C:\temp\New.Directory

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2006-05-18  11:44 AM          0 file1

同じ手法を使用して、新しいレジストリ キーを作成できます。 実際には、Windows レジストリの項目の種類はキーしかないため、レジストリ キーの作成は簡単です。 (レジストリ エントリは項目の "プロパティ" です。)たとえば、CurrentVersion サブキーに _Test という名前のキーを作成するには、次のように入力します。

New-Item -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\_Test
   Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

SKC  VC Name                           Property
---  -- ----                           --------
  0   0 _Test                          {}

レジストリ パスを入力するときは、PowerShell のドライブ名 HKLM:HKCU: に、必ずコロン (:) を含めます。 コロンがないと、PowerShell が、パス内のドライブ名を認識しません。

レジストリ値が項目ではない理由

Get-ChildItem コマンドレットを使用してレジストリ キーの項目を検索する場合は、実際のレジストリ エントリやその値は表示されません。

たとえば、レジストリ キー HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run には通常、システムの起動時に実行するアプリケーションを表すいくつかのレジストリ エントリが含まれます。

ただし、Get-ChildItem を使用してキーの子項目を参照する場合、キーの OptionalComponents サブキーのみが表示されます。

Get-ChildItem HKLM:\Software\Microsoft\Windows\CurrentVersion\Run
   Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
SKC  VC Name                           Property
---  -- ----                           --------
  3   0 OptionalComponents             {}

レジストリ エントリを項目として処理することは便利ですが、レジストリ エントリへのパスを一意な方法で指定できません。 パスの表記法では、Run という名前のレジストリ サブキーと、Run サブキーの (Default) レジストリ エントリを区別しません。 さらに、レジストリ エントリの名前にバックスラッシュ文字 (\) を含めることができるので、レジストリ エントリが項目だった場合は、パスの表記法を使用して Windows\CurrentVersion\Run という名前のレジストリ エントリとそのパスに配置されているサブキーを区別することはできません。

既存の項目の名前変更

ファイルまたはフォルダーの名前を変更するには、Rename-Item コマンドレットを使用します。 次のコマンドによって、file1.txt ファイルの名前が fileOne.txt に変更されます。

Rename-Item -Path C:\temp\New.Directory\file1.txt fileOne.txt

Rename-Item コマンドレットは、ファイルまたはフォルダーの名前を変更できますが、項目を移動することはできません。 次のコマンドは、New.Directory ディレクトリから Temp ディレクトリにファイルを移動しようとするため失敗します。

Rename-Item -Path C:\temp\New.Directory\fileOne.txt c:\temp\fileOne.txt
Rename-Item : can't rename because the target specified isn't a path.
At line:1 char:12
+ Rename-Item  <<<< -Path C:\temp\New.Directory\fileOne c:\temp\fileOne.txt

項目の移動

ファイルまたはフォルダーを移動するには、Move-Item コマンドレットを使用します。

たとえば、次のコマンドは、New.Directory ディレクトリを C:\temp ディレクトリから C: ドライブのルートに移動します。 項目が移動されたことを確認するには、Move-Item コマンドレットの PassThru パラメーターを含めます。 PassThru を指定しないと、Move-Item コマンドレットで結果は表示されません。

Move-Item -Path C:\temp\New.Directory -Destination C:\ -PassThru
    Directory: Microsoft.PowerShell.Core\FileSystem::C:\

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2006-05-18  12:14 PM            New.Directory

項目のコピー

他のシェルでのコピー操作を使い慣れている場合は、PowerShell の Copy-Item コマンドレットの動作が普通ではないように思えることがあります。 1 つの場所から別の場所に項目をコピーする場合、Copy-Item の既定では、その内容がコピーされません。

たとえば、New.Directory ディレクトリを C: ドライブから C:\temp ディレクトリにコピーすると、コマンドは成功しますが、New.Directory ディレクトリのファイルはコピーされません。

Copy-Item -Path C:\New.Directory -Destination C:\temp

C:\temp\New.Directory の内容を表示すると、ファイルが含まれていないことがわかります。

PS> Get-ChildItem -Path C:\temp\New.Directory
PS>

なぜ Copy-Item コマンドレットは内容を新しい場所にコピーしないのでしょうか?

Copy-Item コマンドレットは、汎用になるように設計されており、ファイルやフォルダーをコピーするだけではありません。 また、ファイルとフォルダーをコピーする場合でも、コンテナーのみをコピーして、その中の項目はコピーしないようにすることが望ましいことがあります。

フォルダーのすべての内容をコピーするには、コマンドに Copy-Item コマンドレットの Recurse パラメーターを含めます。 既に内容なしでディレクトリをコピーした場合は、Force パラメーターを追加すると、空のフォルダーを上書きできます。

Copy-Item -Path C:\New.Directory -Destination C:\temp -Recurse -Force -Passthru
    Directory: Microsoft.PowerShell.Core\FileSystem::C:\temp

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2006-05-18   1:53 PM            New.Directory

    Directory: Microsoft.PowerShell.Core\FileSystem::C:\temp\New.Directory

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2006-05-18  11:44 AM          0 file1

アイテムを削除する

ファイルおよびフォルダーを削除するには、Remove-Item コマンドレットを使用します。 Remove-Item など、元に戻せない重要な変更が可能な PowerShell コマンドレットでは、コマンドを入力したときに確認のプロンプトを表示することがよくあります。 たとえば、New.Directory フォルダーを削除しようとする場合、フォルダーにファイルが含まれているため、コマンドの確認が求められます。

Remove-Item C:\temp\New.Directory
Confirm
The item at C:\temp\New.Directory 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"):

Yes が既定の応答であるので、フォルダーとそのファイルを削除するには、Enter キーを押します。 確認せずにフォルダーを削除するには、Recurse パラメーターを使用します。

Remove-Item C:\temp\New.Directory -Recurse

項目の実行

PowerShell は、Invoke-Item コマンドレットを使用して、ファイルまたはフォルダーの既定のアクションを実行します。 この既定のアクションは、レジストリの既定のアプリケーション ハンドラーによって決定されます。効果はファイル エクスプローラー内で項目をダブルクリックする場合と同じです。

たとえば、次のコマンドを実行するとします。

Invoke-Item C:\WINDOWS

C:\Windows にあるエクスプローラー ウィンドウが、C:\Windows フォルダーをダブルクリックしたときのように表示されます。

Windows Vista より前のシステムで Boot.ini ファイルを起動する場合:

Invoke-Item C:\boot.ini

.ini のファイル タイプがメモ帳と関連付けられている場合、boot.ini ファイルはメモ帳で開きます。