Windows PowerShell では、Windows PowerShell ドライブに見つかった "項目" が、Item という名詞を使って表されます。 Windows PowerShell FileSystem プロバイダーを使用している場合、ファイル、フォルダー、Windows PowerShell ドライブなどが Item に相当します。 管理上のほとんどの設定作業において、これらの項目を一覧表示したり操作したりすることは、きわめて重要かつ基本的な作業と言えます。ここでは、こうした基本的な作業について詳しく取り上げます。
ファイル、フォルダー、およびレジストリ キーの列挙 (Get-ChildItem)
特定の場所から項目のコレクションを取得することは、きわめて日常的な作業です。そのため、Get-ChildItem コマンドレットは、フォルダーなどのコンテナーに見つかったすべての項目を返すという明確な目的を持って設計されています。
C:\Windows フォルダー直下に格納されているすべてのファイルおよびフォルダーを取得するには、次のように入力します。
PS> Get-ChildItem -Path C:\Windows Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\Windows Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2006-05-16 8:10 AM 0 0.log -a--- 2005-11-29 3:16 PM 97 acc1.txt -a--- 2005-10-23 11:21 PM 3848 actsetup.log ...
一覧表示された結果を見ると、Cmd.exe の dir コマンドや、UNIX コマンド シェルの ls コマンドを実行した結果と似ていることがわかります。
Get-ChildItem コマンドレットの各種パラメーターを使用すると、非常に複雑な一覧操作を実行できます。以降では、いくつかのシナリオを例に説明していきます。Get-ChildItem コマンドレットの構文は、次のように入力すると確認できます。
PS> Get-Command -Name Get-ChildItem -Syntax
これらのパラメーターをうまく組み合わせることで、さまざまな目的に応じた出力結果を得ることができます。
格納されているすべての項目を一覧表示する (-Recurse)
Windows のフォルダー内の項目だけでなく、そのサブフォルダーに格納されているすべての項目を表示するには、Get-ChildItem の Recurse パラメーターを使用します。これにより、Windows フォルダーと、そのサブフォルダーに格納されている項目が一覧表示されます。次にその例を示します。
PS> Get-ChildItem -Path C:\WINDOWS -Recurse Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\WINDOWS Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\WINDOWS\AppPatch Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2004-08-04 8:00 AM 1852416 AcGenral.dll ...
項目を名前でフィルター処理する (-Name)
項目の名前だけを表示するには、Get-Childitem の Name パラメーターを使用します。
PS> Get-ChildItem -Path C:\WINDOWS -Name addins AppPatch assembly ...
非表示の項目を強制的に表示する (-Force)
Windows エクスプローラーや Cmd.exe で標準的に非表示となっている項目は、Get-ChildItem コマンドの出力結果にも表示されません。非表示項目を表示するには、Get-ChildItem の Force パラメーターを使用します。次にその例を示します。
Get-ChildItem -Path C:\Windows -Force
Get-ChildItem コマンドの標準的な動作を "強制的に" 無効化できるという意味で、パラメーター名には Force という言葉が使用されています。Force は、そのコマンドレットで通常は実行されないようなアクションを強制する目的で幅広く使用されているパラメーターです。ただし、システムのセキュリティを脅かすようなアクションは一切実行されません。
ワイルドカードを使って項目名を検索する
Get-ChildItem コマンドでは、一覧表示する項目のパスにワイルドカードを使用できます。
ワイルドカード検索は、Windows PowerShell エンジンによって処理されるため、その表記法はワイルドカードを使用できるすべてのコマンドレットに共通しており、また、同じマッチング動作が適用されます。Windows PowerShell のワイルドカードには、次のような表記法が存在します。
-
アスタリスク (*) は任意の文字の 0 回以上の繰り返しと一致します。
-
疑問符 (?) は 1 文字と一致します。
-
開始角かっこ ([) と終了角かっこ (]) の間に一連の文字を指定すると、その中のいずれかの文字と一致します。
次にワイルドカードの具体的な指定方法の例をいくつか紹介します。
Windows のディレクトリに存在するファイルのうち、ベース名が 5 文字で、.log で終わるすべてのファイルを検索するには、次のコマンドを入力します。
PS> Get-ChildItem -Path C:\Windows\?????.log Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\Windows Mode LastWriteTime Length Name ---- ------------- ------ ---- ... -a--- 2006-05-11 6:31 PM 204276 ocgen.log -a--- 2006-05-11 6:31 PM 22365 ocmsn.log ... -a--- 2005-11-11 4:55 AM 64 setup.log -a--- 2005-12-15 2:24 PM 17719 VxSDM.log ...
Windows のディレクトリから、アルファベット x で始まるすべてのファイルを検索するには、次のように入力します。
Get-ChildItem -Path C:\Windows\x*
名前が x または z で始まるすべてのファイルを検索するには、次のように入力します。
Get-ChildItem -Path C:\Windows\[xz]*
項目を除外する (-Exclude)
Get-ChildItem の Exclude パラメーターを使用すると、特定の項目を除外できます。これにより、1 つのステートメントで複雑なフィルター処理を実行できます。
たとえば、System32 フォルダーから Windows タイム サービスの DLL を検索する場合、DLL 名が "W" で始まること、および、名前に "32" が含まれていることだけを覚えておけば、目的の検索結果を得ることができます。
w*32*.dll のような式を使用すると、この条件を満たす DLL をすべて検索できますが、名前に "95" や "16" が含まれた、Windows 95 や 16 ビット Windows の互換性 DLL まで返されてしまう可能性があります。これらの数字が名前に含まれているファイルを除外するには、Exclude パラメーターに *[9516]* というパターンを指定します。
PS> Get-ChildItem -Path C:\WINDOWS\System32\w*32*.dll -Exclude *[9516]*
Directory: Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS\System32
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2004-08-04 8:00 AM 174592 w32time.dll
-a--- 2004-08-04 8:00 AM 22016 w32topl.dll
-a--- 2004-08-04 8:00 AM 101888 win32spl.dll
-a--- 2004-08-04 8:00 AM 172032 wldap32.dll
-a--- 2004-08-04 8:00 AM 264192 wow32.dll
-a--- 2004-08-04 8:00 AM 82944 ws2_32.dll
-a--- 2004-08-04 8:00 AM 42496 wsnmp32.dll
-a--- 2004-08-04 8:00 AM 22528 wsock32.dll
-a--- 2004-08-04 8:00 AM 18432 wtsapi32.dll
Get-ChildItem パラメーターの混用
同じコマンドの中で、Get-ChildItem コマンドレットの複数のパラメーターを使用できます。複数のパラメーターを組み合わせて指定するには、ワイルドカード検索を正しく理解している必要があります。たとえば、次のようなコマンドを実行しても、結果は返されません。
PS> Get-ChildItem -Path C:\Windows\*.dll -Recurse -Exclude [a-y]*.dll
Windows フォルダーには、アルファベット "z" で始まる DLL が 2 つ存在しますが、結果は返されません。
これは、ワイルドカードがパスの一部として指定されているためです。コマンドが再帰的に実行されたとしても、Get-ChildItem コマンドレットを使用すると、項目の検索対象の場所が、名前の最後に ".dll" が付く Windows フォルダーに限定されます。
名前が特殊なパターンと一致するファイルを再帰的に検索するように指定するには、-Include パラメーターを使用します。
PS> Get-ChildItem -Path C:\Windows -Include *.dll -Recurse -Exclude [a-y]*.dll Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\Windows\System32\Setup Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2004-08-04 8:00 AM 8261 zoneoc.dll Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\Windows\System32 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2004-08-04 8:00 AM 337920 zipfldr.dll