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.
powershell
powershell-2.0
Gagan
quelle
quelle
*.txt*
(-Filter
verwendet CMD-Platzhalter). Wenn dies nicht das ist, was Sie wollen, dann verwenden Sie-Include *.txt
.Sie können Select-Object auch wie folgt verwenden:
quelle
Select-Object
ErträgePSCustomObject
, kein String. Es könnte nicht funktionieren, wenn Sie Ergebnis als Parameter für ein anderes Programm verwendenPSCustomObject
, verwenden Sie-ExpandProperty FullName
statt einfachFullName
. Soweit ich-ExpandProperty
weiß, bewirkt der Parameter, dass das Cmdlet die Ergebnisse als Typ (nativ?) Der angegebenen Eigenschaft anstatt als benutzerdefiniertes Objekt zurückgibt.Get-ChildItem -Path 'C:\Program Files\TheProgram' -Recurse | Where-Object -FilterScript {($_.LastWriteTime -gt '2020-03-01')} | Select-Object FullName
Hier ist eine kürzere:
quelle
(gci -r c:\).fullname
(ls -r c:\).fullname
(ls -r c:).fullname
Wenn Sie relative Pfade wünschen, können Sie einfach das
-Name
Flag verwenden.Get-ChildItem "C:\windows\System32" -Recurse -Filter *.txt -Name
quelle
Das habe ich benutzt. Ich halte es für verständlicher, da es keine Schleifensyntax enthält.
quelle
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.
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
quelle
Dies hat bei mir funktioniert und eine Liste mit Namen erstellt:
Ich fand es mit
get-member -membertype properties
einem unglaublich nützlichen Befehl. Die meisten Optionen, die es Ihnen gibt, werden mit einem angehängt.<thing>
, wiefullname
hier. Sie können den gleichen Befehl verwenden.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:
quelle
Versuche dies:
quelle
Warum hat noch niemand die foreach-Schleife verwendet? Ein Vorteil hier ist, dass Sie Ihre Variable einfach benennen können:
quelle
$
vortextfile
:$textfile = $fileList[$i].FullName
. Angenommen, es$i
gibt einen numerischen Wert.quelle
[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 :
(<rant> Beachten Sie, dass Powershell - Befehl Argumente Parser der Teil-Parameternamen akzeptieren also zusätzlich zu.
-recursive
,-recursiv
,-recursi
,-recurs
,-recur
,-recu
,-rec
und-re
akzeptiert 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>)quelle
-r
Kurzform von-Recurse
funktioniert gut für mich.-File
switch-fi
im Beispiel:-fil
und-file
funktioniert, 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 wirforce
switch, dann kann es etwas anderes sein-l
oder überhaupt keine Option für einzelne Buchstaben).Ich verwende das folgende Skript, um alle Ordnerpfade zu löschen:
Der vollständige Ordnerpfad kommt nicht. Nach 113 Zeichen kommt:
quelle
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:
In meinen Tests funktioniert diese Syntax für mich sehr gut.
quelle