Hai solo bisogno di scegliere la proprietà che vuoi dagli oggetti. FullName
in questo caso.
$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!($_.psiscontainer)} | foreach {$_.FullName}
Edit: "? Cosa fa il foreach fare ciò che è che l'enumerazione finita" Spiegazione per Mark, che chiede,
La spiegazione di Sung Meister è molto buona, ma aggiungerò una spiegazione qui perché potrebbe essere utile.
Il concetto chiave è la pipeline. Immaginate una serie di palle da ping-pong che rotolano lungo uno stretto tubo uno dopo l'altro. Questi sono gli oggetti nella pipeline. Ogni fase della pipeline - i segmenti di codice separati dai caratteri di pipe (|) - ha una pipa che entra e la pipa ne esce. L'uscita di uno stadio è collegata all'ingresso dello stadio successivo. Ogni fase prende gli oggetti mentre arrivano, fa loro delle cose e li rimanda nella pipeline di uscita o invia nuovi oggetti sostitutivi.
Get-ChildItem $directory -Recurse
Get-ChildItem passeggiate attraverso il filesystem creare oggetti FileSystemInfo che rappresentano ogni file e directory che incontra, e li mette nella pipeline.
Select-Object FullName
Select-Object prende ogni oggetto FileSystemInfo come arriva, afferra la proprietà FullName da esso (che è un percorso in questo caso), mette che la proprietà in un nuovo oggetto personalizzato che ha creato, e mette che oggetto personalizzato fuori nella conduttura.
Where-Object {!($_.psiscontainer)}
Questo è un filtro. Prende ogni oggetto, lo esamina e lo rimanda o lo scarta a seconda di alcune condizioni. A proposito, il tuo codice ha un bug. Gli oggetti personalizzati che arrivano qui non hanno una proprietà di psiscontainer. Questo stadio in realtà non fa nulla. Il codice di Sung Meister è migliore.
foreach {$_.FullName}
Foreach, il cui nome lungo è ForEach-Object, afferra ciascun oggetto come arriva, e qui, afferra la proprietà FullName, una stringa, da esso. Ora, ecco la parte sottile: qualsiasi valore che non viene consumato, cioè non viene catturato da una variabile o soppresso in qualche modo, viene inserito nella pipeline di output. Come esperimento, provare a sostituire quella fase con questo:
foreach {'hello'; $_.FullName; 1; 2; 3}
realtà provare e esaminare l'output. Ci sono quattro valori in quel blocco di codice. Nessuno di loro è consumato. Si noti che appaiono tutti nell'output. Ora provate questo:
foreach {'hello'; $_.FullName; $ x = 1; 2; 3}
noti che uno dei valori viene catturato da una variabile. Non appare nella pipeline di uscita.
Cosa fa il foreach? Di che cosa parla? –
Una soluzione migliore è usare select-object -expand FullName –
FYI, è possibile assegnare una variabile _and_ emit all'output usando 'tee-object'. Esempio: 'ls | select -primo nome -proprietà completo | % {$ _. FullName} | tee -variable firstpath' –