Holen Sie sich den vollständigen Pfad der Dateien in PowerShell

145

Ich muss alle Dateien abrufen, einschließlich der Dateien in den Unterordnern, die zu einem bestimmten Typ gehören.

Ich mache so etwas mit Get-ChildItem :

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

Es werden mir jedoch nur die Dateinamen und nicht der gesamte Pfad zurückgegeben.

Gagan
quelle

Antworten:

219

Fügen Sie | select FullNameam Ende Ihrer Zeile oben hinzu. Wenn Sie danach tatsächlich etwas damit tun müssen, müssen Sie es möglicherweise in eine foreach-Schleife leiten, wie folgt:

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

Dies sollte viel schneller funktionieren als die Verwendung einer späten Filterung:

Get-ChildItem C:\WINDOWS\System32 -Filter *.txt -Recurse | % { $_.FullName }
Shay Levy
quelle
14
Das ist wahr. Eine Einschränkung: Dieser Befehl ruft tatsächlich Dateien ab *.txt*( -Filterverwendet CMD-Platzhalter). Wenn dies nicht das ist, was Sie wollen, dann verwenden Sie -Include *.txt.
Roman Kuzmin
26

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

Get-ChildItem "C:\WINDOWS\System32" *.txt -Recurse | Select-Object FullName
imlokesh
quelle
5
Beachten Sie, dass Select-ObjectErträge PSCustomObject, kein String. Es könnte nicht funktionieren, wenn Sie Ergebnis als Parameter für ein anderes Programm verwenden
Chintsu
5
Ja zu dem, was @Chintsu gesagt hat. Um Zeichenfolgen anstelle von zu erhalten PSCustomObject, verwenden Sie -ExpandProperty FullNamestatt einfach FullName. Soweit ich -ExpandPropertyweiß, bewirkt der Parameter, dass das Cmdlet die Ergebnisse als Typ (nativ?) Der angegebenen Eigenschaft anstatt als benutzerdefiniertes Objekt zurückgibt.
DoubleDown
Ich brauchte auch Zeit (ich hatte mit der Quelle eines Programms herumgespielt und später gedacht, dass ich wahrscheinlich mit der Quellcodeverwaltung hätte beginnen sollen, aber ich kann mir ein Bild von meinem ersten Commit gegen "Master" machen, indem ich Dateien seit der Installation abrufe:Get-ChildItem -Path 'C:\Program Files\TheProgram' -Recurse | Where-Object -FilterScript {($_.LastWriteTime -gt '2020-03-01')} | Select-Object FullName
Neil Guy Lindberg
19

Hier ist eine kürzere:

(Get-ChildItem C:\MYDIRECTORY -Recurse).fullname > filename.txt
JustAGuy
quelle
23
Hier ist eine kürzere:(gci -r c:\).fullname
Chris N
11
Hier ist eine kürzere:(ls -r c:\).fullname
Kalamane
15
Hier ist eine kürzere:(ls -r c:).fullname
Valiante
9

Wenn Sie relative Pfade wünschen, können Sie einfach das -NameFlag verwenden.

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

Polymorphix
quelle
5
Get-ChildItem -Recurse *.txt | Format-Table FullName

Das habe ich benutzt. Ich halte es für verständlicher, da es keine Schleifensyntax enthält.

Mandrake
quelle
5

Wirklich nervige Sache in PS 5, wo $ _ nicht der vollständige Pfad innerhalb von foreach ist. Dies sind die Zeichenfolgenversionen von FileInfo- und DirectoryInfo-Objekten. Aus irgendeinem Grund wird es durch einen Platzhalter im Pfad behoben oder Sie verwenden Powershell 6 oder 7. Sie können auch eine Pipe verwenden, um das Objekt in der Mitte abzurufen.

Get-ChildItem -path C:\WINDOWS\System32\*.txt -Recurse | foreach { "$_" }

Get-ChildItem -path C:\WINDOWS\System32 -Recurse | get-item | foreach { "$_" }

Dies scheint ein Problem mit .Net gewesen zu sein, das in .Net Core (Powershell 7) behoben wurde : Das Stringifizierungsverhalten von FileInfo / Directory-Instanzen hat sich seit Version 6.0.2 # 7132 geändert

js2010
quelle
4

Dies hat bei mir funktioniert und eine Liste mit Namen erstellt:

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

Ich fand es mit get-member -membertype propertieseinem unglaublich nützlichen Befehl. Die meisten Optionen, die es Ihnen gibt, werden mit einem angehängt .<thing>, wie fullnamehier. Sie können den gleichen Befehl verwenden.

  | get-member -membertype properties 

Am Ende eines Befehls erhalten Sie weitere Informationen darüber, was Sie mit ihnen tun können und wie Sie auf diese zugreifen können:

get-childitem -path 10* -include '*.JPG' -recurse | get-member -membertype properties
L1ttl3J1m
quelle
3

Versuche dies:

Get-ChildItem C:\windows\System32 -Include *.txt -Recurse | select -ExpandProperty FullName
Mykhailo Basiuk
quelle
2
Bitte fügen Sie ein paar Informationen hinzu, was bei Ihrem Versuch anders ist und warum der andere nicht funktioniert hat.
Uwe Allner
2

Warum hat noch niemand die foreach-Schleife verwendet? Ein Vorteil hier ist, dass Sie Ihre Variable einfach benennen können:

# Note that I'm pretty explicit here. This would work as well as the line after:
# Get-ChildItem -Recurse C:\windows\System32\*.txt
$fileList = Get-ChildItem -Recurse -Path C:\windows\System32 -Include *.txt
foreach ($textfile in $fileList) {
    # This includes the filename ;)
    $filePath = $textfile.fullname
    # You can replace the next line with whatever you want to.
    Write-Output $filePath
}
NostraDavid
quelle
Wie kann ich den einzelnen Dateipfad einer Textdatei abrufen, ohne foreach-Textdatei in fileList zu verwenden? so etwas wie textfile = $ fileList [$ i] .fullname, ich weiß, ist nicht der optimalste Ansatz, aber ich muss es so machen :(
Heber Solis
Fügen Sie einfach ein $vor textfile: $textfile = $fileList[$i].FullName. Angenommen, es $igibt einen numerischen Wert.
NostraDavid
1
gci "C:\WINDOWS\System32" -r -include .txt | select fullname
Vuong Doan
quelle
6
Könnten Sie bitte Ihre Antwort näher erläutern und etwas mehr Beschreibung der von Ihnen bereitgestellten Lösung hinzufügen?
Abarisone
1

[alternative Syntax]

Für manche Menschen sind Richtungsrohrbetreiber nicht ihr Geschmack, sondern sie bevorzugen die Verkettung. Einige interessante Meinungen zu diesem Thema finden Sie im Roslyn Issue Tracker: dotnet / roslyn # 5445 .

Basierend auf dem Fall und dem Kontext kann einer dieser Ansätze als implizit (oder indirekt) betrachtet werden. In diesem Fall erfordert die Verwendung von Pipe gegen Enumerable beispielsweise ein spezielles Token $_(auch bekannt als)PowerShell's "THIS" token ) für einige unangenehm erscheint.

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

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

(<rant> Beachten Sie, dass Powershell - Befehl Argumente Parser der Teil-Parameternamen akzeptieren also zusätzlich zu. -recursive, -recursiv, -recursi, -recurs, -recur, -recu, -recund -reakzeptiert werden, aber leider nicht -r.. das ist die einzig richtige Wahl , den Sinn mit Einzel macht -Charakter (wenn wir gehen Sie nach POSIXy UNIXy Konventionen)! </ rant>)

vulkanischer Rabe
quelle
1
Hinweis zum Geschwätz: Die -rKurzform von -Recursefunktioniert gut für mich.
Polymorphix
@Polymorphix, Sie haben Recht, es funktioniert für mich unter Windows 10 (nicht sicher, welche Version ich zuvor versucht habe). Gleiches gilt jedoch für -Fileswitch -fiim Beispiel: -filund -filefunktioniert, aber nicht -f. Im POSIX-Stil sollte es --file(mehrere Buchstaben) und -f(einzelne Buchstaben sein, es sei denn, -f ist für etwas anderes reserviert, sagen wir forceswitch, dann kann es etwas anderes sein -loder überhaupt keine Option für einzelne Buchstaben).
Vulkanischer Rabe
1

Ich verwende das folgende Skript, um alle Ordnerpfade zu löschen:

Get-ChildItem -path "C:\" -Recurse -Directory -Force -ErrorAction SilentlyContinue | Select-Object FullName | Out-File "Folder_List.csv"

Der vollständige Ordnerpfad kommt nicht. Nach 113 Zeichen kommt:

Example - C:\ProgramData\Microsoft\Windows\DeviceMetadataCache\dmrccache\en-US\ec4d5fdd-aa12-400f-83e2-7b0ea6023eb7\Windows...
Ankit Gupta
quelle
0

Ich habe diesen Zeilenbefehl verwendet, um ".xlm" -Dateien in "C: \ Temp" und den Pfad für den vollständigen Ausdruck des Ergebnisses in der Datei "result.txt" zu suchen:

(Get-ChildItem "C:\Temp" -Recurse | where {$_.extension -eq ".xml"} ).fullname > result.txt 

In meinen Tests funktioniert diese Syntax für mich sehr gut.

Josué Salomão
quelle