2009-08-25 9 views
7

Je veux simplement lister tous les répertoires de mon répertoire de travail actuel, en utilisant PowerShell. Ceci est facile à partir d'un shell Bash:PowerShell analogique à "dir/a: d" (Win) ou "ls -d * /" (Bash)

ls -d */ 

ou cmd.exe dans Windows:

dir /a:d 

En utilisant PowerShell semble cependant je ne peux pas être en mesure de le faire avec une seule commande. Au lieu de cela le seul le AVONS I trouvé qui fonctionne est:

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

Cela semble trop verbeux et impliqué, et je pense que je ne suis pas nécessaire d'exécuter la clause Where là. L'aide de Get-ChildItem ne précise pas comment filtrer sur Mode. Quelqu'un peut-il m'éclairer?

+0

Si vous trouvez que ce problème est gênant, votez s'il vous plaît sur MS Connect: https://connect.microsoft.com/PowerShell/feedback/ ViewFeedback.aspx? FeedbackID = 308796 –

Répondre

5

Cela fonctionne aussi:

ls | ?{$_.PsIsContainer} 

Il ne fait aucun doute qu'il est un peu plus verbeux que bash ou cmd.exe. Vous pouvez certainement mettre une fonction et un alias dans votre profil si vous voulez réduire la verbosité. Je vais voir si je peux trouver un moyen d'utiliser -filter aussi.

Après un examen plus approfondi, je ne crois pas qu'il existe une façon plus concise de faire cela à court de créer votre propre fonction et alias. Vous pouvez mettre dans votre profil:

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

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

ensuite ls les répertoires dans un dossier:

gcc C:\ 

Cette solution serait un peu limité car il ne traiterait pas une fanciness comme -Include, - Exclure, -Filtre, -Recurse, etc. mais vous pouvez facilement ajouter cela à la fonction.

En fait, c'est une solution plutôt naïve, mais j'espère que cela vous mènera dans la bonne direction si vous décidez de la poursuivre. Pour être honnête avec toi bien que je ne voudrais pas déranger. La verbosité supplémentaire dans ce cas est plus que surmontée par la plus grande flexibilité globale de PowerShell en général dans mon opinion personnelle.

+3

Vraiment? Alias ​​"gcc"? :) –

+2

Ehh ... J'ai laissé mon compilateur à la maison, donc pas de conflit. – EBGreen

2

Essayez:

ls | ? {$_.PsIsContainer} 
+0

Je suppose que j'étais trop lent pour EBGreen! – Kai

+0

Je suppose que la vitesse n'est pas tout ce qui compte. :) – EBGreen

+0

Cela peut être simplifié dans PowerShell 3 pour enregistrer des séquences de touches: ls | ? PsIsContainer – bart

2
dir -Exclude *.* 

Je trouve cela plus facile de se rappeler que

dir | ? {$_.PsIsContainer} 

De plus, il est plus rapide pour taper, comme vous pouvez le faire -ex au lieu de -exclure ou utiliser une tabulation pour l'agrandir.

+0

Grand tour, merci! –

+1

Cela ne fonctionne pas lorsque vous avez des répertoires qui ont un point, par exemple. 'foo.bar' –

0

Je suis arrivé à ce fil parce que j'essaie de comprendre comment "FOR/D" fonctionne. Eh bien, comment utiliser la commande batch escape (%) avec l'option/D.

J'ai lu les articles ci-dessus avec espoir, pour être honnête, ils sont tous beaucoup plus complexe que l'option de commande FOR - Si cela a fonctionné bien sûr.


En utilisant d'autres formes de pour

Si les extensions de commandes sont activées (c'est la valeur par défaut), les formes suivantes supplémentaires pour sont pris en charge:

Annuaires seulement

Si l'ensemble contient des caractères génériques (* et?), La commande spécifiée s'exécute pour chaque répertoire (au lieu d'un ensemble de fichiers dans un répertoire spécifié) qui correspond à set. La syntaxe est la suivante:

pour/D {%% | %} variable dans la commande (set) do [CommandLineOptions]

Questions connexes