2009-09-25 15 views
17

Mam folder z trzema plikami i chcę odpowiednik dir /s /b w PowerShell. Jak mogę to zrobić? Na przykład, jeśli nazwa folderu to temp3 i zawiera trzy pliki tekstowe - a.txt. b.txt i c.txt, robiJak zrobić "dir/s/b" w PowerShell?

C:\temp3> dir /s /b 

daje mi

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

Jak uzyskać wynik w PowerShell samo?

Odpowiedz

20

Można użyć

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

lub

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

(Długa wersja jest pierwszym i jeden skrócony przy użyciu aliasów i krótkich nazw parametrów jest drugim, jeśli nie jest to oczywiste. W Skrypty Proponuję używać zawsze wersji długiej, ponieważ jest to mniej prawdopodobne, aby się gdzieś zderzyć.)

Ponowne czytanie pytania, jeśli wszystko, co chcesz osiągnąć dzięki dir /s /b oznacza wyprowadzenie pełnych ścieżek plików w bieżącym katalogu, a następnie można usunąć parametr -Recurse tutaj.

Moja rada dla Ciebie: nie używaj strun, kiedy możesz pomóc. Jeśli chcesz przekazać pliki, po prostu weź obiekt FileInfo, który otrzymasz od Get-ChildItem. Polecenia cmdlet wiedzą, co z nim zrobić. Używanie łańcuchów do rzeczy, w których obiekty działają lepiej, wpada w dziwne problemy.

+0

Awesome! Dzięki stary. –

+0

Możesz także zrobić: gci -r | select -expand fullname – x0n

+0

@Johannes: to działa. Używasz finału v2? Zobacz http://blogs.msdn.com/powershell/archive/2009/09/14/select-expandproperty-propertyname.aspx –

4

Dodanie odpowiedzi Joey'a. Począwszy od wersji PowerShell 3.0, można użyć nowego stenogramu Foreach-Object, aby uzyskać właściwość FullName.

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

Różnica polega na tym, że nie trzeba używać nawiasów klamrowych ({}) lub zmienną $_ jeśli wszystko czego potrzebujesz to własność.

+0

Nareszcie! Jedyny prawdziwy sposób na uniknięcie fałszywych pustych linii! –

3

tylko do egzekwowania, co Joey powiedział:

gci -r -filter *.log | % fullname 

działa znaleźć pliki jak dir /s/b *.log robi.

14

Jeśli używasz PowerShell jako powłoka (a nie jako procesor skryptu), można po prostu wpisać:

cmd /r dir /s /b 

/r flaga mówi cmd.exe uruchomić komendę i wyjść. Innymi słowy, skończysz w tym samym kontekście wykonania.

Dla wielu poleceń, cmd /r jest lepsza niż obsługa architektury obiektowej Powershell.

+2

Bardzo mi przykro, że najkrótszym sposobem na napisanie polecenia w programie Power Shell jest powrót do starego polecenia 'cmd.exe'. PowerShell to rozdęty, ciężki bałagan. DOS, dla wszystkich jego wad, jest wydajny. – abelenky

+1

@elelenky 'gci -r | % FullName' wydaje się dość krótki i jest prawdopodobnie łatwiejszy do zapamiętania niż 'dir' flags –

+0

@abelenky +1, dodatkowa właściwość spowodowana przez wzdęcia - jest powolna. –

0

Jeśli tylko chcesz na stałe zastąpić PowerShell za dir alias (Get-ChildItem) z wezwaniem do cmd dir, dla wszystkich przyszłych Windows PowerShell masz zamiar otworzyć po prostu wykonaj następujące czynności:

  1. notepad $ profil (z okna PowerShell)
  2. gdy otwiera plik, wstaw następujące wiersze i zapisać:

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