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兼容性功能:

  1. 仅在 Windows 计算机上本地工作
  2. 要求Windows PowerShell 5.1
  3. 对序列化的 cmdlet 参数和返回值进行操作,而不是对实时对象进行操作
  4. 导入到Windows PowerShell远程处理会话的所有模块都共享同一个运行空间。

关键字

about_Windows_PowerShell_Compatibility

另请参阅