2009-09-25 7 views
17

Ho una cartella con tre file e voglio l'equivalente di dir /s /b in PowerShell. Come lo faccio?Come faccio a 'dir/s/b' in PowerShell?

Ad esempio, se il nome della cartella è temp3 e contiene tre file di testo - a.txt. b.txt, e c.txt, facendo

C:\temp3> dir /s /b 

mi dà

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

Come faccio ad avere il risultato stesso in PowerShell?

risposta

20

È possibile utilizzare

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 versione lunga è il primo e quello ridotto utilizzando pseudonimi e nomi di parametro brevi è la seconda, se non è evidente. In script suggerirei di utilizzare sempre la versione lunga, poiché è molto meno probabile che si scontrino da qualche parte.)

Rileggere la domanda, se tutto ciò che si desidera eseguire con dir /s /b indica i percorsi completi dei file nella directory corrente, quindi è possibile rilasciare il parametro -Recurse qui.

Il mio consiglio a voi, però: non usare stringhe quando potete aiutarlo. Se vuoi passare i file, prendi semplicemente l'oggetto FileInfo che ricevi da Get-ChildItem. I cmdlet sanno cosa fare con esso. Usare le stringhe per cose in cui gli oggetti funzionano meglio ti mette in strani problemi.

+0

Impressionante! Grazie amico. –

+0

Puoi anche fare: gci -r | select -expand fullname – x0n

+0

@Johannes: funziona. Stai usando v2 finale? Vedi http://blogs.msdn.com/powershell/archive/2009/09/14/select-expandproperty-propertyname.aspx –

4

In aggiunta alla risposta di Joey. A partire da PowerShell 3.0, è possibile utilizzare la nuova stenografia Foreach-Object per ottenere la proprietà FullName.

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

La differenza è che non c'è bisogno di usare le parentesi graffe ({}) o la variabile $_ se tutto ciò che serve è una proprietà.

+0

Finalmente! L'unico vero modo per evitare le righe vuote spurie! –

3

solo per far rispettare, quello che ha detto Joey:

gci -r -filter *.log | % fullname 

lavora per trovare i file come dir /s/b *.log fa.

14

Se si utilizza PowerShell come una shell (e non come un processore di script), è possibile digitare semplicemente:

cmd /r dir /s /b 

La bandiera /r dice cmd.exe per eseguire il comando e uscire. In altre parole, terminerai nello stesso contesto di esecuzione.

Per molti comandi, cmd /r è meglio che gestire l'architettura orientata agli oggetti di Powershell.

+2

Trovo molto ironico che il modo più breve per scrivere il comando in PowerShell sia quello di eseguire il shell-back al vecchio 'cmd.exe'. PowerShell è un pasticcio gonfio e pesante. DOS, per tutti i suoi difetti, è efficiente. – abelenky

+1

@abelenky 'gci -r | % FullName' sembra piuttosto breve ed è probabilmente più facile da ricordare rispetto alle flag 'dir' –

+0

@abelenky +1, proprietà aggiuntiva causata dal gonfiore - è lento. –

0

Se si desidera solo per sostituire permanentemente dir alias di PowerShell (Get-ChildItem) con una chiamata a cmd dir, per tutti di Windows PowerShell future si sta andando ad aprire solo effettuare le seguenti operazioni:

  1. notepad $ profilo (dalla finestra di PowerShell)
  2. quando il file si apre, inserire le seguenti righe e salvare:

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