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