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.

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
}

101

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

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

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

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

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


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.


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


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

3

Versuche dies:

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

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
}

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

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>)


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...

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.