提供程序与 PSDrive 是什么
PowerShell 用「提供程序」把注册表、证书存储、环境变量等异构数据源包装成类似磁盘的结构,再用 PSDrive 挂成 HKLM:、Cert:、Env: 这样的盘符。好处是同一套命令通吃:Get-ChildItem 既能列目录,也能列注册表子键和证书。理解这一层,很多「为什么注册表要用 Get-ItemProperty」的疑惑就自然解开了。
基本信息
| 适用平台 | Windows PowerShell 5.1 与 PowerShell 7 |
|---|---|
| 查看 | Get-PSDrive 列出可用盘符,Get-PSProvider 列出提供程序能力 |
| 内置盘符 | FileSystem、HKLM:、HKCU:、Cert:、Env:、Variable、Alias、Function、WSMan |
| 通用命令 | Get-ChildItem、Get-Item、Get-ItemProperty、Set-ItemProperty、New-Item、Test-Path、Set-Location |
| 注册表值 | 键(Key)用 Get-ChildItem 展开,值(Value)用 Get-ItemProperty 读取 |
| 自定义盘符 | New-PSDrive -Name -PSProvider -Root,文件系统可加 -Persist 生成映射盘 |
典型使用场景
- 注册表巡检:按提供程序递归查子键与值,替代手动逐层点开
- 证书盘点:列出本机或当前用户的证书,筛选即将到期或用于代码签名的证书
- 环境变量核对:在 Env: 盘符下枚举变量,排查部署脚本依赖的变量是否齐全
- 统一盘点脚本:用同一套遍历逻辑处理文件、注册表、证书三类目标
- 临时映射:为网络共享创建带凭据的临时 PSDrive,用完移除
常用示例
常用示例
Get-PSDrive # 列出当前所有盘符与剩余空间
Get-PSProvider # 查看已注册的提供程序
Get-ChildItem HKCU:\Software | Select-Object -First 5 # 列注册表子键
Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -Name ProductName # 读值
Set-ItemProperty 'HKCU:\Software\MyApp' -Name Mode -Value prod # 改值(先备份)
Get-ChildItem Cert:\LocalMachine\My | Select-Object Subject, NotAfter # 列证书
Get-ChildItem Cert:\LocalMachine\Root -CodeSigningCert # 带提供程序专有参数筛选
Get-ChildItem Env: | Where-Object Name -like 'HTTP*' # 查环境变量
New-PSDrive -Name T -PSProvider FileSystem -Root \\SRV01\share -Persist # 临时映射网络盘常用盘符对照
| 盘符 | 背后数据源 | 取值要点 |
|---|---|---|
| C: 等文件系统 | 本地或网络文件 | 支持 -Recurse、-Filter,与传统文件操作一致 |
| HKLM: / HKCU: | 注册表键 | 子键当目录、值用 Get-ItemProperty 读取(含默认值) |
| Cert: | 证书存储 | 分 LocalMachine 与 CurrentUser,支持 -CodeSigningCert 等专有参数 |
| Env: | 环境变量 | 直接当作字符串变量集合,可读写 |
| Alias: / Function: | 会话内的别名与函数 | 用于查看当前会话定义了哪些快捷命令 |
注册表的「键」像目录,「值」像文件内容但不是文件:读取用 Get-ItemProperty,默认值(未命名值)用 (Get-Item 键).GetValue('') 取。直接 Get-Content 一个注册表路径会报错。
64 位系统上 32 位程序看到的是 HKLM\SOFTWARE\WOW6432Node 分支,PowerShell 里读写要与目标程序的位数对齐,否则出现「明明改了却没生效」。
跨提供程序遍历与容错
跨提供程序遍历与容错
Get-ChildItem HKCU:\Software -Recurse -ErrorAction SilentlyContinue | Select-Object -First 20 # 递归时忽略权限错误
Get-ChildItem HKLM:\SOFTWARE -Recurse -Depth 2 # 限制深度,避免漫长遍历
Get-ChildItem Cert:\LocalMachine\My | Where-Object NotAfter -lt (Get-Date).AddDays(30) # 30 天内到期
Get-ChildItem Env: | Sort-Object Name | Format-Table Name, Value # 环境变量排序输出Remove-Item 在注册表提供程序下会真的删除键与子键树,且没有回收站。批量删除前先导出备份(reg export 或先复制整个分支),并确认目标分支没有被系统或软件引用。