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

时间:2009-08-25 20:07:29

标签: powershell scripting directory

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

ls -d */ 
Windows中的

或cmd.exe:

dir /a:d

使用PowerShell但是我似乎无法使用单个命令来执行此操作。相反,我发现唯一有效的是:

ls | ? {$_Mode -like "d*"}

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

6 个答案:

答案 0 :(得分:5)

这也有效:

ls | ?{$_.PsIsContainer}

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

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

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

New-Alias -Name gcc -value Get-ChildContainer -force

然后找到文件夹中的目录:

gcc C:\

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

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

答案 1 :(得分:2)

尝试:

ls | ? {$_.PsIsContainer}

答案 2 :(得分:2)

dir -Exclude *.*

我发现这比

更容易记住
dir | ? {$_.PsIsContainer}

另外,输入速度更快,因为你可以做-ex而不是-exclude或使用tab来扩展它。

答案 3 :(得分:0)

您可以在PowerShell团队博客上查看旧帖子:http://blogs.msdn.com/powershell/archive/2009/03/13/dir-a-d.aspx

答案 4 :(得分:0)

我来到这个主题是因为我想弄清楚“FOR / D”是如何工作的。实际上,如何使用带有/ D选项的批处理命令转义符(%)。

我充满希望地阅读了上述内容,说实话它们比FOR命令选项复杂得多 - 如果它当然有效。


使用其他形式的

  

如果启用了命令扩展(即默认设置),则支持以下其他形式的for:

仅限目录

  

如果set包含通配符(*和?),则为匹配set的每个目录(而不是指定目录中的一组文件)执行指定的命令。语法是:

     

表示/ D {%% | (set)中的%}变量执行命令[CommandLineOptions]

答案 5 :(得分:0)

您现在可以简称为Get-ChildItem -Directoryls -dir。至少自Microsoft's documentation起,PowerShell 3.0以来就存在这种情况。