如何使用Get-ChildItem仅获取目录?

时间:2010-06-21 14:03:30

标签: powershell powershell-v2.0

我正在使用PowerShell 2.0,我想要删除某个路径的所有子目录。以下命令输出所有文件和目录,但我无法弄清楚如何过滤掉文件。

Get-ChildItem c:\mypath -Recurse

我尝试使用$_.Attributes来获取属性,但后来我不知道如何构建System.IO.FileAttributes的文字实例来比较它。在cmd.exe中,它将是

dir /b /ad /s

15 个答案:

答案 0 :(得分:252)

适用于小于3.0的PowerShell版本

FileInfo返回的Get-ChildItem对象具有“基础”属性PSIsContainer。您只想选择那些项目。

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

如果您想要目录的原始字符串名称,可以执行

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

适用于PowerShell 3.0及更高版本:

dir -Directory

答案 1 :(得分:172)

在PowerShell 3.0中,它更简单:

Get-ChildItem -Directory #List only directories
Get-ChildItem -File #List only files

答案 2 :(得分:45)

使用

Get-ChildItem -dir #lists only directories
Get-ChildItem -file #lists only files

如果您喜欢别名,请使用

ls -dir #lists only directories
ls -file #lists only files

dir -dir #lists only directories
dir -file #lists only files

要递归子目录,请添加-r选项。

ls -dir -r #lists only directories recursively
ls -file -r #lists only files recursively 

在PowerShell 4.0,PowerShell 5.0(Windows 10)和PowerShell Core 6.0(Windows 10,Mac和Linux)上进行了测试。

答案 3 :(得分:20)

更清洁的方法:

Get-ChildItem "<name_of_directory>" | where {$_.Attributes -match'Directory'}

我想知道PowerShell 3.0是否有一个只返回目录的开关;这似乎是合乎逻辑的补充。

答案 4 :(得分:11)

使用:

dir -r | where { $_ -is [System.IO.DirectoryInfo] }

答案 5 :(得分:6)

从PowerShell v2和更新版本(k表示您开始搜索的文件夹):

Get-ChildItem $Path -attributes D -Recurse

如果您只想要文件夹名称,请不要使用此文件:

Get-ChildItem $Path -Name -attributes D -Recurse

如果您要查找特定文件夹,可以使用以下内容。在这种情况下,我正在寻找一个名为myFolder的文件夹:

Get-ChildItem $Path -attributes D -Recurse -include "myFolder"

答案 6 :(得分:4)

此方法需要较少的文字:

ls -r | ? {$_.mode -match "d"}

答案 7 :(得分:3)

使用:

dir -Directory -Recurse | Select FullName

这将为您提供根结构的输出,其中仅包含目录的文件夹名称。

答案 8 :(得分:2)

使用以下脚本可以实现更具可读性和简单性的方法:

$Directory = "./"
Get-ChildItem $Directory -Recurse | % {
    if ($_.Attributes -eq "Directory") {
        Write-Host $_.FullName
    }
}

希望这有帮助!

答案 9 :(得分:2)

使用:

Get-ChildItem \\myserver\myshare\myshare\ -Directory | Select-Object -Property name |  convertto-csv -NoTypeInformation  | Out-File c:\temp\mydirectorylist.csv

以下是哪个

  • 获取目标位置中的目录列表: Get-ChildItem \\myserver\myshare\myshare\ -Directory
  • 仅提取目录名称: Select-Object -Property name
  • 将输出转换为CSV格式: convertto-csv -NoTypeInformation
  • 将结果保存到文件中: Out-File c:\temp\mydirectorylist.csv

答案 10 :(得分:2)

您需要先使用 Get-ChildItem 递归获取所有文件夹和文件。然后将输出管道输入 Where-Object 子句,该子句仅接收文件。

FormView

答案 11 :(得分:1)

接受的答案提及

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

获取&#34;原始字符串&#34;。 但事实上,将返回Selected.System.IO.DirectoryInfo类型的对象。对于原始字符串,可以使用以下内容:

Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | % { $_.FullName }

如果值连接到字符串,则差异很重要:

  • Select-Object令人惊讶foo\@{FullName=bar}
  • 使用ForEach - 运算符预期:foo\bar

答案 12 :(得分:1)

我的解决方案基于TechNet文章 Fun Things You Can Do With the Get-ChildItem Cmdlet

Get-ChildItem C:\foo | Where-Object {$_.mode -match "d"}

我在我的剧本中使用它,效果很好。

答案 13 :(得分:0)

使用这个:

Get-ChildItem -Path \\server\share\folder\ -Recurse -Force | where {$_.Attributes -like '*Directory*'} | Export-Csv -Path C:\Temp\Export.csv -Encoding "Unicode" -Delimiter ";"

答案 14 :(得分:0)

专门回答原始问题(使用IO.FileAttributes):

Get-ChildItem c:\mypath -Recurse | Where-Object {$_.Attributes -and [IO.FileAttributes]::Directory}

我确实更喜欢Marek的解决方案(Where-Object { $_ -is [System.IO.DirectoryInfo] })。