Как записать, что PowerShell функционирует для получения каталогов?

Используя 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 оператор из моих Получать-каталогов функционирует, или действительно ли это - лучший способ сделать это?

10
задан Peter Mortensen 12 November 2015 в 13:13
поделиться

2 ответа

Попробуйте следующее:

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

13
ответ дан 3 December 2019 в 20:02
поделиться

Ответ, который дал 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
2
ответ дан 3 December 2019 в 20:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: