Get-ChildItem 是什么
Get-ChildItem 是 PowerShell 里通用的「列出容器内容」命令,并不只针对文件系统:传目录路径返回 FileInfo 与 DirectoryInfo 对象,传注册表路径返回注册表项,传证书提供程序返回证书对象。因为返回的是对象,可以直接按大小、修改时间等属性过滤、排序、汇总,这是它比 CMD 的 dir 更适合写脚本的根本原因。别名有 gci、ls 和 dir,在 PowerShell 里敲 dir 实际执行的就是它。
基本信息
| 适用平台 | Windows PowerShell 5.1 与 PowerShell 7 及以上 |
|---|---|
| 语法 | Get-ChildItem [-Path] <路径> [-Recurse] [-Force] [-Filter <模式>] [-File|-Directory] [-Depth n] |
| 别名 | gci、ls、dir(PowerShell 会话内) |
| 关键区别 | -Filter 交给文件系统执行,速度快;-Include 与 -Exclude 需配合 -Recurse 或通配路径才生效 |
| 权限 | 读取受限目录需要相应权限,否则报拒绝访问;批量扫描时可用 -ErrorAction 控制噪音 |
典型使用场景
- 列出目录内容并按属性排序,找最近修改或体积最大的文件
- 递归统计某个目录的占用情况,配合 Measure-Object 求和
- 区分文件与目录:用 -File 或 -Directory 限定对象类型
- 排查隐藏项:默认不显示隐藏条目,需要时加 -Force
- 批量操作前置:先筛出目标文件列表,再交给 ForEach-Object 或 Remove-Item
- 读取注册表与证书等其他提供程序下的容器内容
常用示例
常用示例
# 递归列出所有 .log 文件(-File 排除同名目录)
Get-ChildItem C:\Logs -Filter *.log -Recurse -File
# 找出超过 100MB 的文件
Get-ChildItem D:\ -Force -File | Where-Object Length -gt 100MB
# 只列一级子目录
Get-ChildItem D:\Data -Directory
# 按修改时间倒序取最近 10 个文件
Get-ChildItem D:\Web -Recurse -File | Sort-Object LastWriteTime -Descending | Select-Object -First 10 FullName, LastWriteTime
# 统计目录内文件总大小
(Get-ChildItem D:\Logs -Recurse -File -ErrorAction SilentlyContinue | Measure-Object Length -Sum).Sum / 1GB常用参数速查
| 参数 | 作用 | 注意点 |
|---|---|---|
| -Path | 指定要列出的路径,支持通配符 | 省略时默认当前目录 |
| -Recurse | 递归所有子目录 | 深目录较慢,建议与 -File 或 -Filter 搭配缩小范围 |
| -Force | 包含隐藏与系统属性的条目 | 排查隐藏文件必用 |
| -Filter | 按文件系统原生模式筛选 | 比 -Include 快,但只支持 * 与 ? 之类简单通配 |
| -Include 与 -Exclude | 按列表筛选名称 | 不加 -Recurse 或路径通配时不生效,是最常见的踩坑点 |
| -File 与 -Directory | 只返回文件或只返回目录 | 读取属性前先限定类型,避免目录的 Length 为空 |
枚举目录内容只是读操作,不会修改数据。但要扫描的对象如果是生产库目录或百万级文件目录,递归枚举本身会产生明显的磁盘压力,建议避开业务高峰或改用直读索引的工具。
批量扫描时对权限错误可用 -ErrorAction SilentlyContinue 压掉报错,但要注意这会让统计结果偏小;需要精确值时,把错误收集到变量里单独复核。
常见需求与写法对照
| 需求 | 直觉写法 | 推荐写法 |
|---|---|---|
| 递归找某类文件 | Get-ChildItem -Recurse -Include *.log | Get-ChildItem -Recurse -File -Filter *.log |
| 只看一层目录 | 担心递归太慢而纠结参数 | 不加 -Recurse,或限制层级 -Depth 1 |
| 查看隐藏与系统项 | 直接执行 Get-ChildItem | 加 -Force |
| 统计目录总大小 | 对目录对象求和 Length | 先 -File 过滤再 Measure-Object Length -Sum |
| 超大目录做统计 | 用脚本逐条枚举 | 缩小范围,或改用直读索引的专用工具 |
只按名称筛选时 -Filter 明显比 Where-Object 快:前者由文件系统在枚举阶段过滤,后者要把所有条目取回再逐条判断,目录越大差距越直观。
按时间做增量处理时的常用写法:先用 Sort-Object LastWriteTime 排好序,再接 Select-Object -First 或 Where-Object 的时间比较,避免把整个目录都读进内存再筛选。
常见组合写法
- 找最占空间的条目:递归取文件后按 Length 降序,再截取前若干条
- 按扩展名归档:用 Group-Object 按扩展名分组,得到各类型的数量与大小
- 清理前的预演:先用 -File 与时间条件列出目标,确认无误再交给删除命令
- 巡检目录:统计文件数量与总大小,与历史基线比对发现异常增长