2009-09-25 12 views
17

Tengo una carpeta con tres archivos y quiero el equivalente de dir /s /b en PowerShell. ¿Cómo puedo hacer eso?¿Cómo hago 'dir/s/b' en PowerShell?

Por ejemplo, si el nombre de la carpeta es temp3 y contiene tres archivos de texto - a.txt. b.txt y c.txt, haciendo

C:\temp3> dir /s /b 

me da

C:\temp3\a.txt 
C:\temp3\b.txt 
C:\temp3\c.txt 

¿Cómo consigo el resultado misma en PowerShell?

Respuesta

20

Puede utilizar

Get-ChildItem -Recurse | Select-Object -ExpandProperty FullName 
gci -r | select -exp FullName 

o

Get-ChildItem -Recurse | ForEach-Object { $_.FullName } 
gci -r | % { $_.FullName } 
gci -r | % FullName # In recent PowerShell versions 

(La versión larga es la primera y la acortada el uso de alias y nombres de parámetros corta es la segunda, si no es obvia. En secuencias de comandos Sugiero utilizar siempre la versión larga, ya que es mucho menos probable que choque en algún lugar.)

Volver a leer su pregunta, si todo lo que desea lograr con dir /s /b es para mostrar las rutas completas de los archivos en el directorio actual, luego puede soltar el parámetro -Recurse aquí.

Mi consejo para usted, sin embargo: no use cuerdas cuando pueda evitarlo. Si desea pasar archivos, simplemente tome el objeto FileInfo que obtiene de Get-ChildItem. Los cmdlets saben qué hacer con eso. Usar cadenas para cosas donde los objetos funcionan mejor solo te lleva a problemas extraños.

+0

impresionante! Gracias amigo –

+0

También puede hacer: gci -r | seleccione -expand nombre completo – x0n

+0

@Johannes: funciona. ¿Estás usando v2 final? Ver http://blogs.msdn.com/powershell/archive/2009/09/14/select-expandproperty-propertyname.aspx –

4

Agregando a la respuesta de Joey. A partir de PowerShell 3.0, puede usar la nueva taquigrafía Foreach-Object para obtener la propiedad FullName.

Get-ChildItem -Recurse | Foreach-Object FullName 
gci -r |% FullName 

La diferencia es que no es necesario utilizar llaves ({}) o la variable $_ si todo lo que necesita es una propiedad.

+0

¡Por fin! ¡La única manera verdadera de evitar líneas en blanco falsas! –

3

acaba de hacer cumplir, lo que dijo Joey:

gci -r -filter *.log | % fullname 

trabaja para encontrar archivos como dir /s/b *.log hace.

14

Si está usando Powershell como una concha (y no como un procesador de secuencia de comandos), simplemente puede escribir:

cmd /r dir /s /b 

La bandera /r dice cmd.exe para ejecutar el comando y la salida. En otras palabras, terminará en el mismo contexto de ejecución.

Para muchos comandos, cmd /r es mejor que tratar con la arquitectura orientada a objetos de Powershell.

+2

Me parece una gran ironía que la forma más rápida de escribir el comando en powershell sea simplemente recuperar el antiguo 'cmd.exe'. PowerShell es un lío hinchado y descomunal. DOS, por todas sus fallas, es eficiente. – abelenky

+1

@abelenky 'gci -r | % FullName' parece bastante corto y es posiblemente más fácil de recordar que las banderas 'dir' –

+0

@abelenky +1, propiedad adicional causada por la hinchazón: es lenta. –

0

Si lo que desea es reemplazar permanentemente alias dir de Powershell (Get-ChildItem) con una llamada a cmd dir, para todos los futuros de Windows PowerShell que vas a abrir simplemente hacer lo siguiente:

  1. libreta $ perfil (desde la ventana de PowerShell)
  2. cuando el archivo se abre, introduzca los siguientes filas y guardar:

    Remove-Item alias:\dir 
    function dir($1, $2, $3, $4) {cmd /r dir $1 $2 $3 $4}