PowerShell 提供程序和 PowerShell 驱动器
PowerShell 提供程序
提供程序 = 把不同的数据存储抽象成“虚拟驱动器”来统一管理。
提供程序是一种“适配器”,它把不同的数据存储(文件系统、注册表、证书存储等)映射成类似文件系统的导航结构,让你可以用 cd、dir、ls、Get-ChildItem 等命令像操作文件夹一样去操作。
查看当前系统的提供程序
Get-PSProvider
输出如下:(不一定是下面这些,有的机器都有变化)
| Name | Capabilities | Drives |
|---|---|---|
| FileSystem | Filter, ShouldProcess, Credentials | C, D, .... |
| Registry | ShouldProcess, Transactions, ExpandWildcards | HKLM, HKCU |
| Certificate | Filter, ShouldProcess, Include, Exclude | Cert |
| Alias | ShouldProcess | Alias |
| Function | ShouldProcess | Function |
| Variable | ShouldProcess | Variable |
| Environment | ShouldProcess | Env |
先看最直观的效果:
| 提供程序 | 路径前缀 | 用途 |
|---|---|---|
| FileSystem | C:, D: |
磁盘目录文件管理 |
| Registry | HKLM:, HKCU: |
操作注册表 |
| Certificate | Cert: |
管理证书 |
| Alias | Alias: |
查看和修改命令别名 |
| Function | Function: |
查看函数 |
| Variable | Variable: |
管理变量 |
| Environment | Env: |
管理环境变量 |
它统一了操作方式,下面这个才是我们需要记住的,就是Get-ChildItem去查看很多不同的类型
无论是文件、注册表、证书还是变量,你都可以用类似的命令操作:
# 查看文件夹 Get-ChildItem C:Windows # 查看注册表键 Get-ChildItem HKLM:Software # 查看证书 Get-ChildItem Cert:LocalMachineMy # 查看变量 Get-ChildItem Variable:
表中有Capabilities列的,意思是:
- ShouldProcess → 允许
-WhatIf和-Confirm,用于预览和确认更改。 - Filter → 支持快速筛选,而不是在本地循环。
- Include/Exclude → 支持用通配符来包含或排除对象。
- ExpandWildcards → 可以在路径里使用
*、?等通配符。 - Credentials → 支持使用
-Credential来指定不同用户身份访问。 - Transactions → 支持事务操作(例如注册表操作可以回滚)。
例子:
# Registry 提供程序支持 -UseTransaction Start-Transaction New-Item -Path "HKCU:SoftwareTestKey" -UseTransaction Complete-Transaction
如果换成 FileSystem 提供程序(比如 New-Item C:TestFile.txt -UseTransaction),就会报错,因为 文件系统不支持事务/回滚。
查看提供程序的帮助文件
帮助文件使用 about_ProviderName_Provider 命名格式
例如,FileSystem 提供程序的帮助文件为 about_FileSystem_Provider
可通过运行以下命令来查看此帮助文件的内容:
Get-Help about_FileSystem_Provider
再者:获取注册表提供程序的帮助信息
Get-Help about_Registry_Provider
以此类推,把中间的改成你要获取的 "提供程序" 名字即可
Get-Help about_YourName_Provider
使用PowerShell 驱动器
查看 PowerShell 驱动器
Get-PSDrive
| Name | Provider | Root | CurrentLocation |
|---|---|---|---|
| C | FileSystem | C:|UsersAdmin | |
| HKCU | Registry | HKEY_CURRENT_USER | |
| HKLM | Registry | HKEY_LOCAL_MACHINE | |
| Env | Environment | ||
| Cert | Certificate | ||
| Alias | Alias | ||
| Variable | Variable |
下表介绍了与常用 PSDrive 关联的谓词:
| 动词 | 描述 |
|---|---|
| New | 创建新的项或项属性。 |
| Set | 设置项或项属性的值。 |
| Get | 显示项或子项的属性,或项属性的值。 |
| Clear | 清除项或项属性的值。 |
| Copy | 将项或项属性从一个位置复制到另一个位置。 |
| Move | 将项或项属性从一个位置移动到另一个位置。 |
| Remove | 删除项或项属性。 |
| Rename | 重命名项或项属性。 |
| Invoke | 执行与项关联的默认操作。 |
驱动器的特点
- 名称唯一
- 可以是一个字母(如
C),也可以是多个字符(如HKCU、Env)。 - 用于路径时要加冒号,比如
C:、HKCU:、Env:。
- 可以是一个字母(如
- 依赖提供程序
- 驱动器继承其底层提供程序的所有功能(筛选、事务、凭据等)。
- 默认驱动器(新会话必有):
- FileSystem 驱动器:如
C: - 注册表驱动器:
HKLM:、HKCU: - 特殊存储驱动器:
Variable:、Function:、Alias: - 环境变量驱动器:
Env: - 证书驱动器:
Cert: - WSMan 驱动器:
WSMan:(管理远程连接配置)
- FileSystem 驱动器:如
处理 PowerShell 驱动器位置
驱动器位置的命令
| 命令 | 描述 |
|---|---|
| Get-Location | 显示当前工作位置。 |
| Set-Location | 设置当前工作位置。 |
| Push-Location | 将位置添加到位置堆栈的顶部。 |
| Pop-Location | 将当前位置更改为位置堆栈顶部的位置。 |
管理文件系统
PowerShell 提供了 文件系统驱动器(PSDrive)和 文件系统提供程序(FileSystem Provider),可以用 cmdlet 来管理文件和文件夹,同时也保留了命令提示符的别名,让 cmd.exe 用户可以快速上手。
别名与 cmdlet 对应关系
| cmd.exe 命令 | PowerShell 别名 | 对应 cmdlet | 说明 |
|---|---|---|---|
| Dir | Dir | Get-ChildItem | 列出目录和文件 |
| Cd | Cd | Set-Location | 切换目录 |
| Md / MkDir | Md | New-Item | 创建新文件夹 |
| Rd / RmDir | Rd | Remove-Item | 删除文件夹 |
| Del | Del | Remove-Item | 删除文件 |
| Copy | Copy | Copy-Item | 复制文件/文件夹 |
| Move | Move | Move-Item | 移动文件/文件夹 |
| Ren | Ren | Rename-Item | 重命名文件/文件夹 |
注意:
- PowerShell 不使用
/s、/q等 cmd.exe 参数。 - 通配符和参数需要使用
-Recurse、-Force、-Filter等 PowerShell 风格。
移动目录
# 使用绝对路径 Set-Location C:Users # 使用相对路径 Set-Location Temp # 查看当前路径 Get-Location
Set-Location是 PowerShell 的核心命令,用于切换当前工作目录。- 别名
cd和chdir都可以替代它。
创建文件和文件夹
# 创建文件夹 New-Item -Path "C:TestFolder" -ItemType Directory # 创建文件 New-Item -Path "C:TestFolderexample.txt" -ItemType File # 使用别名 md C:TestFolder2
-ItemType可以是File或Directory。- 如果路径中包含不存在的父目录,需要先创建父目录,或者使用
-Force。
删除文件和文件夹
# 删除文件 Remove-Item -Path "C:TestFolderexample.txt" # 删除文件夹及其子文件 Remove-Item -Path "C:TestFolder" -Recurse # 强制删除(跳过确认) Remove-Item -Path "C:TestFolder" -Recurse -Force
-Recurse删除文件夹下所有内容。-Force可以删除隐藏文件、只读文件或跳过确认。
查找和枚举文件/文件夹
# 获取单个文件或文件夹 Get-Item C:TestFolderexample.txt # 获取当前目录所有文件和文件夹 Get-ChildItem # 获取当前目录及子目录所有文件 Get-ChildItem -Recurse # 使用通配符查找特定类型文件 Get-ChildItem *.txt # 排除某些文件 Get-ChildItem -Exclude *.log # 只包含某些文件 Get-ChildItem -Include *.txt, *.docx
Get-Item:获取单个项目对象。Get-ChildItem:获取目录中的所有项目对象(类似dir)。- 支持
-Recurse、-Filter、-Include、-Exclude对文件过滤和目录遍历。
小技巧与实际应用
1.组合管道操作
# 获取所有 txt 文件并按大小排序 Get-ChildItem -Recurse -Filter *.txt | Sort-Object Length
2.查找并删除过期文件
# 删除 30 天前的日志文件 Get-ChildItem "C:Logs" -Filter *.log -Recurse | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } | Remove-Item -Force
3.批量重命名
# 将所有 txt 文件改为小写 Get-ChildItem *.txt | Rename-Item -NewName { $_.Name.ToLower() }
管理注册表
PowerShell 提供了 注册表提供程序(Registry Provider),可以把注册表视为类似文件系统的结构进行操作。每个注册表键(Key)就像一个文件夹,每个注册表值(Value)就像文件夹里的文件属性。
| 驱动器 | 注册表分支 | 说明 |
|---|---|---|
| HKLM | HKEY_LOCAL_MACHINE | 系统范围的配置,影响所有用户 |
| HKCU | HKEY_CURRENT_USER | 当前用户的配置,只影响登录用户 |
New-PSDrive 为其他注册表分支创建自定义驱动器
# 创建自定义注册表驱动器 New-PSDrive -Name TestHKU -PSProvider Registry -Root HKEY_USERS
-Name:驱动器名称-PSProvider:指定提供程序为 Registry-Root:注册表路径
创建后就可以像访问文件夹一样访问注册表了,例如TestHKU:。
获取注册表项
注册表项类似文件系统中的文件夹,用 Get-Item 或 Get-ChildItem 访问:
# 获取某个路径下的所有子项 Get-ChildItem HKLM:SOFTWAREMicrosoftWindowsCurrentVersion
返回的是注册表项对象(KeyInfo),可以进一步操作或管道传递。
获取注册表值
注册表值类似文件夹里的属性,用 Get-ItemProperty 或 Get-ItemPropertyValue 访问:
# 获取指定注册表项下所有值 Get-ItemProperty HKLM:SOFTWAREMicrosoftWindowsCurrentVersionRun # 获取特定值的内容 Get-ItemPropertyValue HKLM:SOFTWAREMicrosoftWindowsCurrentVersionRun -Name WindowsDefender
-Name指定具体值名- 返回值数据(ValueData)而不是对象
创建或修改注册表值
使用 New-ItemProperty 或 Set-ItemProperty:
# 创建新的注册表值 New-ItemProperty -Path HKCU:SoftwareTestApp -Name "Setting1" -Value "Enabled" -PropertyType String # 修改已有注册表值 Set-ItemProperty -Path HKCU:SoftwareTestApp -Name "Setting1" -Value "Disabled"
-PropertyType 对应注册表数据类型:
| PowerShell 类型 | 注册表类型 |
|---|---|
| String | REG_SZ |
| ExpandString | REG_EXPAND_SZ |
| Binary | REG_BINARY |
| DWord | REG_DWORD |
| MultiString | REG_MULTI_SZ |
| QWord | REG_QWORD |
删除注册表项和值
# 删除注册表值 Remove-ItemProperty -Path HKCU:SoftwareTestApp -Name "Setting1" # 删除注册表项及其子项 Remove-Item -Path HKCU:SoftwareTestApp -Recurse
-Recurse删除所有子键和值- 操作注册表之前建议备份,以防误删
# 备份注册表某路径 reg export HKCUSoftwareTestApp C:BackupTestApp.reg
使用事务管理注册表
注册表提供程序支持事务,可以一次执行多个操作,要么全部成功,要么全部回滚,避免半成品状态:
# 开启事务 Start-Transaction # 执行注册表操作 New-ItemProperty -Path HKCU:SoftwareTestApp -Name "SettingA" -Value "1" -PropertyType DWord -UseTransaction Set-ItemProperty -Path HKCU:SoftwareTestApp -Name "SettingB" -Value "2" -UseTransaction # 提交事务 Complete-Transaction # 若出错,可回滚 Undo-Transaction
-UseTransaction参数表示该操作在事务中执行- 有助于批量修改注册表而不产生部分更新
实际案例
批量修改软件设置
$apps = "App1","App2" foreach ($app in $apps) { Set-ItemProperty HKCU:Software$app -Name "AutoStart" -Value 1 }
检测并删除启动项
$runKeys = Get-ChildItem HKLM:SOFTWAREMicrosoftWindowsCurrentVersionRun foreach ($key in $runKeys) { if ($key.PSChildName -eq "UnwantedApp") { Remove-ItemProperty -Path $key.PSPath -Name "UnwantedApp" } }
创建事务批量修改注册表值
Start-Transaction Set-ItemProperty -Path HKCU:SoftwareTestApp -Name "SettingA" -Value 10 -UseTransaction Set-ItemProperty -Path HKCU:SoftwareTestApp -Name "SettingB" -Value 20 -UseTransaction Complete-Transaction
使用证书
PowerShell 通过 证书提供程序(Certificate Provider)将证书存储映射成类似文件系统的结构,你可以像管理文件夹和文件一样操作证书。
- 驱动器名称:
Cert: - 常见存储位置:↓↓
| 路径 | 说明 |
|---|---|
Cert:CurrentUserMy |
当前用户的个人证书存储 |
Cert:LocalMachineMy |
本地计算机的个人证书存储 |
也可以访问其他标准存储:
Root:受信任根证书CA:受信任的证书颁发机构TrustedPeople:受信任的人
查看证书
# 查看当前用户个人证书 Get-ChildItem Cert:CurrentUserMy # 查看本地计算机个人证书 Get-ChildItem Cert:LocalMachineMy
使用证书提供程序的专用动态参数进行筛选:
| 参数 | 说明 |
|---|---|
-CodeSigningCert |
获取可用于代码签名的证书 |
-DocumentEncryptionCert |
获取用于文档加密的证书 |
-DnsName |
获取 DNSNameList 包含指定域名的证书(支持通配符) |
-EKU |
获取具有指定增强密钥用法 (EKU) 的证书 |
-ExpiringInDays |
获取将在指定天数内过期的证书 |
-SSLServerAuthentication |
获取 SSL 服务器证书 |
示例:
# 获取将在 30 天内过期的证书 Get-ChildItem Cert:LocalMachineMy -ExpiringInDays 30 # 获取 SSL 服务器证书 Get-ChildItem Cert:LocalMachineMy -SSLServerAuthentication # 获取 DNS 名称包含 contoso.com 的证书 Get-ChildItem Cert:LocalMachineMy -DnsName "*.contoso.com"
创建证书
PowerShell 的 pki 模块提供 cmdlet,可以直接创建自签名证书,无需 MMC:
# 创建自签名证书,存储到本地计算机个人证书存储 New-SelfSignedCertificate -DnsName "webapp.contoso.com" -CertStoreLocation "Cert:LocalMachineMy"
-DnsName:证书对应的域名-CertStoreLocation:证书存储位置- 还可以添加参数设置证书有效期、密钥长度、密钥用法等:
New-SelfSignedCertificate ` -DnsName "api.contoso.com" ` -CertStoreLocation "Cert:LocalMachineMy" ` -KeyLength 2048 ` -KeyExportPolicy Exportable ` -NotAfter (Get-Date).AddYears(2) ` -FriendlyName "API Server Cert"
导入和导出证书
导入证书
# 将 PFX 文件导入证书存储 Import-PfxCertificate -FilePath "C:certsmycert.pfx" -CertStoreLocation "Cert:LocalMachineMy" -Password (ConvertTo-SecureString -String "P@ssw0rd" -AsPlainText -Force)
-FilePath:证书文件路径(PFX 格式)-CertStoreLocation:导入到的存储-Password:证书密码
导出证书
# 导出证书到 PFX 文件 $cert = Get-ChildItem Cert:LocalMachineMy | Where-Object {$_.Subject -like "*webapp.contoso.com*"} Export-PfxCertificate -Cert $cert -FilePath "C:certswebapp.pfx" -Password (ConvertTo-SecureString "P@ssw0rd" -AsPlainText -Force)
删除证书
# 删除指定证书 Remove-Item -Path Cert:LocalMachineMy<Thumbprint>
可以用证书的 Thumbprint 来精确定位
使用 Invoke-Item 打开 MMC
# 打开 MMC 管理证书 Invoke-Item Cert:LocalMachineMy
自动加载“证书”管理单元,便于图形化查看
常见操作场景
- 查找快过期的 SSL 证书
Get-ChildItem Cert:LocalMachineMy -SSLServerAuthentication -ExpiringInDays 60 - 导入新 Web 服务器证书
Import-PfxCertificate -FilePath "C:certsnewweb.pfx" -CertStoreLocation Cert:LocalMachineMy -Password (ConvertTo-SecureString "P@ssw0rd" -AsPlainText -Force) - 批量查找代码签名证书
Get-ChildItem Cert:CurrentUserMy -CodeSigningCert | Format-Table Subject, Thumbprint, NotAfter - 创建自签名开发证书
New-SelfSignedCertificate -DnsName "dev.local" -CertStoreLocation "Cert:CurrentUserMy"
其他驱动器
除了 FileSystem、Registry 和 Cert 驱动器外,PowerShell 还自带了一些用于管理会话和环境的特殊驱动器。它们本质上是由 提供程序 (Provider) 创建的虚拟驱动器,可以像文件夹一样浏览和操作。
Alias 驱动器
- 作用:查看和管理当前 PowerShell 会话中的 别名
- 路径:
Alias: - 示例:
# 列出所有别名 Get-ChildItem Alias: # 查看 Dir 实际对应的 cmdlet Get-Item Alias:Dir # 创建别名 Set-Alias -Name ll Get-ChildItem # 或者等效方式(直接在 Alias 驱动器下) New-Item -Path Alias:ll -Value Get-ChildItem # 删除别名 Remove-Item Alias:ll
注意:没有 Remove-Alias cmdlet,必须用 Remove-Item 或 Clear-Item。
Env 驱动器
- 作用:查看和管理 Windows 环境变量
- 路径:
Env: - 示例:
# 查看所有环境变量 Get-ChildItem Env: # 获取 PATH 环境变量 Get-Item Env:Path # 设置新的环境变量(仅对当前会话有效) Set-Item Env:TestVar "HelloWorld" # 永久设置环境变量(需使用 .NET 或 [System.Environment]) [System.Environment]::SetEnvironmentVariable("JAVA_HOME","C:Javajdk17","User")
实际应用:自动化脚本里修改 PATH、JAVA_HOME 等。
- 话级修改:只在当前 PowerShell 窗口有效。
- 永久修改:需要调用 .NET 或注册表(写入
HKCU:Environment或HKLM:SYSTEMCurrentControlSetControlSession ManagerEnvironment)。
实际案例
设置临时环境变量(只在当前会话)
用途:测试、脚本运行时参数,不污染全局
# 设置临时变量 $env:APP_ENV = "Dev" # 使用变量 Write-Output "Running in $env:APP_ENV mode" # 删除临时变量 Remove-Item Env:APP_ENV
永久设置环境变量
用途:配置开发环境(Java、Python、Go、Node.js 等)
# 为当前用户设置 JAVA_HOME [System.Environment]::SetEnvironmentVariable("JAVA_HOME", "C:Javajdk17", "User") # 为所有用户设置 [System.Environment]::SetEnvironmentVariable("JAVA_HOME", "C:Javajdk17", "Machine")
需要重新启动会话才能生效。
临时修改 PATH
用途:让脚本使用特定工具,不污染全局 PATH
# 临时在 PATH 前加工具路径 $env:Path = "C:Toolsbin;$env:Path" # 确认工具生效 where.exe mytool.exe
跨进程传递参数
用途:CI/CD、子进程调用脚本时传参
# 设置环境变量 $env:MY_TOKEN = "123456" # 子进程继承环境变量 Start-Process powershell -ArgumentList "-Command echo `$env:MY_TOKEN"
使用环境变量存放敏感信息
用途:避免硬编码密码/API Key
# 设置临时 API Key $env:API_KEY = "my-secret-token" # 使用 API Key 调用接口 Invoke-RestMethod "https://api.example.com/data" -Headers @{ Authorization = "Bearer $env:API_KEY" }
环境配置脚本
用途:一键配置开发环境,便于迁移
# setup-env.ps1 $env:JAVA_HOME = "C:Javajdk17" $env:Path = "$env:JAVA_HOMEbin;$env:Path" Write-Output "Environment configured. JAVA_HOME=$env:JAVA_HOME"
用户执行:
.setup-env.ps1
清理变量
用途:避免污染环境,防止脚本间冲突
if (Test-Path Env:MY_TEMP_VAR) { Remove-Item Env:MY_TEMP_VAR }
CI/CD 管道常见用法
# 在 CI 流水线里设置构建版本号 $env:BUILD_VERSION = "1.0.$(Get-Date -Format yyyyMMddHHmm)" # 打包时引用 dotnet build /p:Version=$env:BUILD_VERSION
Function 驱动器
- 作用:查看和管理当前 PowerShell 会话中的 函数
- 路径:
Function: - 示例:
# 列出所有函数 Get-ChildItem Function: # 查看某个函数的定义 Get-Item Function:Get-Process | Format-List Definition # 定义新函数(两种方式) Function Say-Hello { "Hello PowerShell" } # 或者 New-Item Function:Say-Hello -Value { "Hello PowerShell" } # 删除函数 Remove-Item Function:Say-Hello
Variable 驱动器
- 作用:查看和管理当前会话中的 变量
- 路径:
Variable: - 示例:
# 查看所有变量 Get-ChildItem Variable: # 查看特定变量 Get-Item Variable:PSVersionTable # 新建变量 New-Item Variable:MyVar -Value "PowerShell Rocks" # 删除变量 Remove-Item Variable:MyVar
WSMan 驱动器
- 作用:管理 WS-Management 配置(WinRM 设置)
- 路径:
WSMan: - 示例:
# 查看本地计算机 WSMan 配置 Get-ChildItem WSMan:localhost # 查看监听器 Get-ChildItem WSMan:localhostListener # 创建新的 WSMan 监听器 New-Item -Path WSMan:localhostListener -Address * -Transport HTTP
额外驱动器(来自模块/角色)
Active Directory (AD)
- 路径:
AD:(需要安装 RSAT 工具和 ActiveDirectory 模块) - 管理对象:用户、组、计算机、OU 等
- 示例:
# 查看 AD 根目录 Get-ChildItem AD: # 查看所有 OU Get-ChildItem AD:contoso.comOU=Users
IIS
- 路径:
IIS:(需要安装 IIS 和 WebAdministration 模块) - 管理对象:站点、应用程序池、虚拟目录
- 示例:
# 查看 IIS 配置 Get-ChildItem IIS:Sites # 新建站点 New-Item IIS:SitesMySite -bindings @{protocol="http";bindingInformation="*:8080:"} -physicalPath "C:inetpubmysite"
动态参数
像文件系统那样,这些驱动器也可能有 动态参数(只在特定 Provider 下生效)。
例如:
- Alias 提供程序:支持
-Options参数,可以设置别名属性(是否可覆盖、是否只读等) - Registry 提供程序:支持
-Type参数(REG_SZ, REG_DWORD 等) - Cert 提供程序:支持
-ExpiringInDays,-DnsName等
可以通过以下命令确认驱动器背后的提供程序:
Get-PSDrive
查看提供程序帮助:
Get-Help about_Alias_Provider