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