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
Ответы
Ответ 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