連載
» 2008年08月22日 05時00分 UPDATE

Tech TIPS:PowerShellのGet-ChildItemコマンドレットでファイル名の一覧を取得する(基本編)

Get-ChildItemコマンドレットを使用すれば、特定フォルダ配下のサブフォルダやファイルの一覧を取得できる。取得対象のファイルを絞り込むには、-include/-excludeオプションを使用する。サブフォルダ配下のファイルまで再帰的に取得するには、-Recurseオプションを使用する。

[山田祥寛,著]
「Tech TIPS」のインデックス

連載目次

対象ソフトウェア:Windows PowerShell



解説

 使用していない古いファイルを整理するなどの目的で、特定フォルダ配下のファイルを一覧としてテキスト・ファイルなどに落とし込みたいというケースはよくある。しかし、Windows標準のエクスプローラでは、ファイルを検索するまではできても、これを外部で利用できるような形式で出力する機能は持っていない。

 このような場合には、PowerShellのGet-ChildItemコマンドレットを利用するとよい。Get-ChildItemコマンドレットを利用することで、その結果をテキスト・ファイルにも簡単に出力することができる。

 もっとも、これだけならばコマンド・プロンプト上でdirコマンドを使ってもよいと思われるかもしれない。しかし、dirコマンドとGet-ChildItemコマンドレットとが決定的に異なる点は、ファイル・サイズや作成/更新日時などの条件を指定して、検索の対象となるフォルダ/ファイルを絞り込むことができるという点にある。dirコマンドでは実現できなかった柔軟な検索も、Get-ChildItemコマンドレットを利用することで容易に実現できる(検索条件の指定方法については、次週、別TIPSで紹介する予定である)。

 それではさっそく、具体的なGet-ChildItemコマンドレットの使い方を見ていくことにしよう。

操作方法

●Get-ChildItemコマンドレットの基本

 まずは、Get-ChildItemコマンドレットの最も基本的な使い方から見ておこう。パラメータも何も指定せずに、ただ単にGet-ChildItemコマンドレットを実行してみよう*1

*1 Get-ChildItemコマンドレットのエイリアス(別名)として「dir」や「ls」を使用してもよい。


PS > Get-ChildItem ……パラメータなしで実行する

ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\Documents and Settings\Yamada

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d-r--        2007/12/25     13:20            Favorites
d-r--        2008/05/12     14:30            My Documents
d----        2008/06/17      0:58            workspace
d-r--        2007/06/21     17:05            スタート メニュー
d----        2008/08/11      2:50            デスクトップ



 この場合、カレント・フォルダ配下に含まれるフォルダ/ファイルの内容が一覧表示される(ここでは「C:\Documents and Settings\Yamada」フォルダ配下の内容)。(カレント・フォルダではなく)特定のフォルダに含まれるフォルダ/ファイルの一覧を取得したければ、パラメータとして対象のパスを指定すればよい。

PS > Get-ChildItem C:\Windows ……フォルダを指定して実行する

ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\Windows

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2008/08/11      0:13            $NtUninstallKB940157$
d----        2007/06/07      6:18            ADDINS
d----        2008/07/09     21:29            AppPatch
d-r-s        2008/07/10      3:53            ASSEMBLY
d----        2007/06/07      6:18            Config
d----        2007/06/07      6:18            Connection Wizard
d----        2007/06/07      6:18            Cursors
d----        2008/07/09     14:40            Debug
d----        2007/06/09     23:11            Downloaded Installations
d---s        2008/06/03     22:18            Downloaded Program Files
……(以下省略)……



 すべてのフォルダ/ファイルではなく、特定のフォルダ/ファイル名で絞り込むには、-includeや-excludeオプションを使用する。-includeオプションは取得結果に含めるパスを、-excludeオプションは取得結果から除外するパスを、それぞれ指定する。例えば、以下は「C:\Windows」フォルダの配下から「KB」で始まるファイルを除く、すべての「.log」「.dat」ファイルを取得する例だ(パス末尾の「*.*」は「Windows」フォルダに含まれるすべてのファイルを対象とすることを表す)。

