Obtenga la ruta completa de los archivos en PowerShell

146

Necesito obtener todos los archivos, incluidos los archivos presentes en las subcarpetas que pertenecen a un tipo en particular.

Estoy haciendo algo como esto, usando Get-ChildItem :

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

Sin embargo, solo me devuelve los nombres de los archivos y no la ruta completa.

Gagan
fuente

Respuestas:

220

Agregue | select FullNameal final de su línea arriba. Si necesita hacer algo con eso luego, es posible que deba canalizarlo en un bucle foreach, así:

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

Esto debería funcionar mucho más rápido que usar un filtrado tardío:

Get-ChildItem C:\WINDOWS\System32 -Filter *.txt -Recurse | % { $_.FullName }
Shay Levy
fuente
14
Esto es verdad. Una advertencia: este comando realmente obtiene archivos como *.txt*( -Filterusa comodines CMD). Si esto no es lo que quieres, entonces úsalo -Include *.txt.
Roman Kuzmin
26

También puede usar Select-Object de la siguiente manera:

Get-ChildItem "C:\WINDOWS\System32" *.txt -Recurse | Select-Object FullName
imlokesh
fuente
55
Tenga en cuenta que Select-Objectdevuelve PSCustomObject, no una cadena. Es posible que no funcione si utiliza el resultado como parámetro para otro programa
Chintsu
55
Sí a lo que dijo @Chintsu. Para obtener cadenas en lugar de PSCustomObject, use en -ExpandProperty FullNamelugar de simplemente FullName. Según tengo entendido, el -ExpandPropertyparámetro hace que el cmdlet devuelva los resultados como el tipo de propiedad especificada (¿nativo?) En lugar de como un objeto personalizado.
doubleDown
También necesitaba tiempo (me metí con la fuente de un programa y pensé más tarde que probablemente debería haber comenzado el control de la fuente en él, pero puedo tener una idea de mi primer commit contra "master" al obtener archivos desde la instalación:Get-ChildItem -Path 'C:\Program Files\TheProgram' -Recurse | Where-Object -FilterScript {($_.LastWriteTime -gt '2020-03-01')} | Select-Object FullName
Neil Guy Lindberg
19

Aquí hay uno más corto:

(Get-ChildItem C:\MYDIRECTORY -Recurse).fullname > filename.txt
JustAGuy
fuente
23
Aquí hay uno más corto:(gci -r c:\).fullname
Chris N
11
Aquí hay uno más corto:(ls -r c:\).fullname
Kalamane
15
Aquí hay uno más corto:(ls -r c:).fullname
Valiante
9

Si las rutas relativas son lo que desea, puede usar la -Namebandera.

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

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

Eso es lo que usé. Siento que es más comprensible ya que no contiene ninguna sintaxis de bucle.

Mandrágora
fuente
5

Lo realmente molesto en PS 5, donde $ _ no será el camino completo dentro de foreach. Estas son las versiones en cadena de los objetos FileInfo y DirectoryInfo. Por alguna razón, un comodín en la ruta lo arregla, o use Powershell 6 o 7. También puede canalizar a get-item en el medio.

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

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

Esto parece haber sido un problema con .Net que se resolvió en .Net Core (Powershell 7): el comportamiento de Stringification de las instancias de FileInfo / Directory ha cambiado desde v6.0.2 # 7132

js2010
fuente
4

Esto funcionó para mí y produce una lista de nombres:

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

Lo encontré usando get-member -membertype propertiesun comando increíblemente útil. La mayoría de las opciones que le ofrece se agregan con un .<thing>, como fullnameestá aquí. Puedes pegar el mismo comando;

  | get-member -membertype properties 

al final de cualquier comando para obtener más información sobre las cosas que puede hacer con ellos y cómo acceder a ellos:

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

Prueba esto:

Get-ChildItem C:\windows\System32 -Include *.txt -Recurse | select -ExpandProperty FullName
Mykhailo Basiuk
fuente
2
Agregue un poco de información sobre qué es diferente con su intento y por qué el otro no funcionó.
Uwe Allner
2

¿Por qué nadie ha usado el bucle foreach todavía? Un profesional aquí es que puede nombrar fácilmente su 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
fuente
¿Cómo puedo obtener la ruta de archivo individual de un archivo de texto sin usar foreach textfile en fileList? algo así como archivo de texto = $ fileList [$ i] .fullname, sé que no es el enfoque más óptimo, pero necesito hacerlo de esta manera :(
Heber Solis
Sólo tiene que añadir una $frente a textfile: $textfile = $fileList[$i].FullName. Suponiendo que $itiene un valor numérico, es decir.
NostraDavid
1
gci "C:\WINDOWS\System32" -r -include .txt | select fullname
Vuong Doan
fuente
66
¿Podría por favor elaborar más su respuesta agregando un poco más de descripción sobre la solución que proporciona?
abarisone
1

[sintaxis alternativa]

Para algunas personas, los operadores de tuberías direccionales no son de su agrado, sino que prefieren encadenarse. Vea algunas opiniones interesantes sobre este tema compartidas en el rastreador de problemas de roslyn: dotnet / roslyn # 5445 .

Según el caso y el contexto, uno de estos enfoques puede considerarse implícito (o indirecto). Por ejemplo, en este caso, usar pipe contra enumerable requiere un token especial $_(también conocido comoPowerShell's "THIS" token ) que puede parecer desagradable para algunos.

Para tales muchachos, aquí hay una manera más concisa y directa de hacerlo con el encadenamiento de puntos :

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

(<diatriba> Nota que los argumentos de comando analizador de PowerShell acepta los nombres de los parámetros parciales Así, además de. -recursive; -recursiv, -recursi, -recurs, -recur, -recu, -recy -reson aceptados, pero lamentablemente no -r.. que es la única opción correcta que tiene sentido con un solo -carácter (si ir por convenciones POSIXy UNIXy)! </rant>)

cuervo vulcano
fuente
1
Nota para el despotricar: la -rforma corta de -Recursefunciona bien para mí.
Polymorphix el
@Polymorphix, tienes razón, me está funcionando en Windows 10 (no estoy seguro de qué versión estaba intentando antes). Sin embargo, lo mismo ocurre con el -Fileinterruptor -fien la muestra: -fily -filefunciona, pero no -f. Siguiendo el estilo POSIX, debe ser --file(varias letras) y -f(una letra, a menos que -f esté reservado para otra cosa, digamos forceswitch, entonces puede ser algo diferente -lo ninguna opción de letra única).
cuervo vulcano
1

Estoy usando el siguiente script para extraer toda la ruta de la carpeta:

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

La ruta completa de la carpeta no viene. Después de 113 caracteres, viene:

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

Utilicé este comando de línea para buscar archivos ".xlm" en "C: \ Temp" y el resultado imprime la ruta del nombre completo en el archivo "result.txt":

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

En mis pruebas, esta sintaxis funciona muy bien para mí.

Josué Salomão
fuente