2010-08-06 1422 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

相关问题