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

Pet*_*ull 230 powershell powershell-2.0

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

Get-ChildItem c:\mypath -Recurse
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用$_.Attributes获取属性,但后来我不知道如何构建一个文字实例System.IO.FileAttributes来比较它.在cmd.exe它会

dir /b /ad /s
Run Code Online (Sandbox Code Playgroud)

xcu*_*cud 275

对于小于3.0的PowerShell版本:

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

Get-ChildItem -Recurse | ?{ $_.PSIsContainer }
Run Code Online (Sandbox Code Playgroud)

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

Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName
Run Code Online (Sandbox Code Playgroud)

对于PowerShell 3.0及更高版本:

dir -Directory
Run Code Online (Sandbox Code Playgroud)

  • 希望别名为"IsFolder". (18认同)
  • "容器"和"文件夹"之间的语义差距不是你可以驾驶卡车的. (9认同)
  • xcud:并非每个由PSDrive表示的层次结构都是基于文件夹的. (5认同)
  • @xcud:请参阅iraSenthil的回答.-Directory和-File也适用于Get-ChildItem.无需直接使用PSIsContainer属性. (5认同)

ira*_*hil 191

在PowerShell 3.0中,它更简单:

Get-ChildItem -Directory #List only directories
Get-ChildItem -File #List only files
Run Code Online (Sandbox Code Playgroud)

  • dir是Get-ChildItem的别名 (32认同)
  • 这应该是答案 (3认同)
  • `ls`和`dir`是`Get-ChildItem`的别名选择你的毒药 (2认同)

Sac*_*eph 50

Get-ChildItem -dir #lists only directories
Get-ChildItem -file #lists only files
Run Code Online (Sandbox Code Playgroud)

如果您喜欢别名,请使用

ls -dir #lists only directories
ls -file #lists only files
Run Code Online (Sandbox Code Playgroud)

要么

dir -dir #lists only directories
dir -file #lists only files
Run Code Online (Sandbox Code Playgroud)

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

ls -dir -r #lists only directories recursively
ls -file -r #lists only files recursively 
Run Code Online (Sandbox Code Playgroud)

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

  • 这在Powershell 2.0中不起作用,这是OP的特定需求。-[/ Dir / Directory]在Powershell 2.0中不是有效的参数 (2认同)

Car*_*nez 21

更清洁的方法:

Get-ChildItem "<name_of_directory>" | where {$_.Attributes -match'Directory'}
Run Code Online (Sandbox Code Playgroud)

我想知道PowerShell 3.0是否有一个只返回目录的开关; 添加似乎是合乎逻辑的事情.

  • 仅供参考 powershell 3.0 添加了 `-Directory` 和 `-File` 标志 (3认同)

Mar*_*icz 12

使用:

dir -r | where { $_ -is [System.IO.DirectoryInfo] }
Run Code Online (Sandbox Code Playgroud)


jyg*_*ath 6

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

ls -r | ? {$_.mode -match "d"}
Run Code Online (Sandbox Code Playgroud)

  • 因为压缩文件夹是一个 zip 文件 (7认同)
  • 更短: ls -r | ? { $_.mode -match "d" } (2认同)

Bil*_*ill 6

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

Get-ChildItem $Path -attributes D -Recurse
Run Code Online (Sandbox Code Playgroud)

如果您只想要文件夹名称,而不是其他内容,请使用:

Get-ChildItem $Path -Name -attributes D -Recurse
Run Code Online (Sandbox Code Playgroud)

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

Get-ChildItem $Path -attributes D -Recurse -include "myFolder"
Run Code Online (Sandbox Code Playgroud)

  • Attributes参数似乎不在PS2中,它给出错误"找不到与参数名称'属性'匹配的参数".它在PS3中运行正常. (5认同)

sev*_*rce 5

接受的答案提到

Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName
Run Code Online (Sandbox Code Playgroud)

得到一个“原始字符串”。但实际上类型的对象Selected.System.IO.DirectoryInfo将会被返回。对于原始字符串,可以使用以下内容:

Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | % { $_.FullName }
Run Code Online (Sandbox Code Playgroud)

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

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