Solo necesita elegir la propiedad que desea de los objetos. FullName
en este caso.
$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!($_.psiscontainer)} | foreach {$_.FullName}
Editar: "¿? ¿Qué hace el foreach Lo que es que la enumeración sobre" Explicación para Mark, que pide,
La explicación de Sung Meister es muy buena, pero agregaré un tutorial aquí porque podría ser útil.
El concepto clave es la tubería. Imagina una serie de bolas de ping-pong rodando por un tubo estrecho una después de la otra. Estos son los objetos en la tubería. Cada etapa de la tubería - los segmentos de código separados por caracteres de tubería (|) - tiene una tubería que entra y sale de la tubería. La salida de una etapa está conectada a la entrada de la siguiente etapa. Cada etapa toma los objetos a medida que llegan, les hace cosas y los envía de regreso a la tubería de salida o envía nuevos objetos de reemplazo.
Get-ChildItem $directory -Recurse
Get-ChildItem paseos por el sistema de archivos de la creación de objetos FileSystemInfo que representan a cada archivo y directorio que encuentra y los pone en la tubería.
Select-Object FullName
Select-Object toma cada objeto FileSystemInfo a medida que llega, agarra la propiedad FullName de ella (que es un camino en este caso), pone esa propiedad en un nuevo objeto personalizado de marca que ha creado, y pone esa objeto personalizado en la tubería.
Where-Object {!($_.psiscontainer)}
Esto es un filtro. Toma cada objeto, lo examina y lo envía de vuelta o lo descarta dependiendo de alguna condición. Su código aquí tiene un error, por cierto. Los objetos personalizados que llegan aquí no tienen una propiedad psiscontainer. Esta etapa en realidad no hace nada. El código de Sung Meister es mejor.
foreach {$_.FullName}
Foreach, cuyo nombre largo es ForEach-Object, agarra cada objeto a medida que llega, y aquí, agarra la propiedad FullName, una cadena, de ella. Ahora, aquí está la parte sutil: cualquier valor que no se consuma, es decir, no sea capturado por una variable o suprimido de alguna manera, se ponga en la línea de salida. Como un experimento, intente reemplazar esa etapa con esto:
foreach {'hello'; $_.FullName; 1; 2; 3}
En realidad probarlo y examine la salida. Hay cuatro valores en ese bloque de código. Ninguno de ellos se consume. Tenga en cuenta que todos aparecen en la salida. Ahora intente esto:
foreach {'hello'; $_.FullName; $ x = 1; 2; 3}
Observe que uno de los valores está siendo capturado por una variable. No aparece en la canalización de salida.
¿Qué hace el foreach? ¿Qué es eso que enumera? –
Una mejor solución es usar select-object -expand FullName –
FYI, puede asignar a una variable _and_ emitir a la salida utilizando 'tee-object'. Ejemplo: 'ls | seleccione -primero 1-nombre completo de propiedad | % {$ _. FullName} | tee -variable firstpath' –