Get-ChildItem: 使用 PowerShell 列出文件和文件夾

記得舊日的DOS dir命令嗎?Linux的ls命令呢?如果是這樣,Get-ChildItem本質上就是將它們提升了一個檔次。

事實上,我們在PowerShell中甚至有dir和ls的別名形式。Get-ChildItem PowerShell cmdlet不僅可以通過PowerShell控制台或PowerShell腳本列出文件和文件夾,還可以列舉註冊表鍵和值、各種證書存儲中的證書,甚至是Active Directory等等。

如果你是一名初學者/中級PowerShell腳本編寫者,請務必查看我免費的小型課程《構建PowerShell工具》!超過9,000字的深入解釋和見解,教你如何構建PowerShell工具。

要理解Get-ChildItem,首先要將其視為dir和ls,但它不僅僅將文件視為子項,還列舉了許多對象。你可以使用別名或完整的命令名稱來使用它。

由於此命令自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提供程序

微軟意識到導航文件系統的”樹狀”結構可以應用於其他系統。文件系統的”樹狀”結構具有文件夾和文件,而註冊表具有鍵和值,Windows中的證書系統則具有存儲和存儲內的證書。所有這些特定區域都可以表示為樹,因此誕生了PowerShell提供程序。為什麼要談論PowerShell提供程序呢?因為Get-ChilldItem cmdlet是與每個提供程序公開的PowerShell驅動器交互的*-Item cmdlet的一部分。

Get-ChildItem cmdlet可以在PowerShell驅動器上輸出任意數量的對象,並允許您通過管道或在PowerShell foreach循環中處理每個項目。它理解PowerShell驅動器的概念,這允許您在一個Path中指定文件系統文件夾、註冊表鍵或證書存儲。

您可以在下面看到,此命令可以列舉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

即使一切失敗,您還可以使用 IncludeExclude 參數。

此 PowerShell 命令還具有一些特定於文件系統的參數,例如 Force,它將輸出隱藏的文件和文件夾,FileDirectory 僅查找文件或文件夾。請查看完整的 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命令是你會反復使用的命令之一。大多數情況下,你可能會使用FileSystem提供程序,但重要的是要記住,這個命令是可以做更多事情的。可以使用它來查詢文件、文件夾、註冊表鍵、註冊表值、證書、Active Directory用戶、計算機,甚至是環境變量、函數等等!

如果有疑問,運行Get-PSDrive命令可以查看所有已加載的PowerShell驅動器列表,Get-ChildItem可以為你查詢。

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