【问题标题】:Return the second level directory names only仅返回二级目录名称
【发布时间】:2016-09-08 16:23:05
【问题描述】:

我想检索我磁盘的所有(且仅)二级目录名称。比如C:\folder1\folder2C:\folder1\folder3,我只需要检索folder2folder3

我写了这个,PS 显示所有目录名:

Get-ChildItem -Recurse | ?{ $_.PSIsContainer} | Select-Object Name

找到了这个help,我把之前的命令修改成这样:

 Get-ChildItem -Recurse |  `Where-Object {($_.directory -match '^*\\\S*$')} ` | ForEach-Object {?{ $_.PSIsContainer} | Select-Object Name }

但是当我使用它时,PS 不显示任何内容。

我不明白为什么,有人可以帮助我吗?谢谢!

【问题讨论】:

    标签: powershell directory powershell-4.0


    【解决方案1】:

    只有文件似乎具有 .directory 属性,目录没有,因此您永远不会得到通过 (.directory 匹配模式) 过滤器和 (PSIsContainer) 过滤器的东西。

    除非您的PSIsContainer 过滤器不起作用:

    | ForEach-Object {?{ $_.PSIsContainer} | Select-Object Name }
    

    这没有意义;您只能使用?cmdlet | ? {} 过滤管道,您不能在没有输入的循环脚本块的开头进行过滤并获得任何有用的东西。这是在循环中一遍又一遍地运行where-object {},并且没有输出。

    使用 -Recurse 会很慢,因为你会一直到最后进入每个目录,并为所有文件创建 [fileinfo] 对象。

    除了马特的通配符答案,假设 PS v3 或更高版本,您可以列出根目录中的所有目录,然后列出其中的所有目录,然后停在那里:

    Get-ChildItem c:\ -Directory | Get-ChildItem -Directory | Select -ExpandProperty Name
    
    or
    
    gci c:\ -Dir | ForEach { (gci $_ -Dir).Name }
    

    【讨论】:

    • 您好!我尝试使用-Directory 并且它有效。谢谢你的帮助!实际上,我也尝试在 -Directory 语句之后使用 ForEach-Object {?{ $_.PSIsContainer} | Select-Object Name 并且它有效。显然Select Name 更好。但是……只是为了让你知道。谢谢!
    • @Hari 有用吗?我尝试gci | foreach { ? { $_.PsIsContainer } } 并且没有输出 - 没有文件,没有文件夹。 $_ 没有价值...?
    • 我试过这个命令:Get-ChildItem C:\*\* -Directory | ?{ $_.PSIsContainer} | Select -ExpandProperty Name,它给了我同样的输出:Get-ChildItem c:\ -Directory | Get-ChildItem -Directory | Select -ExpandProperty Name。所以......是的,它有效。
    【解决方案2】:

    你应该能够使用一些有趣的通配符来获得你想要的东西。

    Get-ChildItem \*\*\ | Where-Object{$_.PSIsContainer}
    

    或者,如果您至少有 PowerShell 3.0,这会更快

    Get-ChildItem \*\*\ -Directory
    

    那么,如果您只想要| Select-Object -ExpandProperty Name 上的名称

    【讨论】:

      【解决方案3】:

      这里有完整路径,网络兼容:

      (Get-ChildItem "\\folder1\" -Dir).fullname | ForEach {(Get-ChildItem $_ -Dir).name}
      

      希望将其存储在数组中吗?

      $subfolders = (Get-ChildItem "\\folder1\" -Dir).fullname | ForEach {(Get-ChildItem $_ -Dir).name}
      

      【讨论】:

        猜你喜欢
        • 2013-07-08
        • 2015-12-07
        • 1970-01-01
        • 1970-01-01
        • 2021-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多