Ottieni il percorso completo dei file in PowerShell


146

Ho bisogno di ottenere tutti i file inclusi i file presenti nelle sottocartelle che appartengono a un tipo particolare.

Sto facendo qualcosa del genere, usando Get-ChildItem :

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

Tuttavia, mi sta solo restituendo i nomi dei file e non l'intero percorso.

Risposte:


220

Aggiungi | select FullNamealla fine della riga sopra. Se in seguito dovessi effettivamente fare qualcosa, potresti doverlo convogliare in un ciclo foreach, in questo modo:

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

101

Questo dovrebbe funzionare molto più velocemente rispetto all'utilizzo del filtro in ritardo:

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

14
Questo è vero. Un avvertimento: questo comando in realtà ottiene file come *.txt*( -Filterusa caratteri jolly CMD). Se questo non è quello che vuoi, allora usa -Include *.txt.
Roman Kuzmin,

26

Puoi anche usare Select-Object in questo modo:

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

5
Si noti che Select-Objectrestituisce PSCustomObject, non una stringa. Potrebbe non funzionare se si utilizza il risultato come parametro per un altro programma
Chintsu,

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

Avevo anche bisogno di tempo (avevo incasinato la fonte di un programma e in seguito avrei pensato che avrei dovuto iniziare il controllo del codice sorgente su di esso, ma posso avere un'idea del mio primo commit contro "master" ottenendo i file dall'installazione:Get-ChildItem -Path 'C:\Program Files\TheProgram' -Recurse | Where-Object -FilterScript {($_.LastWriteTime -gt '2020-03-01')} | Select-Object FullName
Neil Guy Lindberg

19

Eccone uno più breve:

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

23
Eccone uno più corto:(gci -r c:\).fullname
Chris N,

11
Eccone uno più corto:(ls -r c:\).fullname
Kalamane,

15
Eccone uno più breve:(ls -r c:).fullname
Valiante

9

Se i percorsi relativi sono ciò che desideri, puoi semplicemente usare la -Namebandiera.

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


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

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


5

Cosa davvero fastidiosa in PS 5, dove $ _ non sarà il percorso completo all'interno di foreach. Queste sono le versioni stringa degli oggetti FileInfo e DirectoryInfo. Per qualche motivo, un jolly nel percorso lo risolve o usa Powershell 6 o 7. Puoi anche eseguire il pipe per ottenere-item nel mezzo.

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

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

Questo sembra essere stato un problema con .Net che è stato risolto in .Net Core (Powershell 7): il comportamento nella stringa delle istanze FileInfo / Directory è cambiato dalla v6.0.2 # 7132


4

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

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

L'ho trovato usando get-member -membertype propertiesun comando incredibilmente utile. la maggior parte delle opzioni che ti vengono aggiunte vengono aggiunte .<thing>come, come in fullnamequesto caso. Puoi applicare lo stesso comando;

  | get-member -membertype properties 

alla fine di qualsiasi comando per ottenere maggiori informazioni sulle cose che puoi fare con loro e su come accedervi:

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

3

Prova questo:

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

2
Aggiungi un po 'di informazioni su ciò che è diverso con il tuo tentativo e perché l'altro non ha funzionato.
Uwe Allner,

2

Perché nessuno ha ancora usato il ciclo foreach? Un professionista qui è che puoi facilmente nominare la tua variabile:

# 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
}

come posso ottenere il singolo percorso file di un file di testo senza usare foreach file di file in fileList? qualcosa come textfile = $ fileList [$ i] .fullname, so che non è l'approccio più ottimale ma devo farlo in questo modo :(
Heber Solis

Basta aggiungere un $di fronte textfile: $textfile = $fileList[$i].FullName. Supponendo che $iabbia un valore numerico, cioè.
NostraDavid,

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

6
Potresti per favore elaborare di più la tua risposta aggiungendo un po 'più di descrizione della soluzione che offri?
Abarisone,

1

[sintassi alternativa]

Per alcune persone, gli operatori di tubi direzionali non sono il loro gusto, ma preferiscono piuttosto concatenare. Vedi alcune opinioni interessanti su questo argomento condivise nel tracker dei numeri di roslyn: dotnet / roslyn # 5445 .

In base al caso e al contesto, uno di questi approcci può essere considerato implicito (o indiretto). Ad esempio, in questo caso l'utilizzo di pipe con enumerable richiede un token speciale $_(akaPowerShell's "THIS" token ) potrebbe apparire sgradevole ad alcuni.

Per questi ragazzi, ecco un modo più conciso e diretto di farlo con il concatenamento dei punti :

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

(<rant> Si noti che di PowerShell argomenti del comando parser accetta i nomi dei parametri parziali Quindi, oltre a. -recursive, -recursiv, -recursi, -recurs, -recur, -recu, -rece -resono accettati, ma purtroppo non -r.. che è l'unica scelta giusta che abbia senso con un singolo -carattere (se vai alle convenzioni POSIXy UNIXy)! </rant>)


1
Nota per il rant: la -rforma abbreviata di -Recurseopere va bene per me.
Polymorphix,

@Polymorphix, hai ragione, funziona per me su Windows 10 (non sono sicuro di quale versione stavo provando in precedenza). Tuttavia, lo stesso vale con -Fileswitch -finell'esempio: -file -filefunziona, ma non -f. Seguendo lo stile POSIX, dovrebbe essere --file(multi-lettere) e -f(single-letter, a meno che -f non sia riservato per qualcos'altro, diciamo forceswitch, quindi può essere qualcos'altro come -lo nessuna opzione a lettera singola).
corvo vulcanico

1

Sto usando lo script di seguito per estrapolare tutto il percorso della cartella:

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

Il percorso completo della cartella non sta arrivando. Dopo 113 caratteri, sta arrivando:

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

0

Ho usato questo comando di linea per cercare i file ".xlm" in "C: \ Temp" e il risultato stampa il percorso completo nel file "result.txt":

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

Nei miei test, questa sintassi funziona benissimo per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.