Windows PowerShell では、Windows PowerShell ドライブ内の要素 (ファイル システムのドライブにおけるファイルやフォルダー、Windows PowerShell のレジストリ ドライブにおけるレジストリ キーなど) を項目と呼びます。項目を操作するためのコマンドレットの名前には、Item という名詞が使用されます。

Get-Command -Noun Item コマンドを実行すると、Windows PowerShell には、項目用のコマンドレットが 9 つ存在することがわかります。

PS> 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)

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

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

PS> New-Item -Path c:\temp\New.Directory -ItemType Directory

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

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

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

PS> New-Item -Path C:\temp\New.Directory\file1.txt -ItemType file

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

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

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

PS> New-Item -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\_Test

   Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Micros
oft\Windows\CurrentVersion

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

レジストリのパスを入力するとき、Windows PowerShell のドライブ名には、HKLM: や HKCU: のように、コロン (:) を付ける必要があります。コロンを付けないと、パス内のドライブ名が認識されません。

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

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

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

しかし、Get-ChildItem でこのキーの子項目を検索しても、表示されるのはこのキーの OptionalComponents というサブキーだけです。

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

レジストリ エントリを項目として扱うことができれば便利ですが、一意性を確保するという観点から、レジストリ エントリのパスは指定できないようになっています。レジストリのサブキーである Run と、Run サブキーに存在する (Default) というレジストリ エントリは、パスの表記上は区別されません。また、レジストリ エントリの名前にはバックスラッシュ文字 (\) を使用できるため、仮にレジストリ エントリを項目とした場合、パス表記では、Windows\CurrentVersion\Run という名前が、レジストリ エントリなのか、このパスに存在するサブキーなのかを区別できないことになります。

既存の項目名の変更 (Rename-Item)

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

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

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

PS> Rename-Item -Path C:\temp\New.Directory\fileOne.txt c:\temp\fileOne.txt
Rename-Item : Cannot rename because the target specified is not a path.
At line:1 char:12
+ Rename-Item  <<<< -Path C:\temp\New.Directory\fileOne c:\temp\fileOne.txt

項目の移動 (Move-Item)

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

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

PS> Move-Item -Path C:\temp\New.Directory -Destination C:\ -PassThru

    Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\

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

項目のコピー (Copy-Item)

他のシェルのコピー操作に慣れていると、Windows PowerShell の Copy-Item コマンドレットの動作に違和感があるかもしれません。Copy-Item を使用してある場所から別の場所に項目をコピーした場合、既定ではその内容はコピーされません。

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

PS> 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 パラメーターを追加すると、空のフォルダーを上書きできます。

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

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

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

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

項目の削除 (Remove-Item)

ファイルおよびフォルダーを削除するには、Remove-Item コマンドレットを使用します。Remove-Item のように、重大かつ取り消すことのできない変更を伴う Windows PowerShell のコマンドレットでは、コマンドの入力時に確認のプロンプトが表示されます。たとえば、New.Directory フォルダーを削除しようとすると、フォルダーにファイルが格納されていることから、本当にコマンドを実行してよいかどうかを確認するプロンプトが表示されます。

PS> Remove-Item C:\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"):

既定では [はい] が選択されているため、フォルダーとその中に格納されているファイルを削除するには、Enter キーを押します。確認を行わずにフォルダーを削除するには、-Recurse パラメーターを使用します。

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

項目の実行 (Invoke-Item)

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

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

PS> Invoke-Item C:\WINDOWS

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

Windows Vista 以前のシステムの Boot.ini ファイルを起動するには、次のように入力します。

PS> Invoke-Item C:\boot.ini

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




目次