我正在使用PowerShell 2.0,我想要删除某个路径的所有子目录。以下命令输出所有文件和目录,但我无法弄清楚如何过滤掉文件。
Get-ChildItem c:\mypath -Recurse
我尝试使用$_.Attributes
来获取属性,但后来我不知道如何构建System.IO.FileAttributes
的文字实例来比较它。在cmd.exe
中,它将是
dir /b /ad /s
答案 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
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] }
)。