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 ファイルがメモ帳で開きます。