2009-08-25 8 views
7

Po prostu chcę wyświetlić wszystkie katalogi w moim bieżącym katalogu roboczym, używając PowerShell. Jest to łatwe z powłoki bash:PowerShell analogowy do "dir/a: d" (Win) lub "ls -d * /" (Bash)

ls -d */ 

lub cmd.exe w Windows:

dir /a:d 

Korzystanie PowerShell jednak nie wydaje się być w stanie to zrobić za pomocą jednego polecenia. Zamiast tego, tylko już stwierdziliśmy, że działa to:

ls | ? {$_Mode -like "d*"} 

To wydaje się zbyt rozwlekły i zaangażowany, i podejrzewam, że nie jest potrzebna osobna Where tam. Pomoc dla Get-ChildItem nie wyjaśnia, jak filtrować w trybie. Czy ktoś może mnie oświecić?

+0

Jeśli uważasz, że ten problem jest irytujący, to zagłosuj na MS Connect: https://connect.microsoft.com/PowerShell/feedback/ ViewFeedback.aspx? FeedbackID = 308796 –

Odpowiedz

5

To działa zbyt:

ls | ?{$_.PsIsContainer} 

Nie ma wątpliwości, że jest to trochę bardziej rozwlekły niż bash lub cmd.exe. Z pewnością możesz umieścić funkcję i alias w swoim profilu, jeśli chcesz zmniejszyć szczegółowość. Zobaczę, czy uda mi się znaleźć sposób użycia filtru.

W toku dalszego dochodzenia nie sądzę, że istnieje bardziej zwięzły sposób na zrobienie tego bez tworzenia własnej funkcji i aliasu. Można umieścić to w swoim profilu:

function Get-ChildContainer 
{ 
    param(
      $root = "." 
     ) 
    Get-ChildItem -path $root | Where-Object{$_.PsIsContainer} 
} 

New-Alias -Name gcc -value Get-ChildContainer -force 

Następnie do ls katalogi w folderze:

gcc C:\ 

Takie rozwiązanie byłoby nieco ograniczone, ponieważ nie będzie obsługiwać dowolną fanciness jak -include, - Exclude, -Filter, -Recurse, itp., Ale możesz łatwo dodać to do funkcji.

Jest to raczej naiwne rozwiązanie, ale mam nadzieję, że poprowadzi cię we właściwym kierunku, jeśli zdecydujesz się go realizować. Szczerze mówiąc, nie zawracałbym sobie głowy. Dodatkowa szczegółowość w tym jednym przypadku jest większa niż całkowita ogólna ogólna elastyczność PowerShell w mojej osobistej opinii.

+3

Naprawdę? Alias ​​"gcc"? :) –

+2

Ehh ... Opuściłem mój kompilator w domu, więc nie ma konfliktu. – EBGreen

2

Spróbuj:

ls | ? {$_.PsIsContainer} 
+0

Sądzę, że byłem zbyt wolny dla EBGreen! – Kai

+0

Myślę, że prędkość to nie wszystko, co ważne. :) – EBGreen

+0

Można to uprościć w PowerShell 3, aby zapisać naciśnięcia klawiszy: ls | ? PsIsContainer – bart

2
dir -Exclude *.* 

Uważam to łatwiejsze do zapamiętania niż

dir | ? {$_.PsIsContainer} 

Plus, jest szybszy do wpisania, tak jak można zrobić -ex zamiast -exclude lub użyć tabulatora, aby go rozwinąć.

+0

Świetna sztuczka, dzięki! –

+1

To nie działa, gdy masz katalogi z kropkami, np. 'foo.bar' –

0

Przyszedłem do tego wątku, ponieważ staram się dowiedzieć, jak działa "FOR/D". Właściwie to, jak korzystać z opcji escape (%) za pomocą opcji/D.

Przeczytałem powyższe elementy z nadzieją, szczerze mówiąc, wszystkie one są dużo bardziej skomplikowane niż opcja polecenia FOR - Jeśli to zadziałało, oczywiście.


Korzystanie z dodatkowych form dla

Jeżeli rozszerzenia poleceń są włączone (czyli ustawienie domyślne), obsługiwane są następujące dodatkowe formy dla:

katalogów tylko

Jeśli zestaw zawiera symbole wieloznaczne (* i?), Określone polecenie wykonuje dla każdego katalogu (zamiast zbioru plików w określonym katalogu), który pasuje do zestawu. Składnia jest następująca:

dla/D {%% | %} zmienna w komendzie (zestaw) do [CommandLineOptions]