Как написать функцию PowerShell для получения каталогов? - PullRequest
10 голосов
/ 17 июля 2010

Используя PowerShell, я могу получить каталоги с помощью следующей команды:

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

Я бы предпочел написать функцию, чтобы команда была более читабельной. Например:

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

И следующая функция делает именно это, за исключением элегантной обработки -Recurse:

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 }
    }
}

Как удалить оператор if из функции Get-Directories или это лучший способ сделать это?

Ответы [ 3 ]

13 голосов
/ 17 июля 2010

Попробуйте это:

# 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 } 
} 

Это работает, потому что -Recurse: $ false - то же самое, что не имеет -Recurse вообще.

4 голосов
/ 25 января 2013

В PowerShell 3.0 он запекается с помощью -File -Directory переключателей:

dir -Directory #List only directories
dir -File #List only files
2 голосов
/ 17 июля 2010

Oisin дает точный ответ.Я просто хотел добавить, что это приближается к желанию быть прокси-функцией.Если у вас установлены PowerShell Community Extensions 2.0, у вас уже есть эта функция прокси.Вы должны включить его (по умолчанию он отключен).Просто отредактируйте файл Pscx.UserPreferences.ps1 и измените эту строку так, чтобы она была установлена ​​в $ true, как показано ниже:

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

Обратите внимание на ограничение, касающееся динамических параметров.Теперь, когда вы импортируете PSCX, сделайте это так:

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

Теперь вы можете сделать это:

Get-ChildItem . -r Bin -ContainerOnly
...