Сценарий Powershell для поиска конкретного файла / имени файла? - PullRequest
34 голосов
/ 07 августа 2010

Я хотел написать небольшой скрипт, который искал точное имя файла, а не строку в имени файла.

Например, если я ищу «хосты» с помощью Проводника,Я получаю несколько результатов по умолчанию.С помощью скрипта я хочу ТОЛЬКО имя, которое я указываю.Я предполагаю, что это возможно?

Я действительно только запустил скрипт, и он только для моего личного использования, так что это не важно, это просто меня беспокоит.У меня есть несколько дисков, поэтому я начал с 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

Ответы [ 6 ]

59 голосов
/ 07 августа 2010

В командной строке powershell используйте командлет gci (псевдоним для 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:\"
11 голосов
/ 07 августа 2010

Предполагается, что у вас подключен диск Z::

Get-ChildItem -Path "Z:" -Recurse | Where-Object { !$PsIsContainer -and [System.IO.Path]::GetFileNameWithoutExtension($_.Name) -eq "hosts" }
8 голосов
/ 07 августа 2010

Я использую эту форму только для такого рода вещей:

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

. отображается на позиционный параметр Path, а "hosts" отображается на позиционный параметр Filter. Я настоятельно рекомендую использовать Filter вместо Include, если поставщик поддерживает фильтрацию (а поставщик файловой системы поддерживает). Это немного быстрее, чем Include.

4 голосов
/ 21 марта 2016

Я использую эту функцию на основе ответа @Murph. Он ищет в текущем каталоге и отображает полный путь.

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

Пример использования: findit myfile

2 голосов
/ 26 августа 2015

поиск по всему компьютеру
gdr -PSProvider 'FileSystem' | %{ ls -r $_.root} 2>$null | where { $_.name -eq "httpd.exe" }

0 голосов
/ 26 июля 2018

В findFileByFilename.ps1 У меня есть:

# /2801831/stsenarii-powershell-dlya-poiska-konkretnogo-faila-imeni-faila
$filename = Read-Host 'What is the filename to find?'
gci . -recurse -filter $filename -file -ErrorAction SilentlyContinue
# tested works from pwd recursively.

Это прекрасно работает для меня.Я понимаю, это.

Я положил его в папку на моем PATH.

Я вызываю его с помощью:

> findFileByFilename.ps1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...