2010-08-06 27 views
22

Tìm kiếm ở khắp mọi nơi cho điều này nhưng không có may mắn. Tôi muốn viết một kịch bản nhỏ tìm kiếm tên tệp chính xác, không chỉ là một chuỗi trong tên tệp. Ví dụ: nếu tôi tìm kiếm 'máy chủ' bằng cách sử dụng Explorer, tôi sẽ nhận được nhiều kết quả theo mặc định. Với kịch bản tôi muốn CHỈ tên tôi chỉ định. Tôi giả định rằng nó có thể?Kịch bản lệnh Powershell để định vị tên tệp/tệp cụ thể?

Tôi chỉ thực sự bắt đầu tập lệnh và nó chỉ dành cho mục đích sử dụng cá nhân của tôi nên không quan trọng, nó chỉ làm phiền tôi. Tôi có một số ổ đĩa vì vậy tôi bắt đầu với 2 đầu vào, một để truy vấn tên ổ đĩa và một để xác định tên tập tin. Tôi có thể tìm kiếm theo phần mở rộng, kích thước tập tin vv nhưng dường như không thể tìm kiếm một tên chính xác.

Mọi trợ giúp sẽ được đánh giá cao!

CHỈNH SỬA: Cảm ơn tất cả các câu trả lời. Chỉ cần cập nhật. Tôi đã thêm một trong những câu trả lời cho kịch bản nhỏ của tôi và nó hoạt động tốt. Tất cả ba câu trả lời đều hiệu quả nhưng tôi chỉ có thể sử dụng một câu trả lời cuối cùng, không có hành vi phạm tội nào đối với hai người kia. Chúc mừng. Chỉ cần làm rõ, 'npp' là một bí danh cho Notepad ++ để mở tệp khi tìm thấy.

$drv = read-host "Choose drive" 
$fname = read-host "File name" 
$req = dir -Path $drv -r | Where-Object { !$PsIsContainer -and [System.IO.Path]::GetFileNameWithoutExtension($_.Name) -eq $fname } 
set-location $req.directory 
npp $req 

Trả lời

39

Từ một dấu nhắc lệnh ở thư mục gốc:

gci -recurse -filter "hosts" 

là chỉ sẽ trả về một kết hợp chính xác cho tên tập tin "hosts" - và nhiều thông báo màu đỏ mà tôi cần quyền nâng cao (-:

Về cơ bản, bộ lọc s, tôi nghĩ, chìa khóa.


Addednum như SteveMustafa chỉ ra bây giờ bạn có thể sử dụng công tắc -File để cung cấp cho những điều sau đây để đệ quy tìm kiếm cho các tập tin có tên là "hosts":

gci -recurse -filter "hosts" -File 

Và nếu bạn muốn tránh sự "truy cập lỗi với các đường dẫn bị từ chối", sau đó

gci -recurse -filter "hosts" -file -ErrorAction SilentlyContinue 
+3

Có, '-Filter' nhanh hơn cho việc này. Anh ấy nói anh ta đang tìm kiếm các tệp, vì vậy bạn sẽ cần phải thêm '? {! $ PsIsContainer} '. –

+0

Cảm ơn bạn, chính xác những gì tôi đã làm sau :) – gavin19

+1

tại sao không thêm công tắc -File? – SteveMustafa

10

Giả sử bạn có một ổ đĩa Z: ánh xạ:

Get-ChildItem -Path "Z:" -Recurse | Where-Object { !$PsIsContainer -and [System.IO.Path]::GetFileNameWithoutExtension($_.Name) -eq "hosts" } 
+0

Cảm ơn bạn. Xây dựng câu trả lời, làm việc hoàn hảo.Đã học một số điều quá :) – gavin19

7

tôi sử dụng biểu mẫu này cho chỉ các loại điều này:

gci . hosts -r | ? {!$_.PSIsContainer} 

. ánh xạ tới thông số vị trí Path và bản đồ "máy chủ" tới thông số vị trí Filter. Tôi khuyên bạn nên sử dụng Filter trên Include nếu nhà cung cấp hỗ trợ lọc (và nhà cung cấp hệ thống tệp). Nó nhanh hơn một chút so với Include.

+0

Chúc mừng, hoạt động tuyệt vời. Nhiều đánh giá cao thưa ngài! – gavin19

2

tìm kiếm toàn bộ máy tính
gdr -PSProvider 'FileSystem' | %{ ls -r $_.root} 2>$null | where { $_.name -eq "httpd.exe" }

3

Tôi đang sử dụng chức năng này dựa trên @Murph câu trả lời. Nó tìm kiếm bên trong thư mục hiện tại và liệt kê đường dẫn đầy đủ.

function findit { $filename = $args[0]; gci -recurse -filter "*${filename}*" -file -ErrorAction SilentlyContinue | foreach-object { $place_path = $_.directory echo "${place_path}\${_}" } }

sử dụng Ví dụ: findit myfile

Các vấn đề liên quan