Get-ChildItem: PowerShellでファイルとフォルダを一覧表示する

DOSのdirコマンドの良い古き良き時代を覚えていますか?Linuxのlsコマンドはどうですか?それなら、Get-childItemはそれをさらに進化させたものです。

実際、PowerShellにはdirlsのエイリアスがあります。Get-Childitem PowerShellコマンドレットは、PowerShellコンソールまたはPowerShell スクリプトを通じてファイルシステム上のファイルとフォルダをリストするだけでなく、レジストリキーと値、さまざまな証明書ストアの証明書、さらにはActive Directoryなどを列挙することもできます。

初級/中級のPowerShellスクリプタの方は、PowerShellツールの作成に関する無料のミニコースもぜひご覧ください!PowerShellツールの作成方法について、9,000語以上の深い説明と洞察が提供されています。

Get-Childitemを理解するためには、まず、単にファイルではなく多くのオブジェクトを子アイテムとして扱い、列挙する点でdirlsと同様と考えてください。エイリアスまたは完全なコマンド名を使用してそれを使用できます。

このコマンドはPowerShell v1以降で利用可能なので、PowerShellのバージョンとの互換性が保証されています。

Get-ChildItemはツリーをトラバースします。

A file system is a hierarchy. It has a folder structure with files inside of folders and those folders inside of other folders. A file system is like a tree. That tree has a trunk (C:\ for example) and “branches” coming off of it (folders). In fact, we even have a tree command.

PS> tree
Folder PATH listing for volume HD
Volume serial number is 0000007B 22DC:666C
C:.
 \modules
   \AdsiPS
     \1.0.0.2
       \Public
       \AWSPowerShell
<SNIP>

このコマンドをローカルコンピュータのローカルパス、PowerShellリモートスクリプトブロックおよびその中でGet-ChildItemを使用するか、UNCパスに向けることができます。いずれも同じように動作します。たとえば、現在のディレクトリにあるすべてのファイルをリストするだけです。

PS> dir -Path .
PS> Invoke-Command -ComputerName SERVER1 -Scriptblock { dir -Path . }

PowerShellプロバイダー

Microsoftは、ファイルシステムの「ツリー」構造を他のシステムにも適用できることを認識しました。ファイルシステムの「ツリー」にはフォルダとファイルがありますが、レジストリにはキーと値があり、Windowsの証明書システムにはストアとそのストア内の証明書があります。これらの特定の領域はすべてツリーとして表現できるため、PowerShellプロバイダが誕生しました。なぜPowerShellプロバイダについて話しているのかというと、Get-ChilldItemコマンドレットは、各プロバイダが公開するPowerShellドライブと対話する*-Itemコマンドレットの一部であるからです。

Get-ChildItemコマンドレットは、PowerShellドライブ上の任意の数のオブジェクトを出力でき、パイプラインを介して各アイテムを処理したり、PowerShellのforeachループ内で処理したりすることができます。それはPowerShellドライブの概念を理解しており、ファイルシステムフォルダ、レジストリキー、または証明書ストアのいずれかを指定することができます。

以下では、このコマンドがC:\フォルダ、HKEY Current Userハイブ、およびPowerShell証明書ストアを列挙できることがわかります。

PS> Get-ChildItem -Path C:\


    Directory: C:\


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----         7/2/2017   7:01 AM                AppData
d-----        4/25/2017   4:36 PM                CheckPoint

PS> Get-ChildItem -Path HKCU:\


    Hive: HKEY_CURRENT_USER


Name                           Property
----                           --------
BCD00000000

PS> dir -Path Cert:\


Location   : CurrentUser
StoreNames : {TrustedPublisher, ClientAuthIssuer, Root, UserDS...}

フィルタリング

Get-ChildItem PowerShellコマンドは、ドライブ上のすべてのオブジェクトを取得するだけでなく、FilterIncludeExcludeなどの異なるパラメータを使用して情報をフィルタリングすることもできます。可能な限りPowerShellの普遍的なFilterパラメータを使用することを常にお勧めします。このパラメータは、フィルタ構文を個々のプロバイダに直接渡します。この構文は非常に高速ですが、クエリされるプロバイダに依存します。

たとえば、Filter構文がName -eq 'foo'の場合、ファイルをクエリする場合には完全に機能しますが、レジストリをクエリする場合には機能しません。なぜなら、レジストリプロバイダにはフィルタが存在しないからです!

PS> dir HKLM:\ -Filter "Name -eq 'foo'"
ls : Cannot call method. The provider does not support the use of filters.
At line:1 char:1 + ls HKLM:\ -Filter "Name -eq 'foo'" +
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~     + CategoryInfo          :
NotImplemented: (:) [Get-ChildItem], PSNotSupportedException     +
FullyQualifiedErrorId :
NotSupported,Microsoft.PowerShell.Commands.GetChildItemCommand

それでもうまくいかない場合は、IncludeおよびExcludeパラメータを使用することもできます。

このPowerShellコマンドには、Forceというファイルとフォルダを出力する隠しファイルとフォルダ、FileおよびDirectoryのようなファイルシステム固有のパラメータもあります。完全なGet-ChildItemの詳細は、Get-HelpまたはMicrosoftのドキュメントを参照してください。

Get-ChildItemのもう一つの便利な機能は、ワイルドカード文字を使用してパスを解決できることです。PowerShellでは、ワイルドカード文字は通常、何でも表します。たとえば、.txt拡張子を持つすべてのファイルを表示したい場合は、フォルダへのパスと*.txtを指定するだけです。

PS> Get-ChildItem -Path 'C:\*.txt'

また、ファイル属性に基づいてフィルタリングすることもできます。たとえば、フォルダ内の読み取り専用ファイルのみを検索したい場合があります。

PS> Get-ChildItem -Path C:\ -Attributes R -File

概要

このPowerShellコマンドは、何度も使用することになるコマンドレットの1つです。ほとんどの場合、おそらくFileSystemプロバイダーを使用することになるでしょうが、このコマンドレットはさまざまなことができることを覚えておくことが重要です。ファイル、フォルダ、レジストリキー、レジストリ値、証明書、Active Directoryのユーザー、コンピュータ、さらには環境変数、関数などをクエリするために使用できます。

迷った場合は、Get-PSDriveコマンドを実行して、Get-ChildItemがクエリできるすべてのロードされたPowerShellドライブのリストを確認してください。

Source:
https://adamtheautomator.com/get-childitem/