Stories

Detail Return Return

PowerShell 提供程序和驅動器(七) - Stories Detail

目錄
  • PowerShell 提供程序和 PowerShell 驅動器
    • PowerShell 提供程序
      • 查看提供程序的幫助文件
    • 使用PowerShell 驅動器
        • 處理 PowerShell 驅動器位置
        • 管理文件系統
      • 管理註冊表
        • 獲取註冊表項
        • 獲取註冊表值
        • 創建或修改註冊表值
        • 刪除註冊表項和值
        • 使用事務管理註冊表
        • 實際案例
      • 使用證書
        • 查看證書
        • 創建證書
        • 導入和導出證書
        • 刪除證書
        • 使用 Invoke-Item 打開 MMC
        • 常見操作場景
      • 其他驅動器
        • Alias 驅動器
        • Env 驅動器
          • 實際案例
        • Function 驅動器
        • Variable 驅動器
        • WSMan 驅動器
        • 額外驅動器(來自模塊/角色)
        • 動態參數

PowerShell 提供程序和 PowerShell 驅動器

PowerShell 提供程序

提供程序 = 把不同的數據存儲抽象成“虛擬驅動器”來統一管理。

提供程序是一種“適配器”,它把不同的數據存儲(文件系統、註冊表、證書存儲等)映射成類似文件系統的導航結構,讓你可以用 cddirlsGet-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:\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 驅動器

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 風格。

移動目錄

# 使用絕對路徑
Set-Location C:\Users

# 使用相對路徑
Set-Location Temp

# 查看當前路徑
Get-Location
  • Set-Location 是 PowerShell 的核心命令,用於切換當前工作目錄。
  • 別名 cdchdir 都可以替代它。

創建文件和文件夾

# 創建文件夾
New-Item -Path "C:\TestFolder" -ItemType Directory

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

# 使用別名
md C:\TestFolder2
  • -ItemType 可以是 FileDirectory
  • 如果路徑中包含不存在的父目錄,需要先創建父目錄,或者使用 -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)就像文件夾裏的文件屬性。

驅動器 註冊表分支 説明
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-ItemGet-ChildItem 訪問:

# 獲取某個路徑下的所有子項
Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion

返回的是註冊表項對象(KeyInfo),可以進一步操作或管道傳遞。

獲取註冊表值

註冊表值類似文件夾裏的屬性,用 Get-ItemPropertyGet-ItemPropertyValue 訪問:

# 獲取指定註冊表項下所有值
Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

# 獲取特定值的內容
Get-ItemPropertyValue HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run -Name WindowsDefender
  • -Name 指定具體值名
  • 返回值數據(ValueData)而不是對象

創建或修改註冊表值

使用 New-ItemPropertySet-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 類型 註冊表類型
String REG_SZ
ExpandString REG_EXPAND_SZ
Binary REG_BINARY
DWord REG_DWORD
MultiString REG_MULTI_SZ
QWord REG_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:
  • 常見存儲位置:↓↓
路徑 説明
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

自動加載“證書”管理單元,便於圖形化查看

常見操作場景

  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:
  • 示例:
# 列出所有別名
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:
  • 示例:
# 查看所有環境變量
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)。

實際案例

設置臨時環境變量(只在當前會話)
用途:測試、腳本運行時參數,不污染全局

# 設置臨時變量
$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"

用户執行:

.\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:\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-PSDrive

查看提供程序幫助:

Get-Help about_Alias_Provider
user avatar mjhz Avatar
Favorites 1 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.