2010-07-17 5 views
10

En utilisant PowerShell je peux obtenir les répertoires avec la commande suivante:Comment écrire une fonction PowerShell pour obtenir des répertoires?

Get-ChildItem -Path $path -Include "obj" -Recurse | ` 
    Where-Object { $_.PSIsContainer } 

Je préfère écrire une fonction si la commande est plus lisible. Par exemple:

Get-Directories -Path "Projects" -Include "obj" -Recurse 

Et la fonction suivante fait exactement que, sauf pour la manipulation -Recurse élégante:

Function Get-Directories([string] $path, [string] $include, [boolean] $recurse) 
{ 
    if ($recurse) 
    { 
     Get-ChildItem -Path $path -Include $include -Recurse | ` 
      Where-Object { $_.PSIsContainer } 
    } 
    else 
    { 
     Get-ChildItem -Path $path -Include $include | ` 
      Where-Object { $_.PSIsContainer } 
    } 
} 

Comment puis-je supprimer la déclaration if de ma fonction Get-répertoires ou est-ce une meilleure façon de fais le?

+1

Tenir compte utiliser -Filter au lieu de -Inclure sauf si vous devez inclure plusieurs éléments. Pour quelque chose comme * .txt, -Filter peut être nettement plus rapide. Ou vous pouvez toujours ajouter les deux. –

Répondre

13

Essayez ceci:

# nouns should be singular unless results are guaranteed to be plural. 
# arguments have been changed to match cmdlet parameter types 
Function Get-Directory([string[]]$path, [string[]]$include, [switch]$recurse) 
{ 
    Get-ChildItem -Path $path -Include $include -Recurse:$recurse | ` 
     Where-Object { $_.PSIsContainer } 
} 

Cela fonctionne parce que -Recurse: $ false est le même n'a pas du tout avoir -Recurse.

+1

Nous vous remercions de la réponse apportée et de la précision apportée par la fixation du nom de la fonction et des déclarations de paramètres. J'ai appris plus que ce que j'ai demandé. –

2

La réponse Oisin donne est sur place. Je voulais juste ajouter que cela se rapproche de vouloir être une fonction proxy. Si vous avez installé le PowerShell Community Extensions 2.0, vous avez déjà cette fonction de proxy. Vous devez l'activer (il est désactivé par défaut). Il suffit d'éditer le fichier Pscx.UserPreferences.ps1 et changer cette ligne de sorte qu'il est défini sur $ true, comme indiqué ci-dessous:

GetChildItem = $true # Adds ContainerOnly and LeafOnly parameters 
        # but doesn't handle dynamic params yet. 

Notez la limitation en ce qui concerne les paramètres dynamiques. Maintenant, lorsque vous importez PSCX le faire comme ceci:

Import-Module Pscx -Arg [path to Pscx.UserPreferences.ps1] 

Maintenant, vous pouvez faire ceci:

Get-ChildItem . -r Bin -ContainerOnly 
+0

Merci pour le rappel de PowerShell Community Extensions. J'aurais pu l'utiliser comme référence. Comme cela fait partie d'un processus de construction, je m'en tiendrai à ce que j'ai parce que je ne veux pas ajouter une autre dépendance. –

4

Dans PowerShell 3.0, il est cuit avec -File-Directory commutateurs:

dir -Directory #List only directories 
dir -File #List only files 
+0

Get-ChildItem -Répertoire – chris31389

Questions connexes