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?
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?
Antworten:
Verwenden Sie das Cmdlet Get-ChildItem mit dem -Recurse
Schalter:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
cd V:\MyFolder
gefolgt vonls -r -inc CopyForBuild.bat
ls -r -ea silentlycontinue -fo -inc "filename.txt" | % { $_.fullname }
*
) am Ende des Dateinamens hinzufügte . ****** LINE1: $File = "Microsoft.OData.Core.NetFX35.V7*"
LINE2: $Folder = "C:\Program Files"
LINE3:Get-ChildItem -Path $Folder -Filter $File -Recurse -ErrorAction SilentlyContinue -Force
Ich verwende dies, um Dateien zu finden und PowerShell den gesamten Pfad der Ergebnisse anzeigen zu lassen:
dir -Path C:\FolderName -Filter FileName.fileExtension -Recurse | %{$_.FullName}
Sie können den Platzhalter immer *
im FolderName
und / oder verwenden FileName.fileExtension
. Beispielsweise:
dir -Path C:\Folder* -Filter File*.file* -Recurse | %{$_.FullName}
Im obigen Beispiel wird jeder Ordner im C:\
Laufwerk durchsucht, der mit dem Wort beginnt Folder
. Wenn Sie also einen Ordner mit dem Namen haben FolderFoo
und FolderBar
PowerShell die Ergebnisse dieser beiden Ordner anzeigt.
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
Hier ist die Methode, die ich mir nach dem Kämpfen endlich ausgedacht habe:
Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*
Verwenden Sie Folgendes, um die Ausgabe sauberer zu machen (nur Pfad):
(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname
Verwenden Sie Folgendes, um nur das erste Ergebnis zu erhalten:
(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname | Select -First 1
Nun zu den wichtigen Dingen:
So suchen Sie nur für Dateien / Verzeichnisse Sie nicht verwenden , -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 die -eq $false
for-Verzeichnisse. Hinterlassen Sie keine nachgestellten Platzhalter wie bin/*
.
Warum nicht die eingebauten Schalter verwenden? Sie sind schrecklich und entfernen Merkmale zufällig. Um beispielsweise -Include
eine Datei verwenden zu können, müssen Sie den Pfad mit einem Platzhalter beenden. Dies deaktiviert jedoch den -Recurse
Schalter, ohne Ihnen Folgendes zu sagen:
Get-ChildItem -File -Recurse -Path ./bin/* -Include *.lib
Sie würden denken, das würde Ihnen alle *.lib
s in allen Unterverzeichnissen geben, aber es wird nur die oberste Ebene von suchen bin
.
Um nach Verzeichnissen zu suchen, können Sie verwenden -Directory
, aber dann müssen Sie den nachfolgenden Platzhalter entfernen. Aus irgendeinem Grund wird dies nicht deaktiviert -Recurse
. 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
ist aliasiert auf gci
-Path
ist standardmäßig Position 0, sodass Sie nur den ersten Argumentpfad erstellen können-Recurse
ist aliasiert auf -s
-Include
hat keine AbkürzungVersuche dies:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
| Where-Object { !$_PSIsContainer }
, um Ordner auszuschließen
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' }
'\ACopyForBuild\.(bat|cmd)\Z'
?
Um die Antwort zu @ user3303020 hinzuzufügen und die Suchergebnisse in eine Datei auszugeben, können Sie sie ausführen
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat > path_to_results_filename.txt
Auf diese Weise kann es einfacher sein, nach der richtigen Datei zu suchen.