it-swarm.com.de

Rekursive Dateisuche mit PowerShell

Ich suche in allen Ordnern nach einer Datei.

Copyforbuild.bat ist an vielen Stellen verfügbar und ich möchte rekursiv suchen.

$File = "V:\Myfolder\**\*.CopyForbuild.bat"

Wie kann ich das in PowerShell machen?

219
Samselvaprabu

Verwenden Sie das Cmdlet Get-ChildItem mit dem -Recurse Schalter:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
359
Shay Levy

Beim Durchsuchen von Ordnern, bei denen aufgrund der Sicherheit möglicherweise ein Fehler auftritt (z. B. C:\Users), benutze den folgenden Befehl:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
30
Mötz

Ich verwende dies, um Dateien zu finden und PowerShell dann den gesamten Pfad der Ergebnisse anzeigen zu lassen:

dir -Path C:\FolderName -Filter FileName.fileExtension -Recurse | %{$_.FullName}

Sie können immer den Platzhalter * In FolderName und/oder FileName.fileExtension Verwenden. Zum Beispiel:

dir -Path C:\Folder* -Filter File*.file* -Recurse | %{$_.FullName}

Im obigen Beispiel wird jeder Ordner auf dem Laufwerk C:\ Durchsucht, der mit dem Wort Folder beginnt. Wenn Sie also einen Ordner mit dem Namen FolderFoo und FolderBar haben, zeigt PowerShell die Ergebnisse dieser beiden Ordner an.

Gleiches gilt für den Dateinamen und die Dateierweiterung. Wenn Sie nach einer Datei mit einer bestimmten Erweiterung suchen möchten, aber den Namen der Datei nicht kennen, können Sie Folgendes verwenden:

dir -Path C:\FolderName -Filter *.fileExtension -Recurse | %{$_.FullName}

Oder umgekehrt:

dir -Path C:\FolderName -Filter FileName.* -Recurse | %{$_.FullName}
30
BinaryJoe01
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat

Wird auch funktionieren

11
user3303020

Versuche dies:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
6
Sevenfold

Filtern mit Platzhaltern:

Get-ChildItem -Filter CopyForBuild* -Include *.bat,*.cmd -Exclude *.old.cmd,*.old.bat -Recurse

Filtern mit einem regulären Ausdruck:

Get-ChildItem -Path "V:\Myfolder" -Recurse
| Where-Object { $_.Name -match '\ACopyForBuild\.[(bat)|(cmd)]\Z' }
5
MovGP0

Hier ist die Methode, die ich nach dem Kampf gefunden habe:

Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*

Um die Ausgabe sauberer zu machen (nur Pfad), verwenden Sie:

(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname

Um nur das erste Ergebnis zu erhalten, verwenden Sie:

(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname | Select -First 1

Nun zu den wichtigen Dingen:

Um nur nach Dateien/Verzeichnissen zu suchen, verwenden Sie nicht-File Oder -Directory (Siehe unten, warum). Verwenden Sie dies stattdessen für Dateien:

Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}

und entfernen Sie den -eq $false für Verzeichnisse. Setzen Sie nicht einen abschließenden Platzhalter wie bin/*.

Warum nicht die eingebauten Schalter benutzen? Sie sind schrecklich und entfernen zufällig Merkmale. Um beispielsweise -Include Für eine Datei zu verwenden, müssen Sie den Pfad mit einem Platzhalter beenden. Dadurch wird jedoch die Option -Recurse Deaktiviert, ohne dass Sie dazu aufgefordert werden:

Get-ChildItem -File -Recurse -Path ./bin/* -Include *.lib

Sie würden denken, das würde Ihnen alle *.lib In allen Unterverzeichnissen geben, aber es wird nur die oberste Ebene von bin durchsucht.

Um nach Verzeichnissen zu suchen, können Sie -Directory Verwenden. Anschließend müssen Sie den nachfolgenden Platzhalter entfernen. Aus irgendeinem Grund wird -Recurse Dadurch nicht deaktiviert. Aus diesen Gründen empfehle ich, die eingebauten Flags nicht zu verwenden.

Sie können diesen Befehl erheblich verkürzen:

Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}

wird

gci './path*/' -s -Include 'name*' | where {$_.PSIsContainer -eq $false}
  • Get-ChildItem Hat ein Alias ​​von gci
  • -Path Ist standardmäßig auf Position 0 eingestellt, Sie können also nur den Pfad des ersten Arguments angeben
  • -Recurse Hat einen Alias ​​von -s
  • -Include Hat keine Abkürzung
  • Verwenden Sie einfache Anführungszeichen für Leerzeichen in Namen/Pfaden, damit Sie den gesamten Befehl in doppelte Anführungszeichen setzen und in der Eingabeaufforderung verwenden können. Die umgekehrte Vorgehensweise (mit einfachen Anführungszeichen) führt zu Fehlern
2
hLk