如何编写PowerShell函数来获取目录?

时间:2010-07-17 05:08:57

标签: powershell directory get-childitem

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

如何从我的Get-Directories功能中删除if语句,或者这是更好的方法吗?

3 个答案:

答案 0 :(得分:13)

试试这个:

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

答案 1 :(得分:4)

在PowerShell 3.0中,它使用-File -Directory个开关:

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

答案 2 :(得分:2)

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