Tôi đang tìm kiếm một tập tin trong tất cả các thư mục.
Copyforbuild.bat
có sẵn ở nhiều nơi và tôi muốn tìm kiếm đệ quy.
$File = "V:\Myfolder\**\*.CopyForbuild.bat"
Làm cách nào tôi có thể làm điều đó trong PowerShell?
Tôi đang tìm kiếm một tập tin trong tất cả các thư mục.
Copyforbuild.bat
có sẵn ở nhiều nơi và tôi muốn tìm kiếm đệ quy.
$File = "V:\Myfolder\**\*.CopyForbuild.bat"
Làm cách nào tôi có thể làm điều đó trong PowerShell?
Câu trả lời:
Sử dụng lệnh ghép ngắn Get-ChildItem với công -Recurse
tắc:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
cd V:\MyFolder
tiếp theols -r -inc CopyForBuild.bat
ls -r -ea silentlycontinue -fo -inc "filename.txt" | % { $_.fullname }
*
) vào cuối tên tệp. ****** LINE1: $File = "Microsoft.OData.Core.NetFX35.V7*"
LINE2: $Folder = "C:\Program Files"
LINE3:Get-ChildItem -Path $Folder -Filter $File -Recurse -ErrorAction SilentlyContinue -Force
Tôi sử dụng điều này để tìm tệp và sau đó PowerShell hiển thị toàn bộ đường dẫn của kết quả:
dir -Path C:\FolderName -Filter FileName.fileExtension -Recurse | %{$_.FullName}
Bạn luôn có thể sử dụng ký tự đại diện *
trong FolderName
và / hoặc FileName.fileExtension
. Ví dụ:
dir -Path C:\Folder* -Filter File*.file* -Recurse | %{$_.FullName}
Ví dụ trên sẽ tìm kiếm bất kỳ thư mục trong C:\
ổ đĩa bắt đầu bằng từ Folder
. Vì vậy, nếu bạn có một thư mục có tên FolderFoo
và FolderBar
PowerShell sẽ hiển thị kết quả từ cả hai thư mục đó.
Cũng vậy với tên tập tin và phần mở rộng tập tin. Nếu bạn muốn tìm kiếm một tệp có phần mở rộng nhất định, nhưng không biết tên của tệp, bạn có thể sử dụng:
dir -Path C:\FolderName -Filter *.fileExtension -Recurse | %{$_.FullName}
Hoặc ngược lại:
dir -Path C:\FolderName -Filter FileName.* -Recurse | %{$_.FullName}
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat
Cũng sẽ làm việc
Đây là phương pháp mà cuối cùng tôi đã nghĩ ra sau khi vật lộn:
Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*
Để làm cho đầu ra sạch hơn (chỉ đường dẫn), sử dụng:
(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname
Để chỉ nhận kết quả đầu tiên, hãy sử dụng:
(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname | Select -First 1
Bây giờ cho những thứ quan trọng:
Để chỉ tìm kiếm các tập tin / thư mục không sử dụng -File
hoặc -Directory
(xem bên dưới tại sao). Thay vào đó sử dụng điều này cho các tập tin:
Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}
và loại bỏ các -eq $false
thư mục cho. Đừng không để lại một ký tự đại diện trailing như bin/*
.
Tại sao không sử dụng các thiết bị chuyển mạch tích hợp? Chúng là khủng khiếp và loại bỏ các tính năng ngẫu nhiên. Ví dụ: để sử dụng -Include
với một tệp, bạn phải kết thúc đường dẫn bằng ký tự đại diện. Tuy nhiên, điều này vô hiệu hóa công -Recurse
tắc mà không cho bạn biết:
Get-ChildItem -File -Recurse -Path ./bin/* -Include *.lib
Bạn sẽ nghĩ rằng nó sẽ cung cấp cho bạn tất *.lib
cả các thư mục con, nhưng nó sẽ chỉ tìm kiếm cấp cao nhất bin
.
Để tìm kiếm các thư mục, bạn có thể sử dụng -Directory
, nhưng sau đó bạn phải xóa ký tự đại diện. Vì lý do nào, điều này sẽ không hủy kích hoạt -Recurse
. Đó là vì những lý do này mà tôi khuyên bạn không nên sử dụng cờ dựng sẵn.
Bạn có thể rút ngắn lệnh này đáng kể:
Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}
trở thành
gci './path*/' -s -Include 'name*' | where {$_.PSIsContainer -eq $false}
Get-ChildItem
được đặt bí danh là gci
-Path
được mặc định là vị trí 0, vì vậy bạn chỉ cần tạo đường dẫn đối số đầu tiên-Recurse
được đặt bí danh là -s
-Include
không có tốc kýThử cái này:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
| Where-Object { !$_PSIsContainer }
để loại trừ các thư mục
Lọc bằng ký tự đại diện:
Get-ChildItem -Filter CopyForBuild* -Include *.bat,*.cmd -Exclude *.old.cmd,*.old.bat -Recurse
Lọc bằng biểu thức chính quy:
Get-ChildItem -Path "V:\Myfolder" -Recurse
| Where-Object { $_.Name -match '\ACopyForBuild\.[(bat)|(cmd)]\Z' }
'\ACopyForBuild\.(bat|cmd)\Z'
?