2010-08-06 1428 views
22

到處搜索,但沒有運氣。我想寫一個小腳本來搜索一個確切的文件名,而不僅僅是一個文件名中的字符串。例如,如果我使用資源管理器搜索「主機」,默認情況下會得到多個結果。通過腳本,我只需要我指定的名稱。我認爲這是可能的?Powershell腳本查找特定的文件/文件名?

我只是真的開始了腳本,它只是爲我個人使用,所以它並不重要,它只是竊聽我。我有幾個驅動器,所以我開始使用2個輸入,一個用於查詢驅動器盤符,另一個用於指定文件名。我可以通過擴展名,文件大小等進行搜索,但似乎無法將搜索鎖定到確切的名稱。

任何幫助,將不勝感激!

編輯:感謝所有的迴應。只是爲了更新。我在我的小腳本中添加了一個答案,並且效果很好。所有三個迴應都奏效了,但我最終只能使用一個,其他兩個都沒有問題。乾杯。只是爲了澄清,'npp'是Notepad ++在找到文件後打開文件的別名。

$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 

回答

39

從命令提示符:

gci -recurse -filter "hosts" 

只會返回精確匹配文件名的「主機」 - 以及我需要提升權限的許多紅色郵件( - :

基本上,-filter i我認爲,關鍵是。


Addednum爲SteveMustafa指出你現在可以使用 - 文件切換到提供以下遞歸搜索文件名爲「主機」:

gci -recurse -filter "hosts" -File 

如果你想避免「訪問該路徑被拒絕的錯誤」,那麼

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

啊是的,'-Filter'對此更快。他說他正在尋找文件,所以你需要添加'? {!$ PsIsContainer}'。 – 2010-08-06 22:19:39

+0

謝謝,正是我之後:) – gavin19 2010-08-07 03:08:30

+1

爲什麼不添加-File開關? – SteveMustafa 2014-06-27 16:08:25

10

假設你有一個Z:驅動器映射:在根

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

謝謝。詳盡的答案,完美的工作。學到了一些東西:) – gavin19 2010-08-07 03:06:13

7

我用這種形式只是這樣的事情:

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

.映射到位置參數Path和「主機」映射到位置參數Filter。如果提供程序支持篩選(以及文件系統提供程序),我強烈推薦使用Filter而不是Include。這比Include快得多。

+0

乾杯,效果很好。非常感謝先生! – gavin19 2010-08-07 03:09:36

2

搜索
gdr -PSProvider 'FileSystem' | %{ ls -r $_.root} 2>$null | where { $_.name -eq "httpd.exe" }

3

我使用基於@Murph回答這個全功能計算機。 它在當前目錄內搜索並列出完整路徑。

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

用法示例:findit myfile

相關問題