Подтвердить что ты не робот

Powershell script для поиска определенного имени файла/файла?

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

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

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

Ответ 1

В командной строке 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 в -ErrorAction.

gci -recurse -filter "hosts" -File -ErrorAction SilentlyContinue


Дополнительным помощником является то, что вы можете установить корень для поиска с помощью -Path. Результирующая команда для явного поиска, например, в корне диска C, будет иметь вид

gci -Recurse -Filter "hosts" -File -ErrorAction SilentlyContinue -Path "C:\"

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

Для поиска по всему компьютеру:

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

Ответ 6

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

# https://stackoverflow.com/info/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.

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

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

Я призываю это с:

> findFileByFilename.ps1