2010-08-06 13 views
22

Szukano wszędzie, ale bez powodzenia. Chciałem napisać mały skrypt, który wyszukał dokładną nazwę pliku, a nie tylko ciąg znaków w nazwie pliku. Na przykład, jeśli szukam "hostów" przy użyciu Eksploratora, domyślnie otrzymuję wiele wyników. Ze skryptem chcę TYLKO nazwę, którą podaję. Zakładam, że to możliwe?Skrypt powershell do zlokalizowania określonej nazwy pliku/pliku?

Naprawdę dopiero zacząłem scenariusz i to tylko na mój osobisty użytek, więc to nie jest ważne, to tylko podsłuchuje. Mam kilka dysków, więc zacząłem od 2 wejść, jeden do zapytania na literę dysku, a drugi do określenia nazwy pliku. Mogę wyszukiwać według rozszerzenia, rozmiaru pliku itp., Ale nie mogę przypisać wyszukiwania do dokładnej nazwy.

Każda pomoc zostanie doceniona!

EDYCJA: Podziękowania dla wszystkich odpowiedzi. Wystarczy zaktualizować. Dodałem jedną z odpowiedzi do mojego małego skryptu i działa dobrze. Wszystkie trzy odpowiedzi zadziałały, ale mogłem użyć tylko jednego, bez urazy dla pozostałych dwóch. Twoje zdrowie. Aby wyjaśnić, "npp" jest aliasem dla Notepad ++, aby otworzyć znaleziony plik.

$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 

Odpowiedz

39

z wiersza polecenia w katalogu głównym:

gci -recurse -filter "hosts" 

będzie tylko powrót dokładne dopasowanie do FILENAME "hosts" - i wiele czerwonych wiadomości, w których potrzebuję podwyższonych uprawnień (-:

Zasadniczo filtr i s, myślę, klucz.


Addednum jak SteveMustafa wskazuje, można teraz użyć przełącznika -file dać następujące rekursywnie wyszukać pliki o nazwie „gospodarzy”:

gci -recurse -filter "hosts" -File 

A jeśli chcesz uniknąć „dostęp aby ścieżka jest zabroniony błędy”, a następnie

gci -recurse -filter "hosts" -file -ErrorAction SilentlyContinue 
+3

Ah tak, "-Filtr" jest szybszy. Powiedział, że szuka plików, więc musisz dodać '? {! $ PsIsContainer} '. –

+0

Dziękuję, dokładnie to, co byłem po :) – gavin19

+1

dlaczego nie dodać przełącznik -File? – SteveMustafa

10

Zakładając masz Z: napęd odwzorowany:

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

Dziękuję. Rozbudowana odpowiedź, działała idealnie.Nauczyłem się kilku rzeczy :) – gavin19

7

używam tego formularza tylko dla tego rodzaju rzeczy:

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

. mapuje do parametru pozycyjnego Path oraz mapy "hostów" do parametru pozycyjnego Filter. Gorąco polecam używanie Filter przez Include, jeśli dostawca obsługuje filtrowanie (i robi to dostawca systemu plików). Jest nieco szybszy niż Include.

+0

Wiwaty, działa świetnie. Bardzo doceniany panie! – gavin19

2

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

3

używam tej funkcji w oparciu o @Murph odpowiedź. Przeszukuje wewnątrz bieżącego katalogu i wyświetla pełną ścieżkę.

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

Przykład użycia: findit myfile

Powiązane problemy