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 进程中运行。 当兼容性功能导入第一个模块时,将创建此过程。 使用 () 删除 Remove-Module
最后一个此类模块时或 PowerShell 进程退出时,进程将关闭。
会话中加载的 WinPSCompatSession
模块通过隐式远程处理使用,并反映在当前 PowerShell 会话中。 这是用于 PowerShell 作业的相同传输方法。
将模块导入会话时 WinPSCompatSession
,隐式远程处理会在用户的 $env:Temp
目录中生成一个代理模块,并将此代理模块导入到当前 PowerShell 会话中。 这允许 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 模块不会被混杂:
- 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兼容性功能:
- 仅在 Windows 计算机上本地工作
- 要求Windows PowerShell 5.1
- 对序列化的 cmdlet 参数和返回值进行操作,而不是对实时对象进行操作
- 导入到Windows PowerShell远程处理会话的所有模块都共享同一个运行空间。
关键字
about_Windows_PowerShell_Compatibility