PowerShell 提供程序和驱动器(七)

目录

PowerShell 提供程序和 PowerShell 驱动器

PowerShell 提供程序

提供程序 = 把不同的数据存储抽象成"虚拟驱动器"来统一管理。

提供程序 是一种"适配器",它把不同的数据存储(文件系统、注册表、证书存储等)映射成类似文件系统的导航结构 ,让你可以用 cddirlsGet-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 执行与项关联的默认操作。

驱动器的特点

  1. 名称唯一
    • 可以是一个字母(如 C),也可以是多个字符(如 HKCUEnv)。
    • 用于路径时要加冒号,比如 C:HKCU:Env:
  2. 依赖提供程序
    • 驱动器继承其底层提供程序的所有功能(筛选、事务、凭据等)。
  3. 默认驱动器 (新会话必有):
    • FileSystem 驱动器 :如 C:
    • 注册表驱动器HKLM:HKCU:
    • 特殊存储驱动器Variable:Function:Alias:
    • 环境变量驱动器Env:
    • 证书驱动器Cert:
    • WSMan 驱动器WSMan:(管理远程连接配置)

处理 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 的核心命令,用于切换当前工作目录。
  • 别名 cdchdir 都可以替代它。

创建文件和文件夹

powershell 复制代码
# 创建文件夹
New-Item -Path "C:\TestFolder" -ItemType Directory

# 创建文件
New-Item -Path "C:\TestFolder\example.txt" -ItemType File

# 使用别名
md C:\TestFolder2
  • -ItemType 可以是 FileDirectory
  • 如果路径中包含不存在的父目录,需要先创建父目录,或者使用 -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-ItemGet-ChildItem 访问:

powershell 复制代码
# 获取某个路径下的所有子项
Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion

返回的是注册表项对象(KeyInfo),可以进一步操作或管道传递。

获取注册表值

注册表值类似文件夹里的属性,用 Get-ItemPropertyGet-ItemPropertyValue 访问:

powershell 复制代码
# 获取指定注册表项下所有值
Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

# 获取特定值的内容
Get-ItemPropertyValue HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run -Name WindowsDefender
  • -Name 指定具体值名
  • 返回值数据(ValueData)而不是对象

创建或修改注册表值

使用 New-ItemPropertySet-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

自动加载"证书"管理单元,便于图形化查看

常见操作场景

  1. 查找快过期的 SSL 证书
    Get-ChildItem Cert:\LocalMachine\My -SSLServerAuthentication -ExpiringInDays 60
  2. 导入新 Web 服务器证书
    Import-PfxCertificate -FilePath "C:\certs\newweb.pfx" -CertStoreLocation Cert:\LocalMachine\My -Password (ConvertTo-SecureString "P@ssw0rd" -AsPlainText -Force)
  3. 批量查找代码签名证书
    Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert | Format-Table Subject, Thumbprint, NotAfter
  4. 创建自签名开发证书
    New-SelfSignedCertificate -DnsName "dev.local" -CertStoreLocation "Cert:\CurrentUser\My"

其他驱动器

除了 FileSystemRegistryCert 驱动器外,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-ItemClear-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:\EnvironmentHKLM:\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