目录
- PowerShell 提供程序和 PowerShell 驱动器
- PowerShell 提供程序
- 使用PowerShell 驱动器
- 处理 PowerShell 驱动器位置
- 管理文件系统
- 管理注册表
- 获取注册表项
- 获取注册表值
- 创建或修改注册表值
- 删除注册表项和值
- 使用事务管理注册表
- 实际案例
- 使用证书
- 查看证书
- 创建证书
- 导入和导出证书
- 删除证书
- 使用 Invoke-Item 打开 MMC
- 常见操作场景
- 其他驱动器
- Alias 驱动器
- Env 驱动器
- Function 驱动器
- Variable 驱动器
- WSMan 驱动器
- 额外驱动器(来自模块/角色)
- 动态参数
PowerShell 提供程序和 PowerShell 驱动器
PowerShell 提供程序
提供程序 = 把不同的数据存储抽象成“虚拟驱动器”来统一管理。
提供程序是一种“适配器”,它把不同的数据存储(文件系统、注册表、证书存储等)映射成类似文件系统的导航结构,让你可以用 cd、dir、ls、Get-ChildItem 等命令像操作文件夹一样去操作。
查看当前系统的提供程序输出如下:(不一定是下面这些,有的机器都有变化)
NameCapabilitiesDrivesFileSystemFilter, ShouldProcess, CredentialsC, D, ....RegistryShouldProcess, Transactions, ExpandWildcardsHKLM, HKCUCertificateFilter, ShouldProcess, Include, ExcludeCertAliasShouldProcessAliasFunctionShouldProcessFunctionVariableShouldProcessVariableEnvironmentShouldProcessEnv先看最直观的效果:
提供程序路径前缀用途FileSystemC:\, D:\磁盘目录文件管理RegistryHKLM:\, HKCU:\操作注册表CertificateCert:\管理证书AliasAlias:\查看和修改命令别名FunctionFunction:\查看函数VariableVariable:\管理变量EnvironmentEnv:\管理环境变量它统一了操作方式,下面这个才是我们需要记住的,就是Get-ChildItem去查看很多不同的类型
无论是文件、注册表、证书还是变量,你都可以用类似的命令操作:- # 查看文件夹
- 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 → 支持事务操作(例如注册表操作可以回滚)。
例子:- # 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
可通过运行以下命令来查看此帮助文件的内容:- Get-Help about_FileSystem_Provider
复制代码 再者:获取注册表提供程序的帮助信息- Get-Help about_Registry_Provider
复制代码 以此类推,把中间的改成你要获取的 "提供程序" 名字即可- Get-Help about_YourName_Provider
复制代码 使用PowerShell 驱动器
查看 PowerShell 驱动器NameProviderRootCurrentLocationCFileSystemC:|Users\AdminHKCURegistryHKEY_CURRENT_USERHKLMRegistryHKEY_LOCAL_MACHINEEnvEnvironmentCertCertificateAliasAliasVariableVariable下表介绍了与常用 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:(管理远程连接配置)
处理 PowerShell 驱动器位置
驱动器位置的命令
命令描述Get-Location显示当前工作位置。Set-Location设置当前工作位置。Push-Location将位置添加到位置堆栈的顶部。Pop-Location将当前位置更改为位置堆栈顶部的位置。管理文件系统
PowerShell 提供了 文件系统驱动器(PSDrive)和 文件系统提供程序(FileSystem Provider),可以用 cmdlet 来管理文件和文件夹,同时也保留了命令提示符的别名,让 cmd.exe 用户可以快速上手。
别名与 cmdlet 对应关系
cmd.exe 命令PowerShell 别名对应 cmdlet说明DirDirGet-ChildItem列出目录和文件CdCdSet-Location切换目录Md / MkDirMdNew-Item创建新文件夹Rd / RmDirRdRemove-Item删除文件夹DelDelRemove-Item删除文件CopyCopyCopy-Item复制文件/文件夹MoveMoveMove-Item移动文件/文件夹RenRenRename-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:\TestFolder\example.txt" -ItemType File
- # 使用别名
- md C:\TestFolder2
复制代码
- -ItemType 可以是 File 或 Directory。
- 如果路径中包含不存在的父目录,需要先创建父目录,或者使用 -Force。
删除文件和文件夹- # 删除文件
- Remove-Item -Path "C:\TestFolder\example.txt"
- # 删除文件夹及其子文件
- Remove-Item -Path "C:\TestFolder" -Recurse
- # 强制删除(跳过确认)
- Remove-Item -Path "C:\TestFolder" -Recurse -Force
复制代码
- -Recurse 删除文件夹下所有内容。
- -Force 可以删除隐藏文件、只读文件或跳过确认。
查找和枚举文件/文件夹- # 获取单个文件或文件夹
- 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.组合管道操作- # 获取所有 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)就像文件夹里的文件属性。
驱动器注册表分支说明HKLMHKEY_LOCAL_MACHINE系统范围的配置,影响所有用户HKCUHKEY_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:\SOFTWARE\Microsoft\Windows\CurrentVersion
复制代码 返回的是注册表项对象(KeyInfo),可以进一步操作或管道传递。
获取注册表值
注册表值类似文件夹里的属性,用 Get-ItemProperty 或 Get-ItemPropertyValue 访问:- # 获取指定注册表项下所有值
- Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
- # 获取特定值的内容
- Get-ItemPropertyValue HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run -Name WindowsDefender
复制代码
- -Name 指定具体值名
- 返回值数据(ValueData)而不是对象
创建或修改注册表值
使用 New-ItemProperty 或 Set-ItemProperty:- # 创建新的注册表值
- New-ItemProperty -Path HKCU:\Software\TestApp -Name "Setting1" -Value "Enabled" -PropertyType String
- # 修改已有注册表值
- Set-ItemProperty -Path HKCU:\Software\TestApp -Name "Setting1" -Value "Disabled"
复制代码 -PropertyType 对应注册表数据类型:
PowerShell 类型注册表类型StringREG_SZExpandStringREG_EXPAND_SZBinaryREG_BINARYDWordREG_DWORDMultiStringREG_MULTI_SZQWordREG_QWORD删除注册表项和值
- # 删除注册表值
- Remove-ItemProperty -Path HKCU:\Software\TestApp -Name "Setting1"
- # 删除注册表项及其子项
- Remove-Item -Path HKCU:\Software\TestApp -Recurse
复制代码
- -Recurse 删除所有子键和值
- 操作注册表之前建议备份,以防误删
- # 备份注册表某路径
- reg export HKCU\Software\TestApp C:\Backup\TestApp.reg
复制代码 使用事务管理注册表
注册表提供程序支持事务,可以一次执行多个操作,要么全部成功,要么全部回滚,避免半成品状态:- # 开启事务
- 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 参数表示该操作在事务中执行
- 有助于批量修改注册表而不产生部分更新
实际案例
批量修改软件设置- $apps = "App1","App2"
- foreach ($app in $apps) {
- Set-ItemProperty HKCU:\Software\$app -Name "AutoStart" -Value 1
- }
复制代码 检测并删除启动项- $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"
- }
- }
复制代码 创建事务批量修改注册表值- 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:\CurrentUser\My当前用户的个人证书存储Cert:\LocalMachine\My本地计算机的个人证书存储也可以访问其他标准存储:
- Root:受信任根证书
- CA:受信任的证书颁发机构
- TrustedPeople:受信任的人
查看证书
- # 查看当前用户个人证书
- Get-ChildItem Cert:\CurrentUser\My
- # 查看本地计算机个人证书
- Get-ChildItem Cert:\LocalMachine\My
复制代码 使用证书提供程序的专用动态参数进行筛选:
参数说明-CodeSigningCert获取可用于代码签名的证书-DocumentEncryptionCert获取用于文档加密的证书-DnsName获取 DNSNameList 包含指定域名的证书(支持通配符)-EKU获取具有指定增强密钥用法 (EKU) 的证书-ExpiringInDays获取将在指定天数内过期的证书-SSLServerAuthentication获取 SSL 服务器证书示例:- # 获取将在 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:- # 创建自签名证书,存储到本地计算机个人证书存储
- New-SelfSignedCertificate -DnsName "webapp.contoso.com" -CertStoreLocation "Cert:\LocalMachine\My"
复制代码
- -DnsName:证书对应的域名
- -CertStoreLocation:证书存储位置
- 还可以添加参数设置证书有效期、密钥长度、密钥用法等:
- New-SelfSignedCertificate `
- -DnsName "api.contoso.com" `
- -CertStoreLocation "Cert:\LocalMachine\My" `
- -KeyLength 2048 `
- -KeyExportPolicy Exportable `
- -NotAfter (Get-Date).AddYears(2) `
- -FriendlyName "API Server Cert"
复制代码 导入和导出证书
导入证书- # 将 PFX 文件导入证书存储
- Import-PfxCertificate -FilePath "C:\certs\mycert.pfx" -CertStoreLocation "Cert:\LocalMachine\My" -Password (ConvertTo-SecureString -String "P@ssw0rd" -AsPlainText -Force)
复制代码
- -FilePath:证书文件路径(PFX 格式)
- -CertStoreLocation:导入到的存储
- -Password:证书密码
导出证书- # 导出证书到 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)
复制代码 删除证书
- # 删除指定证书
- Remove-Item -Path Cert:\LocalMachine\My\<Thumbprint>
复制代码 可以用证书的 Thumbprint 来精确定位
使用 Invoke-Item 打开 MMC
- # 打开 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 " @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:
- 示例:
- # 列出所有别名
- 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:\Java\jdk17","User")
复制代码 实际应用:自动化脚本里修改 PATH、JAVA_HOME 等。
- 话级修改:只在当前 PowerShell 窗口有效。
- 永久修改:需要调用 .NET 或注册表(写入 HKCU:\Environment 或 HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment)。
实际案例
设置临时环境变量(只在当前会话)
用途:测试、脚本运行时参数,不污染全局- # 设置临时变量
- $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:\Java\jdk17", "User")
- # 为所有用户设置
- [System.Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\Java\jdk17", "Machine")
复制代码 需要重新启动会话才能生效。
临时修改 PATH
用途:让脚本使用特定工具,不污染全局 PATH- # 临时在 PATH 前加工具路径
- $env:Path = "C:\Tools\bin;$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:\Java\jdk17"
- $env:Path = "$env:JAVA_HOME\bin;$env:Path"
- Write-Output "Environment configured. JAVA_HOME=$env:JAVA_HOME"
复制代码 用户执行:清理变量
用途:避免污染环境,防止脚本间冲突- 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:\localhost\Listener
- # 创建新的 WSMan 监听器
- New-Item -Path WSMan:\localhost\Listener -Address * -Transport HTTP
复制代码 额外驱动器(来自模块/角色)
Active Directory (AD)
- 路径:AD:(需要安装 RSAT 工具和 ActiveDirectory 模块)
- 管理对象:用户、组、计算机、OU 等
- 示例:
- # 查看 AD 根目录
- Get-ChildItem AD:
- # 查看所有 OU
- Get-ChildItem AD:\contoso.com\OU=Users
复制代码 IIS
- 路径:IIS:(需要安装 IIS 和 WebAdministration 模块)
- 管理对象:站点、应用程序池、虚拟目录
- 示例:
- # 查看 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 等
可以通过以下命令确认驱动器背后的提供程序:
查看提供程序帮助:- Get-Help about_Alias_Provider
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |