Как написать функцию 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
утверждение из моей функции Get-Directories или это лучший способ сделать это?
3 ответа
Попробуй это:
# 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 вообще.
В PowerShell 3.0 он запекается с -File
-Directory
переключатели:
dir -Directory #List only directories
dir -File #List only files
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