Obtenir le chemin complet des fichiers dans PowerShell

146

J'ai besoin d'obtenir tous les fichiers, y compris les fichiers présents dans les sous-dossiers qui appartiennent à un type particulier.

Je fais quelque chose comme ça, en utilisant Get-ChildItem :

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

Cependant, cela ne me renvoie que les noms de fichiers et non le chemin complet.

Gagan
la source

Réponses:

220

Ajoutez | select FullNameà la fin de votre ligne ci-dessus. Si vous devez réellement faire quelque chose avec cela par la suite, vous devrez peut-être le diriger dans une boucle foreach, comme ceci:

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

Cela devrait fonctionner beaucoup plus rapidement que d'utiliser un filtrage tardif:

Get-ChildItem C:\WINDOWS\System32 -Filter *.txt -Recurse | % { $_.FullName }
Shay Levy
la source
14
C'est vrai. Une mise en garde: cette commande obtient en fait des fichiers comme *.txt*( -Filterutilise des jokers CMD). Si ce n'est pas ce que vous voulez, utilisez -Include *.txt.
Roman Kuzmin
26

Vous pouvez également utiliser Select-Object comme ceci:

Get-ChildItem "C:\WINDOWS\System32" *.txt -Recurse | Select-Object FullName
imlokesh
la source
5
Notez que Select-Objectrenvoie PSCustomObject, pas une chaîne. Cela pourrait ne pas fonctionner si vous utilisez le résultat comme paramètre pour un autre programme
Chintsu
5
Oui à ce que @Chintsu a dit. Pour obtenir des chaînes au lieu de PSCustomObject, utilisez -ExpandProperty FullNameau lieu de simplement FullName. Pour autant que je sache, le -ExpandPropertyparamètre oblige l'applet de commande à renvoyer les résultats en tant que type (natif?) De la propriété spécifiée plutôt qu'en tant qu'objet personnalisé.
doubleDown
J'avais besoin de temps aussi (j'avais dérangé la source d'un programme et pensé plus tard que j'aurais probablement dû commencer le contrôle de source dessus, mais je peux avoir une idée de mon premier commit contre "master" en récupérant les fichiers depuis l'installation:Get-ChildItem -Path 'C:\Program Files\TheProgram' -Recurse | Where-Object -FilterScript {($_.LastWriteTime -gt '2020-03-01')} | Select-Object FullName
Neil Guy Lindberg
19

En voici une plus courte:

(Get-ChildItem C:\MYDIRECTORY -Recurse).fullname > filename.txt
JustAGuy
la source
23
En voici un plus court:(gci -r c:\).fullname
Chris N
11
En voici une plus courte:(ls -r c:\).fullname
Kalamane
15
En voici un plus court:(ls -r c:).fullname
Valiante
9

Si vous voulez des chemins relatifs, vous pouvez simplement utiliser l' -Nameindicateur.

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

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

C'est ce que j'ai utilisé. Je pense que c'est plus compréhensible car il ne contient aucune syntaxe de boucle.

Mandragore
la source
5

Chose vraiment ennuyeuse dans PS 5, où $ _ ne sera pas le chemin complet à l'intérieur de foreach. Ce sont les versions chaîne des objets FileInfo et DirectoryInfo. Pour une raison quelconque, un caractère générique dans le chemin le corrige, ou utilisez Powershell 6 ou 7. Vous pouvez également diriger vers get-item au milieu.

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

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

Cela semble avoir été un problème avec .Net qui a été résolu dans .Net Core (Powershell 7): le comportement de stringification des instances FileInfo / Directory a changé depuis la v6.0.2 # 7132

js2010
la source
4

Cela a fonctionné pour moi et produit une liste de noms:

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

Je l'ai trouvé en utilisant get-member -membertype properties, une commande incroyablement utile. la plupart des options qu'il vous propose sont accompagnées d'un .<thing>, comme fullnameici. Vous pouvez coller la même commande;

  | get-member -membertype properties 

à la fin de toute commande pour obtenir plus d'informations sur ce que vous pouvez faire avec eux et comment y accéder:

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

Essaye ça:

Get-ChildItem C:\windows\System32 -Include *.txt -Recurse | select -ExpandProperty FullName
Mykhailo Basiuk
la source
2
Veuillez ajouter un peu d'informations sur ce qui est différent avec votre tentative et pourquoi l'autre n'a pas fonctionné.
Uwe Allner
2

Pourquoi personne n'a encore utilisé la boucle foreach? Un avantage ici est que vous pouvez facilement nommer votre variable:

# 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
la source
Comment puis-je obtenir le chemin de fichier individuel d'un fichier texte sans utiliser foreach textfile dans fileList? quelque chose comme textfile = $ fileList [$ i] .fullname, je sais que ce n'est pas l'approche la plus optimale mais je dois le faire de cette façon :(
Heber Solis
Il suffit d' ajouter un $devant textfile: $textfile = $fileList[$i].FullName. En supposant qu'il $ia une valeur numérique, c'est-à-dire.
NostraDavid
1
gci "C:\WINDOWS\System32" -r -include .txt | select fullname
Vuong Doan
la source
6
Pourriez-vous s'il vous plaît élaborer davantage votre réponse en ajoutant un peu plus de description de la solution que vous fournissez?
abarisone le
1

[syntaxe alternative]

Pour certaines personnes, les opérateurs de tuyauterie directionnelle ne sont pas à leur goût, mais préfèrent plutôt le chaînage. Voir quelques opinions intéressantes sur ce sujet partagées dans le suivi des problèmes de roslyn : dotnet / roslyn # 5445 .

En fonction du cas et du contexte, l'une de ces approches peut être considérée comme implicite (ou indirecte). Par exemple, dans ce cas, l'utilisation de pipe contre enumerable nécessite un jeton spécial $_(akaPowerShell's "THIS" token ) peut sembler désagréable à certains.

Pour ces types, voici une façon plus concise et directe de le faire avec le chaînage de points :

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

(<diatribe> Notez que l'analyseur d'arguments de commande PowerShell accepte les noms de paramètres partiels Ainsi , en plus. -recursive; -recursiv, -recursi, -recurs, -recur, -recu, -recet -resont acceptés, mais malheureusement pas -r.. qui est le seul choix correct qui fait sens avec un seul -caractère (si nous suivez les conventions POSIXy UNIXy)! </rant>)

corbeau vulcain
la source
1
Note à la diatribe: la -rforme courte de -Recursefonctionne bien pour moi.
Polymorphix
@Polymorphix, vous avez raison, cela fonctionne pour moi sous Windows 10 (je ne sais pas quelle version j'essayais plus tôt). Cependant, il en va de même pour le -Filecommutateur -fide l'exemple: -filet -filefonctionne, mais pas -f. Selon le style POSIX, cela devrait être --file(multi-lettres) et -f(une seule lettre, à moins que -f ne soit réservé à autre chose, disons forceswitch, alors cela peut être autre chose comme -lou aucune option à une seule lettre).
corbeau vulcan
1

J'utilise le script ci-dessous pour extraire tout le chemin du dossier:

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

Le chemin d'accès complet au dossier ne vient pas. Après 113 caractères, arrive:

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

J'ai utilisé cette commande de ligne pour rechercher les fichiers ".xlm" dans "C: \ Temp" et le chemin du nom complet de l'impression dans le fichier "result.txt":

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

Dans mes tests, cette syntaxe fonctionne très bien pour moi.

Josué Salomão
la source