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?
Verwenden Sie das Cmdlet Get-ChildItem mit dem -Recurse
Schalter:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
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
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}
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat
Wird auch funktionieren
Versuche dies:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
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' }
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