Answers:
对于低于3.0的PowerShell版本:
FileInfo
返回的对象Get-ChildItem
具有“基本”属性PSIsContainer
。您只想选择那些项目。
Get-ChildItem -Recurse | ?{ $_.PSIsContainer }
如果您想要目录的原始字符串名称,则可以执行
Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName
对于PowerShell 3.0及更高版本:
dir -Directory
在PowerShell 3.0中,它更简单:
Get-ChildItem -Directory #List only directories
Get-ChildItem -File #List only files
dir
别名为Get-ChildItem
,并且-Directory
和-File
选项按所述方式工作。我使用的命令echo $PSVersionTable
,help dir
,dir -Directory
并dir -File
想出这条评论。
ls
并dir
是Get-ChildItem
挑毒的别名
用
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
option。
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
开关时不遵循符号链接。要遵循符号链接,请使用指定-FollowSymlink
开关-r
。
注意2:从6.0版开始,PowerShell现在是跨平台的。跨平台版本最初称为PowerShell Core,但自PowerShell 7.0+起已删除单词“ Core”。
Get-ChildItem文档:https : //docs.microsoft.com/zh-cn/powershell/module/microsoft.powershell.management/get-childitem
一种更清洁的方法:
Get-ChildItem "<name_of_directory>" | where {$_.Attributes -match'Directory'}
我想知道PowerShell 3.0是否具有仅返回目录的开关;添加似乎是合乎逻辑的事情。
-Directory
和-File
标志
用:
dir -r | where { $_ -is [System.IO.DirectoryInfo] }
在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"
这种方法所需的文字更少:
ls -r | ? {$_.mode -match "d"}
用:
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
convertto-csv -NoTypeInformation
Out-File c:\temp\mydirectorylist.csv
您将要使用Get-ChildItem递归获取所有文件夹和文件。然后将输出通过管道传递到仅接收文件的Where-Object子句中。
# 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 ;
}
接受的答案提到
Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName
得到一个“原始字符串”。但实际上,Selected.System.IO.DirectoryInfo
将返回类型的对象。对于原始字符串,可以使用以下内容:
Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | % { $_.FullName }
如果值连接到字符串,则区别很重要:
Select-Object
令人惊讶foo\@{FullName=bar}
ForEach
-operator预期:foo\bar
Select-Object -ExpandProperty FullName
我的解决方案基于TechNet文章Get-ChildItem Cmdlet可以完成的有趣事情。
Get-ChildItem C:\foo | Where-Object {$_.mode -match "d"}
我在脚本中使用了它,并且效果很好。
要专门回答原始问题(使用IO.FileAttributes):
Get-ChildItem c:\mypath -Recurse | Where-Object {$_.Attributes -and [IO.FileAttributes]::Directory}
我确实更喜欢Marek的解决方案(Where-Object { $_ -is [System.IO.DirectoryInfo] }
)。