2012-10-29 30 views
83

Ho bisogno di ottenere tutti i file inclusi i file presenti nelle sottocartelle che appartengono a un particolare tipo.Ottieni il percorso completo dei file in PowerShell

sto facendo qualcosa di simile, utilizzando Get-ChildItem:

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

Tuttavia, è solo a me restituire i nomi di file e non l'intero percorso.

risposta

135

Aggiungi | select FullName alla fine della riga sopra. Se avete bisogno di fare effettivamente qualcosa con che poi, potrebbe essere necessario il tubo in un ciclo foreach, in questo modo:

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

Questo dovrebbe eseguire molto più veloce rispetto all'utilizzo ritardo di filtraggio:

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

Questo è vero. Un avvertimento: questo comando riceve effettivamente file come '* .txt *' ('-Filter' usa i caratteri jolly CMD). Se questo non è ciò che vuoi allora usa '-Include * .txt'. –

6

Ecco uno più corto:

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

Ecco uno più breve: '(gci -r c: \). Fullname' –

13

È inoltre possibile utilizzare Select-Object in questo modo:

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

Nota che' Select-Object' restituisce 'PSCustomObject', non una stringa. Potrebbe non funzionare se si utilizza il risultato come parametro per un altro programma – Chintsu

+4

Sì a ciò che @Chintsu ha detto. Per ottenere stringhe invece di 'PSCustomObject', utilizzare' -ExpandProperty FullName' invece di semplicemente 'FullName'. Per quanto ho capito, il parametro '-ExpandProperty' fa sì che il cmdlet restituisca i risultati come il tipo (nativo?) Della proprietà specificata anziché come un oggetto personalizzato. – doubleDown

1

Prova questo:

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

Per favore aggiungi un po 'di informazioni su cosa è diverso dal tuo tentativo e perché l'altro non ha funzionato. –

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

Potresti per favore elaborare più la tua risposta aggiungendo un po 'più di descrizione della soluzione che fornisci? – abarisone

1

[sintassi alternativa]

Per alcune persone, gli operatori dei tubi direzionali non sono loro gusto, ma piuttosto preferiscono concatenamento. Vedi alcune opinioni interessanti su questo argomento condivise in Roslyn Issue Tracker: dotnet/roslyn#5445.

In base al caso e al contesto, uno di questo approccio può essere considerato implicito (o indiretto). Ad esempio, in questo caso l'utilizzo di pipe contro enumerable richiede token speciali $_ (noto anche come PowerShell's "THIS" token) potrebbe sembrare sgradevole per alcuni.

Per tali ragazzi, ecco un modo più conciso, straight-forward di farlo con dot concatenamento:

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

(< sproloquio> Si noti che di PowerShell argomenti del comando parser accetta i nomi dei parametri parziali . Quindi, oltre a -recursive; -recursiv, -recursi, -recurs, -recur, -recu, -rec e -re sono accettati, ma purtroppo non -r .. che è l'unico choic corretta e questo ha senso con il singolo carattere - (se usiamo POSIXy convenzioni UNIXy)! </rant >)

+1

Nota per il rant: il '-r' forma breve di' -Recurse' funziona bene per me. – Polymorphix

+0

@Polymorphix, hai ragione, funziona per me su Windows 10 (non sono sicuro di quale versione stavo provando in precedenza). Tuttavia, lo stesso vale con '-File' switch' -fi' nell'esempio: '-fil' e' -file' funziona, ma non '-f'. Andando secondo lo stile POSIX, dovrebbe essere '--file' (multi-letters) e' -f' (single-letter, a meno che -f sia riservato per qualcos'altro, dica 'force' switch, quindi può essere qualcos'altro come '-l' o nessuna opzione a lettera singola). –

0

Questo ha funzionato per me, e produce un elenco di nomi:

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

ho trovato che utilizzando get-member -membertype properties, un comando incredibilmente utile. la maggior parte delle opzioni che ti vengono aggiunte con uno .<thing>, come fullname è qui.Puoi attaccare lo stesso comando;

| get-member -membertype properties 

alla fine di qualsiasi comando per avere maggiori informazioni sulle cose che si possono fare con loro e come accedere coloro:

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

che è quello che ho usato. Sento che è più comprensibile in quanto non contiene alcuna sintassi del ciclo.

5

Se i percorsi relativi sono ciò che si desidera, è sufficiente utilizzare il flag -Name.

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

Problemi correlati