PowerShell模拟为"dir/a:d"(Win)或"ls -d*/"(Bash)

Jus*_* R. 7 directory powershell scripting

我只想使用PowerShell列出当前工作目录下的所有目录.这很容易来自Bash shell:

ls -d */ 
Run Code Online (Sandbox Code Playgroud)

或Windows中的cmd.exe:

dir /a:d
Run Code Online (Sandbox Code Playgroud)

然而,使用PowerShell,我似乎无法使用单个命令来执行此操作.相反,我发现的唯一作品是:

ls | ? {$_Mode -like "d*"}
Run Code Online (Sandbox Code Playgroud)

这似乎过于冗长和涉及,我怀疑我不需要在那里单独的Where子句.Get-ChildItem的帮助并不清楚如何过滤模式.任何人都可以开导我吗?

EBG*_*een 5

这也有效:

ls | ?{$_.PsIsContainer}
Run Code Online (Sandbox Code Playgroud)

毫无疑问,它比bash或cmd.exe更加冗长.如果你想减少冗长,你当然可以在你的个人资料中添加一个函数和一个别名.我会看看我是否能找到一种方法来使用-filter.

在进一步调查中,我不相信有更简洁的方法来创建自己的函数和别名.你可以把它放在你的个人资料中:

function Get-ChildContainer
{
    param(
            $root = "."
          )
    Get-ChildItem -path $root | Where-Object{$_.PsIsContainer}
}

New-Alias -Name gcc -value Get-ChildContainer -force
Run Code Online (Sandbox Code Playgroud)

然后到文件夹中的目录:

gcc C:\
Run Code Online (Sandbox Code Playgroud)

这个解决方案有点受限,因为它不会处理像-Include,-Exclude,-Filter,-Recurse等任何想象,但你可以轻松地将它添加到函数中.

实际上,这是一个相当天真的解决方案,但如果您决定继续这样做,它希望它会引导您朝着正确的方向前进.说实话,虽然我不打扰.在我个人看来,一般情况下PowerShell的整体更大的灵活性可以克服这一案例中的额外冗长.

  • 真?别名"gcc"?:) (3认同)
  • 呃......我把编译器留在了家里,所以没有冲突. (2认同)