PowerShell模拟到;目录/a:d";(赢)或"赢",;ls-d*/“的;(猛击)

PowerShell模拟到;目录/a:d";(赢)或"赢",;ls-d*/“的;(猛击),powershell,scripting,directory,Powershell,Scripting,Directory,我只想使用PowerShell列出当前工作目录下的所有目录。这在Bash shell中很容易实现: ls -d */ 或Windows中的cmd.exe: dir /a:d 然而,使用PowerShell,我似乎无法用一个命令完成这项任务。相反,我发现唯一有效的方法是: ls | ? {$_Mode -like "d*"} 这似乎过于冗长和复杂,我怀疑我不需要一个单独的Where子句。Get ChildItem的帮助并没有明确说明如何在模式上进行过滤。有人能给我点化一下吗?这也行: ls

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

ls -d */ 
或Windows中的cmd.exe:

dir /a:d
然而,使用PowerShell,我似乎无法用一个命令完成这项任务。相反,我发现唯一有效的方法是:

ls | ? {$_Mode -like "d*"}
这似乎过于冗长和复杂,我怀疑我不需要一个单独的Where子句。Get ChildItem的帮助并没有明确说明如何在模式上进行过滤。有人能给我点化一下吗?

这也行:

ls | ?{$_.PsIsContainer}
毫无疑问,它比bash或cmd.exe更冗长。如果您想减少冗长,当然可以在配置文件中添加函数和别名。我会看看我是否也能找到一种使用过滤器的方法

在进一步的调查中,我认为除了创建自己的函数和别名之外,没有更简洁的方法来实现这一点。您可以将其放入您的个人资料中:

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总体上具有更大的灵活性,克服了这一案例中额外的冗长之处。

试试:

ls | ? {$_.PsIsContainer}

您可以查看PowerShell团队博客上的旧帖子:

我发现这比你想象的更容易记住

dir | ? {$_.PsIsContainer}

另外,它的输入速度更快,因为您可以使用-ex而不是-exclude,或者使用tab来展开它。

我之所以选择这个线程,是因为我想弄清楚“FOR/D”是如何工作的。实际上,如何使用批处理命令escape(%)和/D选项

我满怀希望地阅读了上述内容,老实说,它们都比FOR命令选项复杂得多——当然,如果它起作用的话


使用其他形式的for

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

仅目录

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

对于(set)do命令[CommandLineOptions]中的/D{%%|%}变量


您现在可以使用
getchilditem-Directory
或简称
ls-dir
。这至少从PowerShell 3.0开始就存在了。

我想我对EBGreen来说太慢了!我想速度并不重要这可以在PowerShell 3中简化以保存击键:ls |?PsIsContainerEhh…我把编译器留在家里了,所以没有冲突。如果你觉得这个问题很烦人,请在MS Connect上投票:当你有带点的目录,例如
foo.bar
dir | ? {$_.PsIsContainer}