我想编写一个小脚本来搜索确切的文件名,而不是文件名中的字符串。
例如,如果我使用资源管理器搜索“主机”,默认情况下会得到多个结果。使用脚本我只想要我指定的名称。我假设它有可能吗?
我只是真正开始编写剧本而且仅供我个人使用,所以它并不重要,它只是在烦扰我。我有几个驱动器,所以我开始使用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
答案 0 :(得分:57)
在PowerShell提示符下,使用 gci
cmdlet(Get-ChildItem
的别名)和 -filter
选项:
gci -recurse -filter "hosts"
这将返回与文件名“hosts
”的完全匹配。
SteveMustafa指出当前版本的powershell,您可以使用 -File
开关提供以下内容,以递归方式搜索名为“hosts
”的文件(而不是目录或其他杂项文件系统实体):
gci -recurse -filter "hosts" -File
这些命令可能会打印许多红色错误消息,例如“Access to the path 'C:\Windows\Prefetch' is denied.
”。
如果您想避免错误消息,请将 -ErrorAction
设置为静音。
gci -recurse -filter "hosts" -File -ErrorAction SilentlyContinue
另一个帮手是,您可以使用 -Path
设置要搜索的根目录。
生成的搜索命令显式搜索,例如,C驱动器的根将是
gci -Recurse -Filter "hosts" -File -ErrorAction SilentlyContinue -Path "C:\"
答案 1 :(得分:11)
假设您已映射Z:
个驱动器:
Get-ChildItem -Path "Z:" -Recurse | Where-Object { !$PsIsContainer -and [System.IO.Path]::GetFileNameWithoutExtension($_.Name) -eq "hosts" }
答案 2 :(得分:8)
我将这种形式用于此类事情:
gci . hosts -r | ? {!$_.PSIsContainer}
.
映射到位置参数Path
,“hosts”映射到位置参数Filter
。如果提供程序支持过滤(并且文件系统提供程序支持),我强烈建议使用Filter
而不是Include
。它比Include
快得多。
答案 3 :(得分:4)
我正在使用基于@Murph答案的这个功能。 它在当前目录中搜索并列出完整路径。
function findit
{
$filename = $args[0];
gci -recurse -filter "*${filename}*" -file -ErrorAction SilentlyContinue | foreach-object {
$place_path = $_.directory
echo "${place_path}\${_}"
}
}
使用示例:findit myfile
答案 4 :(得分:2)
搜索整台电脑
gdr -PSProvider 'FileSystem' | %{ ls -r $_.root} 2>$null | where { $_.name -eq "httpd.exe" }
答案 5 :(得分:0)
在 findFileByFilename.ps1 中,我有:
# https://stackoverflow.com/questions/3428044/powershell-script-to-locate-specific-file-file-name
$filename = Read-Host 'What is the filename to find?'
gci . -recurse -filter $filename -file -ErrorAction SilentlyContinue
# tested works from pwd recursively.
这对我很有用。我明白。
我将其放在PATH的文件夹中。
我通过以下方式调用它:
> findFileByFilename.ps1
答案 6 :(得分:0)
要搜索整个计算机:
gdr -PSProvider '文件系统' | %{ ls -r $.root} 2>$null |在哪里 { $.name -eq "httpd.exe" }
我很确定这是一个效率低得多的命令,原因有很多,但最简单的是你把所有东西都用管道传送到你的 where-object 命令,当你仍然可以使用 -filter "httpd.exe" 并节省大量循环。
此外,在许多计算机上,get-psdrive 会抓取共享驱动器,我很确定您希望通过它来进行完整搜索。就文件和文件夹的绝对数量而言,大多数共享可能是巨大的,因此至少我会按大小对驱动器进行排序,并在每次搜索后添加检查以在找到文件时退出循环。也就是说,如果您正在寻找单个实例,如果不是节省搜索一两个 10TB 共享的巨大时间的唯一方法,则是评论该命令并强烈建议任何需要使用它的用户应该限制他们尽可能多地搜索。例如,我们的用户配置文件共享是 10TB,至少我使用的是,我可以将搜索限制在 $sharedrive\users\myname 目录并搜索我的 116GB 目录而不是 10TB 目录。这种类型的脚本有太多未知数,在资源和速度方面已经非常低效。
如果我认真考虑使用这样的东西,我会添加对 3rd 方包的调用并利用数据库。