2010-08-06 17 views
22

Gesucht überall dafür aber kein Glück. Ich wollte ein kleines Skript schreiben, das nach einem genauen Dateinamen und nicht nur nach einem String innerhalb eines Dateinamens sucht. Wenn ich beispielsweise mit dem Explorer nach "Hosts" suche, erhalte ich standardmäßig mehrere Ergebnisse. Mit dem Skript möchte ich NUR den von mir angegebenen Namen angeben. Ich gehe davon aus, dass es möglich ist?Powershell-Skript zum Suchen eines bestimmten Datei-/Dateinamens?

Ich hatte erst wirklich das Skript gestartet und es ist nur für meinen persönlichen Gebrauch, also ist es nicht wichtig, es nervt mich nur. Ich habe mehrere Laufwerke, also habe ich mit 2 Eingängen begonnen, einen, um den Laufwerksbuchstaben abzufragen, und einen anderen, um den Dateinamen anzugeben. Ich kann nach der Erweiterung, der Dateigröße usw. suchen, kann aber die Suche nicht auf einen genauen Namen festlegen.

Jede Hilfe wäre willkommen!

EDIT: Danke an alle Antworten. Nur um zu aktualisieren. Ich habe eine der Antworten zu meinem kleinen Skript hinzugefügt und es funktioniert gut. Alle drei Antworten funktionierten, aber ich konnte nur einen verwenden, ohne die anderen beiden zu beleidigen. Prost. Nur um zu verdeutlichen, ist 'npp' ein Alias ​​für Notepad ++, um die einmal gefundene Datei zu öffnen.

$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 

Antwort

39

an einer Eingabeaufforderung an der Wurzel:

gci -recurse -filter "hosts" 

Wird nur eine genaue Übereinstimmung zurückkehren zu filename "hosts" - und viele rote Nachrichten, wo ich erhöhte Berechtigungen brauche (-:

Grundsätzlich das -filter i s, denke ich, der Schlüssel.


Addednum als SteveMustafa weist darauf hin, Sie nun den -File-Switch können folgendes rekursiv nach Dateien zu suchen, geben dem Namen „hosts“:

gci -recurse -filter "hosts" -File 

Und wenn Sie wollen den „Zugang zu vermeiden auf den Pfad „verweigert Fehler dann wird

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

Ah ja, '-Filter' ist dafür schneller. Er sagte, er sucht nach Dateien, also musst du '? {! $ PsIsContainer} '. –

+0

Danke, genau, was ich wollte :) – gavin19

+1

warum nicht den Schalter -File hinzufügen? – SteveMustafa

10

Angenommen, Sie haben einen Z: Laufwerk zugeordnet:

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

Danke. Aufwendige Antwort, hat perfekt funktioniert.Habe auch ein paar Dinge gelernt :) – gavin19

7

ich nur für diese Art der Sache über dieses Formular:

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

. wird auf den Positionsparameter Path abgebildet, und "Hosts" werden dem Positionsparameter Filter zugeordnet. Ich empfehle sehr, Filter über Include zu verwenden, wenn der Anbieter das Filtern unterstützt (und der Dateisystemanbieter tut). Es ist ein gutes Stück schneller als Include.

+0

Prost, funktioniert super. Sehr geschätzter Herr! – gavin19

2

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

3

ich diese Funktion bin mit basierend auf @Murph Antwort. Es durchsucht das aktuelle Verzeichnis und listet den vollständigen Pfad auf.

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

Beispiel Nutzung: findit myfile

Verwandte Themen