я хотел написать небольшой скрипт, который искал точное имя файла, а не строку в имени файла.
Например, если я ищу «хосты» с помощью проводника, по умолчанию я получаю несколько результатов. В сценарии мне нужно ТОЛЬКО указанное мной имя. Я предполагаю, что это возможно?
На самом деле я только начал сценарий, и он предназначен только для моего личного использования, так что это не важно, это меня просто беспокоит. У меня есть несколько дисков, поэтому я начал с двух входов, один для запроса буквы диска, а другой для указания имени файла. Я могу искать по расширению, размеру файла и т. Д., Но не могу привязать поиск к точному имени.
Любая помощь будет принята с благодарностью!
РЕДАКТИРОВАТЬ: Спасибо за все ответы. Просто обновить. Я добавил один из ответов в свой крошечный скрипт, и он хорошо работает. Все три ответа сработали, но в конечном итоге я смог использовать только один, не обижаясь на два других. Ваше здоровье. Чтобы уточнить, «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
В приглашении powershell используйте команду gci
(псевдоним для Get-ChildItem
) и -filter
option:
gci -recurse -filter "hosts"
Это вернет точное соответствие имени файла "hosts
".
SteveMustafa указывает, что в текущих версиях powershell вы можете использовать переключатель -File
для рекурсивного поиска только файлов с именем "hosts
" (а не каталогов или других различных сущностей файловой системы):
gci -recurse -filter "hosts" -File
Команда может вывести множество красных сообщений об ошибках типа "Доступ к пути 'C:\Windows\Prefetch' запрещен.
".
Если вы хотите избежать сообщений об ошибках, установите -ErrorAction
в значение silent.
gci -recurse -filter "hosts" -File -ErrorAction SilentlyContinue
Дополнительным помощником является то, что вы можете задать корень для поиска с помощью -Path
.
Результирующая команда для явного поиска, например, от корня диска C будет
gci -Recurse -Filter "hosts" -File -ErrorAction SilentlyContinue -Path "C:\"
Предположим, что у вас подключен диск Z:
:
Get-ChildItem -Path "Z:" -Recurse | Where-Object { !$PsIsContainer -and [System.IO.Path]::GetFileNameWithoutExtension($_.Name) -eq "hosts" }
Я использую эту форму для таких вещей:
gci . hosts -r | ? {!$_.PSIsContainer}
.
сопоставляется с позиционным параметром Путь
, а «хосты» сопоставляются с позиционным параметром Фильтр
. Я настоятельно рекомендую использовать Фильтр
вместо Включить
, если провайдер поддерживает фильтрацию (а провайдер файловой системы поддерживает).Это немного быстрее, чем Include
.