Windows PowerShell 使用名詞 Item 代表在 Windows PowerShell 磁碟機上找到的項目。如果處理對象是 Windows PowerShell FileSystem 提供者,則 Item 可能是檔案、資料夾或 Windows PowerShell 磁碟機。列舉及處理這些項目是進行大部分系統管理設定時極為關鍵的基本工作,因此接下來將深入討論這幾項工作。
列舉檔案、資料夾和登錄機碼 (Get-ChildItem)
正因為從特定位置取得項目集合是如此稀鬆平常的工作,故而特別設計了 Get-ChildItem Cmdlet 用以傳回由資料夾等容器內找到的所有項目。
若要傳回 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 Cmdlet 的參數來執行非常複雜的列舉作業。底下將示範幾個案例。若要查看 Get-ChildItem Cmdlet 的語法,請輸入:
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)
Get-ChildItem 命令的輸出結果不會列出 Windows 檔案總管或 Cmd.exe 中一般看不到的項目。若要顯示隱藏的項目,請使用 Get-ChildItem 的 Force 參數:例如:
Get-ChildItem -Path C:\Windows -Force
此參數命名為 Force 的原因是您可以強制覆寫 Get-ChildItem 命令的一般行為。Force 參數廣泛用於強制 cmdlet 從事其在一般情況下不會執行的動作,但不致執行任何危害系統安全的動作。
使用萬用字元比對項目名稱
The Get-ChildItem 命令允許所列舉項目的路徑使用萬用字元。
由於萬用字元比對是由 Windows PowerShell 引擎所掌控,所有接受萬用字元的 cmdlet 都使用相同的標記法且具有相同的比對行為。Windows PowerShell 萬用字元標記法包括:
-
星號 (*) 比對出現零次以上的任意字元。
-
問號 (?) 比對單一字元。
-
左括號 ([) 字元和右括號 (]) 字元則是夾住所要比對的一組字元。
底下將舉幾個範例說明萬用字元規格的運作情形。
若要找出 Windows 目錄中副檔名為 .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 參數可以排除特定項目。您可藉此透過單一陳述式執行複雜的篩選作業。
例如,假設您要尋找 System32 資料夾內的 Windows Time 服務 DLL,但是您只記得 DLL 的名稱以 "W" 開頭且內有 "32" 字樣。
w*32*.dll 之類的運算式雖可找到所有符合條件的 DLL,卻也可能傳回名稱中包含 "95" 或 "16" 的 Windows 95 和 16 位元 Windows 相容性 DLL。如果使用模式為 *[9516]* 的 Exclude 參數,就能排除名稱中有這些數字的檔案:
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 Cmdlet 的多個參數。要交互運用參數之前,請確定您已了解萬用字元比對。例如,下列命令不會傳回任何結果:
PS> Get-ChildItem -Path C:\Windows\*.dll -Recurse -Exclude [a-y]*.dll
儘管 Windows 資料夾內有兩個 DLL 以字母 "z" 開頭,卻沒有傳回結果。
毫無傳回結果是因為萬用字元指定在路徑上。命令雖然遞迴執行,Get-ChildItem Cmdlet 卻限制只傳回位於 Windows 資料夾內且名稱以 ".dll" 結尾的項目。
若要指定遞迴搜尋檔名符合特殊模式的檔案,請使用 -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