PS > Get-ChildItem C:\Windows\*.* -include *.log,*.dat -exclude KB* ……名前を限定して実行する

ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\Windows

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2008/08/10      9:15          0 0.LOG
-a---        2007/06/08     17:41      25359 basecsp.log
-a--s        2008/08/10      9:15       2048 BOOTSTAT.DAT
-a---        2008/07/09     15:12        546 CMSETACL.LOG
-a---        2008/02/26     23:26        516 cnsinfo.dat
-a---        2007/06/08     21:11       3626 COM+.log
-a---        2008/08/11      0:13     382049 COMSETUP.LOG
-a---        2007/06/08     15:33        403 DHCPUPG.LOG
-a---        2008/06/03     23:42      30542 DirectX.log
-a---        2008/01/18     21:24       6312 DPINST.LOG
……(以下省略)……



 複数のパスを区切るには「*.log,*.dat」のようにカンマを使用すればよい。これによって、拡張子が「.log」「.dat」であるもので、かつ、ファイル名が「KB*」で始まらないファイルだけを抽出することができる。

 また、ファイルの属性情報や最終更新日、サイズなどの付随情報が不要で、フォルダ/ファイル名だけを確認したいという場合には、-Nameオプションを使用すればよい。以下は、先ほどの条件はそのままに、合致するファイル名の一覧をファイルに出力する例である。

PS > Get-ChildItem C:\Windows\*.* -include *.log,*.dat -exclude KB* -Name > c:\result.txt



 この結果、result.txtに以下のような結果が出力されていれば成功である(ファイルの内容はtypeやmoreコマンドで確認できる)。

0.LOG
basecsp.log
BOOTSTAT.DAT
CMSETACL.LOG
cnsinfo.dat
COM+.log
COMSETUP.LOG
DHCPUPG.LOG
DirectX.log
DPINST.LOG
……(以下省略)……



●サブフォルダまで再帰的に検索を行う

 Get-ChildItemコマンドレットは、デフォルトでは指定されたフォルダ(またはカレント・フォルダ)配下のサブフォルダ/ファイル名だけを返すが、-Recurseオプションを付けると、サブフォルダ配下の内容を再帰的に取得できる。

 以下は「C:\Windows」フォルダの配下の内容をサブフォルダの内容も含めてまとめて取得する例である。

PS > Get-ChildItem C:\Windows -Recurse ……サブフォルダの内容も表示する

ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\Windows\ADDINS

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2004/08/06     18:00        797 FXSEXT.ECF

ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\Windows\AppPatch

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2008/04/14     11:25      39424 acadproc.dll
-a---        2008/04/14     11:25    1852928 acgenral.dll
-a---        2008/04/14     11:25     451072 aclayers.dll
……(中略)……

ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\Windows\ASSEMBLY

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2008/06/03     23:26            GAC
d----        2008/06/03     23:32            GAC_32
d----        2008/07/10      3:03            GAC_MSIL
d----        2007/06/07      6:19            NativeImages1_v1.1.4322
d----        2008/07/10      3:53            NativeImages_v2.0.50727_32
d----        2008/07/10      3:53            TEMP
d----        2008/07/10      3:03            TMP
……(以下省略)……



 また、先ほど登場した-Nameオプションと併せて使用した場合には、(単なるフォルダ/ファイル名だけではなく)検索先フォルダからの相対パスとして結果が表示されることになる。

PS > Get-ChildItem C:\Windows -Recurse -Name ……サブフォルダも含めて、名前だけを表示させる
ADDINS
AppPatch
ASSEMBLY
……(中略)……
ADDINS\FXSEXT.ECF
AppPatch\acadproc.dll
AppPatch\acgenral.dll
AppPatch\aclayers.dll
AppPatch\aclua.dll
……(以下省略)……



「Tech TIPS」のインデックス

Tech TIPS

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。