共用方式為


about_Windows_PowerShell_Compatibility

簡短描述

描述 PowerShell 7 的 Windows PowerShell 相容性功能。

詳細描述

除非模組指令清單指出模組與 PowerShell Core 相容,否則資料夾中的模組 %windir%\system32\WindowsPowerShell\v1.0\Modules 會由 Windows PowerShell 相容性功能載入背景 Windows PowerShell 5.1 進程。

使用相容性功能

使用 Windows PowerShell 相容性功能匯入第一個模組時,PowerShell 會建立名為 的遠端會話,該 WinPSCompatSession 會話會在背景 Windows PowerShell 5.1 進程中執行。 當相容性功能匯入第一個模組時,PowerShell 會建立此程式。 當移除最後一個模組(使用 Remove-Module)或 PowerShell 進程結束時,進程就會關閉。

在工作階段中載入的 WinPSCompatSession 模組是透過隱含遠端處理來使用,並反映在目前的PowerShell會話中。 這是用於PowerShell作業的相同傳輸方法。

將模組匯入 WinPSCompatSession 會話時,隱含遠端會在使用者的 $env:Temp 目錄中產生 Proxy 模組,並將此 Proxy 模組匯入目前的 PowerShell 會話。 Proxy 模組可讓 PowerShell 偵測模組是否已使用 Windows PowerShell 相容性功能載入模組。

建立會話之後,它就可用於無法正確在還原串行化對象上運作的作業。 整個管線會在 Windows PowerShell 中執行,而且只會傳回最終結果。 例如:

$s = Get-PSSession -Name WinPSCompatSession
Invoke-Command -Session $s -ScriptBlock {
  "Running in Windows PowerShell version $($PSVersionTable.PSVersion)"
}

您可以使用兩種方式叫用相容性功能:

  • 使用 UseWindowsPowerShell 參數明確地匯入模組

    Import-Module -Name ScheduledTasks -UseWindowsPowerShell
    
  • 透過模組名稱、路徑或透過命令探索自動載入,以隱含方式匯入 Windows PowerShell 模組。

    Import-Module -Name ServerManager
    Get-AppLockerPolicy -Local
    

    如果尚未載入,當您執行 Get-AppLockerPolicy時,就會自動載入 AppLocker 模組。

Windows PowerShell 兼容性會封鎖載入 PowerShell 組態檔中設定中列出的 WindowsPowerShellCompatibilityModuleDenyList 模組。

這個設定預設值為:

"WindowsPowerShellCompatibilityModuleDenyList":  [
   "PSScheduledJob","BestPractices","UpdateServices"
]

管理隱含模組載入

若要停用 Windows PowerShell 相容性功能的隱含匯入行為,請使用 DisableImplicitWinCompat PowerShell 組態檔中的 設定。 此設定可以新增至 powershell.config.json 檔案。 如需詳細資訊,請參閱 about_PowerShell_Config

此範例示範如何建立組態檔,以停用 Windows PowerShell 相容性的隱含模組載入功能。

$ConfigPath = "$PSHOME\DisableWinCompat.powershell.config.json"
$ConfigJSON = ConvertTo-Json -InputObject @{
  "DisableImplicitWinCompat" = $true
  "Microsoft.PowerShell:ExecutionPolicy" = "RemoteSigned"
}
$ConfigJSON | Out-File -Force $ConfigPath
pwsh -settingsFile $ConfigPath

如需模組相容性的詳細資訊,請參閱 PowerShell 7 模組相容性 清單。

管理 Cmdlet clobbering

Windows PowerShell 相容性功能會使用隱含遠端功能,以相容性模式載入模組。 結果是模組導出的命令優先於目前 PowerShell 7 工作階段中相同名稱的命令。 在 PowerShell 7.0.0 版本中,這包括隨附於 PowerShell 的核心模組。

在 PowerShell 7.1 中,行為已變更,因此下列核心 PowerShell 模組不會受到 clobbered:

  • Microsoft.PowerShell.ConsoleHost
  • Microsoft.PowerShell.Diagnostics
  • Microsoft.PowerShell.Host
  • Microsoft.PowerShell.Management
  • Microsoft.PowerShell.Security
  • Microsoft.PowerShell.Utility
  • Microsoft.WSMan.Management

PowerShell 7.1 也新增了從相容性模式排除更多模組的功能。

您可以將設定新增 WindowsPowerShellCompatibilityNoClobberModuleList 至 PowerShell 組態檔。 這個設定的值是以逗號分隔的模組名稱清單。 這個設定預設值為:

"WindowsPowerShellCompatibilityNoClobberModuleList": [ ]

限制

Windows PowerShell 兼容性功能:

  1. 只能在 Windows 電腦上本機運作
  2. 需要 Windows PowerShell 5.1
  3. 在串行化 Cmdlet 參數和傳回值上運作,而不是在即時對象上運作
  4. 共用匯入 Windows PowerShell 遠端會話之所有模組的單一 Runspace

暫存檔案

Windows PowerShell 兼容性功能會使用隱含遠端功能,讓 Windows PowerShell 5.1 模組可在 PowerShell 7 中使用。 隱含遠端會在目錄中建立暫存盤 $env:Temp 。 每個 Proxy 模組都會儲存在具有下列命名慣例的個別資料夾中:

  • remoteIpMoProxy_<ModuleName>_<ModuleVersion>_localhost_<SessionGuid>.

當您從會話中移除最後一個 Proxy 模組或關閉工作階段時,PowerShell 會移除暫存盤。

另請參閱