2012-10-29 15 views
83

Ich muss alle Dateien einschließlich der Dateien in den Unterordnern, die zu einem bestimmten Typ gehören, erhalten.Vollständigen Pfad der Dateien in PowerShell

ich so etwas wie dies tue, mit Get-ChildItem:

Get-ChildItem "C:\windows\System32" -Recurse | where {$_.extension -eq ".txt"} 

Allerdings ist es Rückkehr nur mir die Dateinamen und nicht den gesamten Pfad.

Antwort

135

Fügen Sie | select FullName am Ende Ihrer Zeile oben hinzu. Wenn Sie tatsächlich mit, dass etwas tun müssen, um danach, können Sie mit dem Rohr haben es in eine foreach-Schleife, etwa so:

get-childitem "C:\windows\System32" -recurse | where {$_.extension -eq ".txt"} | % { 
    Write-Host $_.FullName 
} 
60

Diese führen sollte viel schneller als spät Filterung:

Get-ChildItem C:\WINDOWS\System32 -Filter *.txt -Recurse | % { $_.FullName } 
+11

Das stimmt. Ein Vorbehalt: Dieser Befehl ruft Dateien wie '* .txt *' ab ('-Filter' verwendet CMD-Platzhalter). Wenn dies nicht das ist, was Sie wollen, verwenden Sie '-Include * .txt'. –

6

Hier ein kürzerer:

(Get-ChildItem C:\MYDIRECTORY -Recurse).fullname > filename.txt 
+8

Hier ist eine kürzere: '(gci -r c: \). Fullname' –

13

Sie können auch Select-Object wie so verwenden:

Get-ChildItem "C:\WINDOWS\System32" *.txt -Recurse | Select-Object FullName 
+4

Beachten Sie, dass' Select-Object' 'PSCustomObject' zurückgibt, keine Zeichenfolge. Es funktioniert möglicherweise nicht, wenn Sie das Ergebnis als Parameter für ein anderes Programm verwenden – Chintsu

+4

Ja, was @Chintsu sagte. Um Zeichenfolgen anstelle von 'PSCustomObject' zu erhalten, verwenden Sie' -ExpandProperty FullName' anstatt einfach 'FullName'. Soweit ich verstehe, bewirkt der Parameter "-ExpandProperty", dass das Cmdlet die Ergebnisse als (nativen?) Typ der angegebenen Eigenschaft anstelle eines benutzerdefinierten Objekts zurückgibt. – doubleDown

1

Versuchen Sie folgendes:

Get-ChildItem C:\windows\System32 -Include *.txt -Recurse | select -ExpandProperty FullName 
+2

Bitte fügen Sie ein paar Informationen darüber hinzu, was bei Ihrem Versuch anders ist und warum der andere nicht funktioniert hat. –

1
gci "C:\WINDOWS\System32" -r -include .txt | select fullname 
+5

Könnten Sie bitte Ihre Antwort näher erläutern, indem Sie ein wenig mehr Beschreibung der von Ihnen bereitgestellten Lösung hinzufügen? – abarisone

1

[alternative Syntax]

Für manche Menschen Richtrohrbetreiber nicht ihren Geschmack, sondern sie eher Verkettungs bevorzugen. Sehen Sie einige interessante Meinungen zu diesem Thema in Roslyn Issue Tracker geteilt: dotnet/roslyn#5445.

Basierend auf dem Fall und dem Kontext kann einer dieser Ansätze als implizit (oder indirekt) betrachtet werden. Zum Beispiel, in diesem Fall die Verwendung von Rohr gegen aufzählbar erfordert spezielle Token $_ (aka PowerShell's "THIS" token) kann für einige unangenehm erscheinen.

Für solche fellas, hier ist ein prägnanter, geradlinig, wie es mit Punkt zu tun Verkettungs:

(gci . -re -fi *.txt).FullName 

(< rant> Beachten Sie, dass Powershell-Befehl Argumente Parser die Teil-Parameternamen akzeptiert . So zusätzlich zu -recursive; -recursiv, -recursi, -recurs, -recur, -recu, -rec und -re werden akzeptiert, aber leider nicht -r .. das ist die einzig richtige choic Das macht Sinn mit einzelnen - Zeichen (wenn wir nach POSIXy UNIXy Konventionen gehen)! </rant >)

+1

Hinweis zum Ritt: Die '-r' Kurzform von' -Recurse' funktioniert gut für mich. – Polymorphix

+0

@Polymorphix, Sie haben Recht, es funktioniert für mich auf Windows 10 (nicht sicher, welche Version ich zuvor versucht habe). Gleiches gilt jedoch für '-File' switch' -fi im Sample: 'fil' und' file' funktionieren, aber nicht '-f'. Im POSIX-Stil sollte es "--file" (Multi-Buchstaben) und "-f" (single-letter, außer -f ist für etwas anderes, sagen "force" Schalter, dann kann es etwas anderes sein wie "-l" oder überhaupt keine Ein-Buchstaben-Option). –

0

Das ist für mich gearbeitet, und eine Liste mit Namen:

$Thisfile=(get-childitem -path 10* -include '*.JPG' -recurse).fullname 

ich es gefunden get-member -membertype properties unter Verwendung eines unglaublich nützlichen Befehl. die meisten Optionen, die es Ihnen gibt, sind mit einem .<thing> angehängt, wie fullname ist hier.Sie können den gleichen Befehl beibehalten;

| get-member -membertype properties 

am Ende eines Befehls mehr Informationen über die Dinge bekommen Sie mit ihnen machen können und wie diese zuzugreifen:

get-childitem -path 10* -include '*.JPG' -recurse | get-member -membertype properties 
3
Get-ChildItem -Recurse *.txt | Format-Table FullName 

Das ist, was ich verwenden. Ich denke, es ist verständlicher, da es keine Schleifensyntax enthält.

5

Wenn relative Pfade das sind, was Sie wollen, können Sie einfach das -Name Flag verwenden.

Get-ChildItem "C:\windows\System32" -Recurse -Filter *.txt -Name

Verwandte Themen