系统学习 Windows 学习路径:从 CMD 到 PowerShell、系统网络,再到 WSL 与 Server

Get-ChildItem

列出文件系统、注册表等提供程序中的条目,输出可继续过滤的对象。

补充说明

Get-ChildItem 枚举指定路径的直接子项,输出 System.IO.FileInfo / DirectoryInfo(注册表提供程序则输出注册表键对象),不是格式化文本。常见别名是 gci、ls、dir;它支持 -File、-Directory、-Recurse、-Depth、-Force、-Filter,结果的 FullName、Length、LastWriteTime、Attributes 可直接参与管道运算。

管道:-Path 可按属性名接收字符串,不消费 FileInfo 对象;要按大小、时间筛选请接 Where-Object。权限:读取目录需要 LIST/READ 权限,无权访问的子目录产生非终止错误,后续条目继续输出,脚本不一定失败。需要管理员才能看全其他用户的目录和部分系统路径。

版本:5.1 只有 Windows 提供程序,-File、-Directory、-Depth 已可用。7.x 差异:增加 Unix 文件系统提供程序,隐藏项靠点号而不是 Hidden 属性,并支持 -FollowSymlink;跨平台脚本不要依赖 Attributes 判断 Unix 隐藏文件。

常用示例

# 1. 找最大的日志文件,先排序再截断,避免输出过多
PS C:\> Get-ChildItem C:\Logs -File | Sort-Object Length -Descending | Select-Object -First 5 Name, Length, LastWriteTime

# 2. 统计 DLL 总大小;Length 只对文件有意义
PS C:\> Get-ChildItem C:\Windows\System32 -Filter *.dll -File | Measure-Object -Property Length -Sum

# 3. 递归找最近 7 天改过的文件;权限错误只记录不中断
PS C:\> Get-ChildItem C:\Apps -Recurse -Force -ErrorAction SilentlyContinue | Where-Object LastWriteTime -gt (Get-Date).AddDays(-7)

# 4. 用注册表提供程序列出已安装程序的子键
PS C:\> Get-ChildItem HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall | Select-Object -First 5 PSChildName

# 5. 用通配符定位特定前缀的目录
PS C:\> Get-ChildItem C:\ProgramData -Directory -Filter 'Microsoft*' | Select-Object Name, FullName

# 6. 只看隐藏项,Attributes 是位标志而非布尔值
PS C:\> Get-ChildItem C:\Windows\Temp -Force | Where-Object { $_.Attributes -band [IO.FileAttributes]::Hidden }

易错点与排错

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. Get-ChildItem 输出的是字符串还是对象?这对后续 Where-Object 有什么影响?
  2. 为什么 Get-ChildItem C:\Logs -Include *.log 可能什么都找不到?
  3. 递归扫描时遇到“拒绝访问”,命令会停止吗?脚本怎样可靠发现这类错误?
答案
  1. 输出 FileInfo/DirectoryInfo 等对象;后续可按 Length、LastWriteTime 等属性筛选,不需要解析文本。
  2. -Include 需要 -Recurse 或路径中的通配符才会展开;改用 -Filter 或 -Path C:\Logs\* -Include *.log。
  3. 不会,默认是非终止错误并继续;用 -ErrorVariable 收集后检查数量,或 -ErrorAction Stop 让它失败。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令