ฉันกำลังค้นหาไฟล์ในโฟลเดอร์ทั้งหมด
Copyforbuild.bat
มีให้บริการในหลายสถานที่และฉันต้องการค้นหาแบบเรียกซ้ำ
$File = "V:\Myfolder\**\*.CopyForbuild.bat"
ฉันจะทำใน PowerShell ได้อย่างไร
ฉันกำลังค้นหาไฟล์ในโฟลเดอร์ทั้งหมด
Copyforbuild.bat
มีให้บริการในหลายสถานที่และฉันต้องการค้นหาแบบเรียกซ้ำ
$File = "V:\Myfolder\**\*.CopyForbuild.bat"
ฉันจะทำใน PowerShell ได้อย่างไร
คำตอบ:
ใช้Get-ChildItem cmdlet กับ-Recurse
สวิตช์:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
cd V:\MyFolder
ตามด้วยls -r -inc CopyForBuild.bat
ls -r -ea silentlycontinue -fo -inc "filename.txt" | % { $_.fullname }
*
) ที่ส่วนท้ายของชื่อไฟล์ ****** LINE1: $File = "Microsoft.OData.Core.NetFX35.V7*"
LINE2: $Folder = "C:\Program Files"
LINE3:Get-ChildItem -Path $Folder -Filter $File -Recurse -ErrorAction SilentlyContinue -Force
ฉันใช้สิ่งนี้เพื่อค้นหาไฟล์จากนั้นให้ PowerShell แสดงเส้นทางทั้งหมดของผลลัพธ์:
dir -Path C:\FolderName -Filter FileName.fileExtension -Recurse | %{$_.FullName}
คุณสามารถใช้สัญลักษณ์แทน*
ในFolderName
FileName.fileExtension
และ / หรือ ตัวอย่างเช่น:
dir -Path C:\Folder* -Filter File*.file* -Recurse | %{$_.FullName}
ตัวอย่างด้านบนจะค้นหาโฟลเดอร์ใด ๆ ใน C:\
Folder
ไดรฟ์เริ่มต้นด้วยคำว่า ดังนั้นหากคุณมีชื่อโฟลเดอร์FolderFoo
และFolderBar
PowerShell จะแสดงผลลัพธ์จากทั้งสองโฟลเดอร์
เช่นเดียวกับชื่อไฟล์และนามสกุลไฟล์ หากคุณต้องการค้นหาไฟล์ที่มีนามสกุล แต่ไม่ทราบชื่อของไฟล์คุณสามารถใช้:
dir -Path C:\FolderName -Filter *.fileExtension -Recurse | %{$_.FullName}
หรือในทางกลับกัน:
dir -Path C:\FolderName -Filter FileName.* -Recurse | %{$_.FullName}
เมื่อค้นหาโฟลเดอร์ที่คุณอาจได้รับข้อผิดพลาดตามความปลอดภัย (เช่นC:\Users
) ให้ใช้คำสั่งต่อไปนี้:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat
ก็จะได้ผล
นี่คือวิธีการที่ฉันคิดขึ้นมาหลังจากที่ต้องดิ้นรน:
Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*
ในการทำให้ตัวล้างเอาต์พุต (พา ธ เท่านั้น) ใช้:
(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname
เพื่อให้ได้ผลลัพธ์แรกเท่านั้นให้ใช้:
(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname | Select -First 1
ตอนนี้สำหรับสิ่งที่สำคัญ:
เพื่อค้นหาเฉพาะไฟล์ไดเรกทอรี / ไม่ได้ใช้-File
หรือ-Directory
(ดูด้านล่างทำไม) ใช้สิ่งนี้แทนไฟล์:
Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}
และลบ-eq $false
ไดเรกทอรีสำหรับ อย่าได้bin/*
ปล่อยให้ตัวแทนต่อท้ายเช่น
ทำไมไม่ใช้สวิตช์ในตัว พวกมันแย่มากและลบคุณสมบัติแบบสุ่ม ตัวอย่างเช่นเพื่อใช้-Include
กับไฟล์คุณต้องจบเส้นทางด้วย wildcard อย่างไรก็ตามสิ่งนี้ปิดใช้งาน-Recurse
สวิตช์โดยไม่บอกคุณ:
Get-ChildItem -File -Recurse -Path ./bin/* -Include *.lib
คุณคิดว่าจะให้ทุกคน*.lib
ในไดเรกทอรีย่อยทั้งหมด แต่จะค้นหาเฉพาะในระดับสูงสุดbin
เท่านั้น
เพื่อค้นหาไดเรกทอรีคุณสามารถใช้ -Directory
แต่คุณต้องลบ wildcard ที่ต่อท้าย -Recurse
สำหรับเหตุผลใดนี้จะไม่ยกเลิกการใช้งาน ด้วยเหตุผลเหล่านี้ฉันจึงไม่แนะนำให้ใช้ธงบิวอิน
คุณสามารถย่อคำสั่งนี้ให้สั้นลงได้มาก:
Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}
กลายเป็น
gci './path*/' -s -Include 'name*' | where {$_.PSIsContainer -eq $false}
Get-ChildItem
มีนามแฝงว่า gci
-Path
เป็นค่าเริ่มต้นที่ตำแหน่ง 0 ดังนั้นคุณสามารถสร้างเส้นทางอาร์กิวเมนต์แรกได้-Recurse
มีนามแฝงว่า -s
-Include
ไม่มีชวเลขลองสิ่งนี้:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
| Where-Object { !$_PSIsContainer }
เพื่อแยกโฟลเดอร์
กรองโดยใช้สัญลักษณ์แทน:
Get-ChildItem -Filter CopyForBuild* -Include *.bat,*.cmd -Exclude *.old.cmd,*.old.bat -Recurse
การกรองโดยใช้นิพจน์ทั่วไป:
Get-ChildItem -Path "V:\Myfolder" -Recurse
| Where-Object { $_.Name -match '\ACopyForBuild\.[(bat)|(cmd)]\Z' }
'\ACopyForBuild\.(bat|cmd)\Z'
?
หากต้องการเพิ่ม @ user3303020 คำตอบและแสดงผลลัพธ์การค้นหาลงในไฟล์คุณสามารถเรียกใช้
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat > path_to_results_filename.txt
การค้นหาไฟล์ที่ถูกต้องนั้นอาจทำได้ง่ายกว่า