การทำงานกับโฟลเดอร์ไฟล์และรีจิสตรีคีย์
ตัวอย่างนี้ใช้กับแพลตฟอร์ม Windows เท่านั้น
PowerShell ใช้คำนาม รายการ เพื่ออ้างถึงรายการที่พบในไดรฟ์ PowerShell เมื่อติดต่อกับผู้ให้บริการ PowerShell FileSystem รายการ อาจเป็นไฟล์ โฟลเดอร์ หรือไดรฟ์ PowerShell การลงรายการและการทำงานกับรายการเหล่านี้เป็นงานพื้นฐานที่สำคัญในการตั้งค่าการดูแลระบบส่วนใหญ่ ดังนั้นเราจึงต้องการหารือเกี่ยวกับงานเหล่านี้โดยละเอียด
การระบุไฟล์ โฟลเดอร์ และรีจิสตรีคีย์
เนื่องจากการรับคอลเลกชันของรายการจากสถานที่ใดสถานที่หนึ่งนั้นเป็นงานทั่วไป ดังนั้น Get-ChildItem cmdlet จึงได้รับการออกแบบมาโดยเฉพาะเพื่อส่งคืนรายการทั้งหมดที่พบในคอนเทนเนอร์ เช่น โฟลเดอร์
หากคุณต้องการส่งคืนไฟล์และโฟลเดอร์ทั้งหมดที่มีอยู่โดยตรงภายในโฟลเดอร์ C:\Windows ให้พิมพ์:
PS> Get-ChildItem -Path C:\Windows
Directory: Microsoft.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
...
รายการมีลักษณะคล้ายกับที่คุณจะเห็นเมื่อคุณป้อนคำสั่ง dir ใน cmd.exe หรือคำสั่ง ls ในเชลล์คำสั่ง UNIX .
คุณสามารถดำเนินการรายการที่ซับซ้อนได้โดยใช้พารามิเตอร์ของ cmdlet Get-ChildItem คุณสามารถดูไวยากรณ์ของ cmdlet Get-ChildItem ได้โดยพิมพ์:
Get-Command -Name Get-ChildItem -Syntax
พารามิเตอร์เหล่านี้สามารถผสมและจับคู่เพื่อให้ได้เอาต์พุตที่ปรับแต่งได้สูง
แสดงรายการที่มีอยู่ทั้งหมด
หากต้องการดูทั้งรายการภายในโฟลเดอร์ Windows และรายการใดๆ ที่อยู่ในโฟลเดอร์ย่อย ให้ใช้พารามิเตอร์ Recurse ของ Get-ChildItem รายการจะแสดงทุกอย่างภายในโฟลเดอร์ Windows และรายการในโฟลเดอร์ย่อย ตัวอย่างเช่น:
PS> Get-ChildItem -Path C:\WINDOWS -Recurse
Directory: Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS
Directory: Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS\AppPatch
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2004-08-04 8:00 AM 1852416 AcGenral.dll
...
การกรองรายการตามชื่อ
หากต้องการแสดงเฉพาะชื่อของรายการ ให้ใช้พารามิเตอร์ ชื่อ ของ Get-Childitem:
PS> Get-ChildItem -Path C:\WINDOWS -Name
addins
AppPatch
assembly
...
บังคับให้แสดงรายการที่ซ่อนอยู่
รายการที่ซ่อนอยู่ใน File Explorer หรือ cmd.exe จะไม่แสดงในผลลัพธ์ของคำสั่ง Get-ChildItem หากต้องการแสดงรายการที่ซ่อนอยู่ ให้ใช้พารามิเตอร์ Force ของ Get-ChildItem ตัวอย่างเช่น:
Get-ChildItem -Path C:\Windows -Force
พารามิเตอร์นี้มีชื่อว่า Force เนื่องจากคุณสามารถบังคับแทนที่การทำงานปกติของคำสั่ง Get-ChildItem ได้ บังคับ เป็นพารามิเตอร์ที่ใช้กันอย่างแพร่หลาย ซึ่งบังคับการดำเนินการที่ cmdlet จะไม่ดำเนินการตามปกติ แม้ว่าจะไม่สามารถดำเนินการใดๆ ที่กระทบต่อความปลอดภัยของระบบก็ตาม
การจับคู่ชื่อรายการด้วยไวด์การ์ด
คำสั่ง Get-ChildItem ยอมรับไวด์การ์ดในเส้นทางของรายการที่จะแสดงรายการ
เนื่องจากการจับคู่ไวด์การ์ดได้รับการจัดการโดยกลไกจัดการ PowerShell cmdlet ทั้งหมดที่ยอมรับไวด์การ์ดจึงใช้สัญลักษณ์เดียวกันและมีลักษณะการทำงานที่ตรงกันเหมือนกัน สัญลักษณ์ตัวแทนของ PowerShell ประกอบด้วย:
- เครื่องหมายดอกจัน (
*) จะจับคู่อักขระใดๆ ที่เป็นศูนย์หรือมากกว่านั้น - เครื่องหมายคำถาม (
?) ตรงกับอักขระหนึ่งตัวเท่านั้น - อักขระวงเล็บปีกกาซ้าย (
[) และอักขระวงเล็บปีกกาขวา (]) ล้อมรอบชุดอักขระที่จะจับคู่
ต่อไปนี้คือตัวอย่างบางส่วนของวิธีการทำงานของข้อกำหนดไวด์การ์ด
หากต้องการค้นหาไฟล์ทั้งหมดในไดเร็กทอรี Windows ที่มีส่วนต่อท้าย .log และมีอักขระห้าตัวในชื่อฐาน ให้ป้อนคำสั่งต่อไปนี้:
PS> Get-ChildItem -Path C:\Windows\?????.log
Directory: Microsoft.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
...
หากต้องการค้นหาไฟล์ทั้งหมดที่ขึ้นต้นด้วยตัวอักษร x ในไดเร็กทอรี Windows ให้พิมพ์:
Get-ChildItem -Path C:\Windows\x*
หากต้องการค้นหาไฟล์ทั้งหมดที่มีชื่อขึ้นต้นด้วย "x" หรือ "z" ให้พิมพ์:
Get-ChildItem -Path C:\Windows\[xz]*
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับไวด์การ์ด โปรดดูที่ about_Wildcards
ไม่รวมรายการ
คุณสามารถยกเว้นบางรายการได้โดยใช้พารามิเตอร์ ยกเว้น ของ Get-ChildItem ซึ่งช่วยให้คุณทำการกรองที่ซับซ้อนได้ในคำสั่งเดียว
ตัวอย่างเช่น สมมติว่าคุณกำลังพยายามค้นหา Windows Time Service DLL ในโฟลเดอร์ System32 และสิ่งที่คุณจำได้เกี่ยวกับชื่อ DLL ก็คือชื่อขึ้นต้นด้วย "W" และมี "32" อยู่ในนั้น .
นิพจน์เช่น w*32*.dll จะค้นหา DLL ทั้งหมดที่ตรงตามเงื่อนไข แต่คุณอาจต้องการกรองไฟล์เพิ่มเติมและละเว้นไฟล์ win32 ใดๆ คุณสามารถละเว้นไฟล์เหล่านี้ได้โดยใช้พารามิเตอร์ ยกเว้น ที่มีรูปแบบ win*:
PS> Get-ChildItem -Path C:\WINDOWS\System32\w*32*.dll -Exclude win*
Directory: C:\WINDOWS\System32
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 3/18/2019 9:43 PM 495616 w32time.dll
-a--- 3/18/2019 9:44 PM 35328 w32topl.dll
-a--- 1/24/2020 5:44 PM 401920 Wldap32.dll
-a--- 10/10/2019 5:40 PM 442704 ws2_32.dll
-a--- 3/18/2019 9:44 PM 66048 wsnmp32.dll
-a--- 3/18/2019 9:44 PM 18944 wsock32.dll
-a--- 3/18/2019 9:44 PM 64792 wtsapi32.dll
การผสมพารามิเตอร์ Get-ChildItem
คุณสามารถใช้พารามิเตอร์ต่างๆ ของ Get-ChildItem cmdlet ในคำสั่งเดียวกันได้ ก่อนที่คุณจะผสมพารามิเตอร์ ตรวจสอบให้แน่ใจว่าคุณเข้าใจการจับคู่ไวด์การ์ด ตัวอย่างเช่น คำสั่งต่อไปนี้ไม่ส่งคืนผลลัพธ์:
Get-ChildItem -Path C:\Windows\*.dll -Recurse -Exclude [a-y]*.dll
ไม่มีผลลัพธ์ แม้ว่าจะมี DLL สองตัวที่ขึ้นต้นด้วยตัวอักษร "z" ในโฟลเดอร์ Windows ก็ตาม
ไม่มีการส่งคืนผลลัพธ์เนื่องจากเราระบุไวด์การ์ดเป็นส่วนหนึ่งของเส้นทาง แม้ว่าคำสั่งเป็นแบบเรียกซ้ำ แต่ Get-ChildItem cmdlet จะจำกัดรายการไว้เฉพาะรายการที่อยู่ในโฟลเดอร์ Windows ที่มีชื่อลงท้ายด้วย .dll
หากต้องการระบุการค้นหาแบบเรียกซ้ำสำหรับไฟล์ที่มีชื่อตรงกับรูปแบบพิเศษ ให้ใช้พารามิเตอร์ รวม
PS> Get-ChildItem -Path C:\Windows -Include *.dll -Recurse -Exclude [a-y]*.dll
Directory: Microsoft.PowerShell.Core\FileSystem::C:\Windows\System32\Setup
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2004-08-04 8:00 AM 8261 zoneoc.dll
Directory: Microsoft.PowerShell.Core\FileSystem::C:\Windows\System32
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2004-08-04 8:00 AM 337920 zipfldr.dll