it-swarm.com.de

Wie kann ich Dateien mit bestimmten Erweiterungen in PowerShell rekursiv abrufen?

Für einen bestimmten Ordner muss ich alle Dateien mit der Erweiterung .js auflisten, auch wenn sie auf jeder Ebene in Unterordnern verschachtelt sind.

Das Ergebnis für die Ausgabekonsole sollte eine Liste von Dateinamen ohne zeilenweise Erweiterung sein, die einfach kopiert und in eine andere Anwendung eingefügt werden kann.

Im Moment versuche ich das, aber in der Ausgabekonsole bekomme ich mehrere Metainformationen und keine einfache Liste.

Get-ChildItem -Path C:\xx\x-Recurse -File | sort length –Descending

Könnten Sie mir bitte ein paar Hinweise geben?

22
GibboK

Wenn keine Sortierung nach Länge erforderlich ist, können Sie mit dem Parameter -Name nur den Namen von Get-ChildItem zurückgeben, und anschließend mit [System.IO.Path]::GetFileNameWithoutExtension() den Pfad und die Erweiterung entfernen:

Get-ChildItem -Path .\ -Filter *.js -Recurse -File -Name| ForEach-Object {
    [System.IO.Path]::GetFileNameWithoutExtension($_)
}

Wenn nach Länge sortiert werden soll, löschen Sie den -Name-Parameter und geben Sie die BaseName-Eigenschaft jedes FileInfo-Objekts aus. Sie können die Ausgabe (in beiden Beispielen) an clip weiterleiten, um sie in die Zwischenablage zu kopieren:

Get-ChildItem -Path .\ -Filter *.js -Recurse -File| Sort-Object Length -Descending | ForEach-Object {
    $_.BaseName
} | clip

Wenn Sie den vollständigen Pfad ohne die Erweiterung wünschen, ersetzen Sie $_.BaseName durch:

$_.FullName.Remove($_.FullName.Length - $_.Extension.Length)
32

Die einfache Option besteht darin, die .Name-Eigenschaft des FileInfo-Elements in der Pipeline zu verwenden und dann die Erweiterung zu entfernen:

Get-ChildItem -Path "C:\code\" -Filter *.js -r | % { $_.Name.Replace( ".js","") }
5
Stephen Dunne

Es gibt zwei Methoden zum Filtern von Dateien: globbing mit einem Platzhalter oder mit einem regulären Ausdruck (Regex). 

Warnung: Die Globbing-Methode hat den Nachteil, dass sie auch Dateien angleicht, die nicht übereinstimmen sollten, wie *.jsx

# globbing with Wildcard filter 
# the error action prevents the output of errors
# (ie. directory requires admin rights and is inaccessible)
Get-ChildItem -Recurse -Filter '*.js' -ErrorAction 'SilentlyContinue' 

# filter by Regex
Where-Object { $_.Name -Match '.*\.js$' }

Sie können dann nach Namen oder nach Dateigröße sortieren: 

# sort the output 
Sort-Object -PropertyName 'Length'

Formatieren Sie eine einfache Liste mit Pfad und Dateinamen: 

# format output
Format-List -Property ('Path','Name')

Um die Dateierweiterung zu entfernen, können Sie das Ergebnis mit einer Auswahl zuordnen: 

Select-Item { $_.Name.Replace( ".js", "")

Alles in allem gibt es auch eine sehr kurze Version, die Sie nicht in Skripten verwenden sollten, da sie kaum lesbar ist: 

ls -r | ? { $_.Name -m '.*\.js' } | sort Length | % { $_.Name.Replace( ".js", "") | fl
1
MovGP0

Verwenden Sie BaseName für den Dateinamen ohne Dateierweiterung.

Get-ChildItem -Path ".\*.js" | Sort-Object Length -Descending | ForEach-Object {
    $_.BaseName  
}
0
stomy