如何使用get - childitem只获取目录?

我使用的是PowerShell 2.0,我想输出某个路径的所有子目录。下面的命令输出所有文件和目录,但我不知道如何过滤掉这些文件。

Get-ChildItem c:\mypath -Recurse

我已经尝试使用$_.Attributes来获取属性,但我不知道如何构造System.IO.FileAttributes的字面实例来进行比较。在cmd.exe中是

dir /b /ad /s
581425 次浏览

对于PowerShell 3.0及更高版本:

Get-ChildItem -Directory

你也可以使用别名dirlsgci


对于低于3.0的PowerShell版本:

Get-ChildItem返回的FileInfo对象有一个“;base"财产,PSIsContainer。您只需要选择这些项。

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

如果您想要目录的原始字符串名称,您可以这样做

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

使用:

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

更干净的方法:

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

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

在PowerShell 3.0中,它更简单:

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

这种方法需要更少的文本:

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

用这个吧:

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

一个更易于阅读和简单的方法可以实现下面的脚本:

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

希望这能有所帮助!

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"

使用:

dir -Directory -Recurse | Select FullName

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

公认的答案提到

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

获取原始字符串。 但实际上将返回Selected.System.IO.DirectoryInfo类型的对象。对于原始字符串,可以使用以下方法:

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

如果该值连接到一个字符串,则区别很重要:

  • Select-Object意外地foo\@{FullName=bar}
  • 使用__abc0操作符,即预期的:foo\bar

使用:

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 < / >

我的解决方案是基于TechNet文章你可以用Get-ChildItem Cmdlet做的有趣的事情

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

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

使用

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)和PowerShell 7.0 (Windows 10, Mac和Linux)上进行测试。

请注意:在PowerShell Core上,指定-r开关时不遵循符号链接。要跟随符号链接,请使用-r指定-FollowSymlink开关。

注2: PowerShell现在是跨平台的,从版本6.0开始。跨平台版本最初被称为PowerShell Core,但自PowerShell 7.0+以来,“Core”一词已被删除。

Get-ChildItem文档:https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem

你需要先使用Get-ChildItem递归地获取所有文件夹和文件。然后将输出管道到子句中,该子句只接收文件。

# one of several ways to identify a file is using GetType() which
# will return "FileInfo" or "DirectoryInfo"
$files = Get-ChildItem E:\ -Recurse | Where-Object {$_.GetType().Name -eq "FileInfo"} ;


foreach ($file in $files) {
echo $file.FullName ;
}

具体地回答原始问题(使用IO.FileAttributes):

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

但我更喜欢Marek的解决方案:

Where-Object { $_ -is [System.IO.DirectoryInfo] }

这个问题已经得到了很好的回答,但我想补充一些额外的东西,因为我刚刚看到了这个问题。

Get-ChildItem恰好生成两个类型的对象,而大多数命令只生成一个。

返回FileInfoDirectoryInfo

你可以通过查看该命令可用的“成员”来查看这一点,如下所示:

Get-ChildItem | Get-Member
  • TypeName: System.IO.DirectoryInfo
  • TypeName: System.IO.FileInfo

您将看到每种类型可用的各种方法和属性。注意,这里有不同之处。例如,FileInfo对象有长度属性,而DirectoryInfo对象没有。

无论如何,从技术上讲,我们可以通过隔离DirectoryInfo对象只返回目录

Get-ChildItem | Where-Object {$_.GetType().Name -eq "DirectoryInfo"}

显然,正如上面的答案所述,最直接的解决方案是简单地使用Get-ChildItem -Directory,但我们现在知道如何在未来使用多种对象类型:)

您可以尝试PsIsContainer对象

Get-ChildItem -path C:\mypath -Recurse | where {$_.PsIsContainer -eq $true}