Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Краткое описание
Различные выпуски PowerShell выполняются в разных базовых средах выполнения.
Длинное описание
В PowerShell 5.1 существует несколько выпусков PowerShell, которые выполняются в другой среде выполнения .NET. По состоянию на PowerShell 6.0 существует два выпуска PowerShell:
- desktop, который работает в .NET Framework. PowerShell 4 и ниже, а также PowerShell 5.1 доступны для полнофункционированных выпусков Windows, таких как Windows Desktop, Windows Server, Windows Server Core и большинство других операционных систем Windows. Это исходный выпуск PowerShell и включен в установку операционной системы по умолчанию.
- Core, которая выполняется в .NET Core. PowerShell 6.0 и более поздних версий устанавливается параллельно с более ранними выпусками PowerShell в полнофункциональный выпуск Windows, некоторые выпуски Windows с ограниченным объемом использования, такие как Windows Nano Server и Windows IoT, или на платформах, отличных от Windows, таких как Linux и macOS.
Так как выпуск PowerShell соответствует своей среде выполнения .NET, это основной индикатор совместимости API .NET и модуля PowerShell; некоторые API,типы или методы .NET недоступны в средах выполнения .NET, и это влияет на сценарии и модули PowerShell, которые зависят от них.
Автоматическая $PSEdition переменная
В PowerShell 5.1 и более поздних версиях вы можете узнать, какой выпуск выполняется с помощью автоматической переменной $PSEdition:
$PSEdition
Core
В PowerShell 4 и ниже эта переменная не существует.
$PSEdition значение NULL должно рассматриваться так же, как и значение Desktop.
Выпуск в $PSVersionTable
Автоматическая переменная $PSVersionTable также имеет свойство PSEdition в PowerShell 5.1 и более поздних версиях:
$PSVersionTable
Name Value
---- -----
PSVersion 7.3.9
PSEdition Core
GitCommitId 7.3.9
OS Microsoft Windows 10.0.22621
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
Поле PSEdition имеет то же значение, что и $PSEdition автоматическая переменная.
CompatiblePSEditions Поле манифеста модуля
Модули PowerShell могут объявлять, какие выпуски PowerShell они совместимы с помощью поля CompatiblePSEditions манифеста модуля.
Например, манифест модуля, объявляющий совместимость с Desktop и Core выпусками PowerShell:
@{
ModuleVersion = '1.0'
FunctionsToExport = @('Test-MyModule')
CompatiblePSEditions = @('Desktop', 'Core')
}
Пример манифеста модуля с совместимостью только Desktop:
@{
ModuleVersion = '1.0'
FunctionsToExport = @('Test-MyModule')
CompatiblePSEditions = @('Desktop')
}
Опущение поля CompatiblePSEditions из манифеста модуля будет иметь тот же эффект, что и настройка Desktop, так как модули, созданные до появления этого поля, были неявно написаны для этого выпуска.
Для модулей, не отправленных в состав Windows (т. е. модулей, которые вы пишете или устанавливаете из коллекции), это поле является информационным только; PowerShell не изменяет поведение на основе поля CompatiblePSEditions, но предоставляет его в объекте PSModuleInfo (возвращенном Get-Module) для собственной логики:
$newModuleManifestSplat = @{
Path = '.\TestModuleWithEdition.psd1'
CompatiblePSEditions = 'Desktop', 'Core'
PowerShellVersion = '5.1'
}
New-ModuleManifest @newModuleManifestSplat
$ModuleInfo = Test-ModuleManifest -Path .\TestModuleWithEdition.psd1
$ModuleInfo.CompatiblePSEditions
Desktop
Core
Заметка
Поле модуля CompatiblePSEditions совместимо только с PowerShell 5.1 и выше. В том числе это поле приведет к несовместимости модуля с PowerShell 4 и ниже. Так как поле является чисто информационным, оно может быть безопасно опущено в более поздних версиях PowerShell.
В PowerShell 6.1 Get-Module -ListAvailable обновили форматировщик, чтобы отобразить совместимость выпусков каждого модуля:
Get-Module -ListAvailable
Directory: C:\Users\me\Documents\PowerShell\Modules
ModuleType Version Name PSEdition ExportedCommands
---------- ------- ---- --------- ----------------
Script 1.4.0 Az Core,Desk
Script 1.3.1 Az.Accounts Core,Desk {Disable-AzDataCollection, Disable-AzContextAutosave, E...
Script 1.0.1 Az.Aks Core,Desk {Get-AzAks, New-AzAks, Remove-AzAks, Import-AzAksCreden...
...
Script 4.4.0 Pester Desk {Describe, Context, It, Should...}
Script 1.18.0 PSScriptAnalyzer Desk {Get-ScriptAnalyzerRule, Invoke-ScriptAnalyzer, Invoke-...
Script 1.0.0 WindowsCompatibility Core {Initialize-WinSession, Add-WinFunction, Invoke-WinComm...
Совместимость выпусков для модулей, которые будут отправляться в составе Windows
Для модулей, которые входят в состав Windows (или устанавливаются как часть роли или компонента), PowerShell 6.1 и выше обрабатывают поле CompatiblePSEditions по-разному. Такие модули находятся в каталоге системных модулей Windows PowerShell (%windir%\System\WindowsPowerShell\v1.0\Modules).
Для модулей, загруженных из этого каталога или найденных в этом каталоге, PowerShell 6.1 и выше использует поле CompatiblePSEditions, чтобы определить, совместим ли модуль с текущим сеансом и ведет себя соответствующим образом.
При использовании Import-Module модуль без Core в CompatiblePSEditions не будет импортирован, и появится ошибка:
Import-Module BitsTransfer
Import-Module : Module 'C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\BitsTransfer\BitsTransfer.psd1'
does not support current PowerShell edition 'Core'. Its supported editions are 'Desktop'. Use 'Import-Module
-SkipEditionCheck' to ignore the compatibility of this module.
At line:1 char:1
+ Import-Module BitsTransfer
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ResourceUnavailable: (C:\WINDOWS\system32\u2026r\BitsTransfer.psd1:String)
[Import-Module], InvalidOperationException
+ FullyQualifiedErrorId : Modules_PSEditionNotSupported,Microsoft.PowerShell.Commands.ImportModuleCommand
При использовании Get-Module -ListAvailable модули без Core в CompatiblePSEditions не будут отображаться:
Get-Module -ListAvailable BitsTransfer
# No output
В обоих случаях параметр коммутатора -SkipEditionCheck можно использовать для переопределения этого поведения:
Get-Module -ListAvailable -SkipEditionCheck BitsTransfer
Directory: C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules
ModuleType Version Name PSEdition ExportedCommands
---------- ------- ---- --------- ----------------
Manifest 2.0.0.0 BitsTransfer Desk {Add-BitsFile, Complete-BitsTransfer, Get-BitsTransfer,...
Предупреждение
Import-Module -SkipEditionCheck может оказаться успешным для модуля, но при использовании этого модуля возникает риск возникновения несовместимости позже; При первоначальной загрузке модуля команда может вызвать несовместимый API и сбой спонтанно.
Создание модулей PowerShell для кросс-совместимости выпусков
При написании модуля PowerShell для целевых Desktop и Core выпусков PowerShell можно сделать так, чтобы обеспечить совместимость между выпусками.
Единственным верным способом подтверждения и постоянной проверки совместимости является написание тестов для скрипта или модуля и их запуск во всех версиях и выпусках PowerShell, с которыми требуется совместимость. Рекомендуемая платформа тестирования для этого — Пестер.
Скрипт PowerShell
Как язык PowerShell работает одинаково между выпусками; это командлеты, модули и API .NET, которые влияют на совместимость выпусков.
Как правило, сценарии, работающие в PowerShell 6.1 и более поздних версиях, будут работать с Windows PowerShell 5.1, но существуют некоторые исключения.
PSScriptAnalyzer версии 1.18+ содержит такие правила, как PSUseCompatibleCommands и PSUseCompatibleTypes, которые могут обнаруживать возможно несовместимое использование команд и API .NET в скриптах PowerShell.
Сборки .NET
Если вы пишете двоичный модуль или модуль, который включает сборки .NET (библиотеки DLL), созданные из исходного кода, необходимо компилироваться в .NET Standard и PowerShell Standard для проверки совместимости api .NET и PowerShell во время компиляции.
Хотя эти библиотеки могут проверить некоторую совместимость во время компиляции, они не смогут перехватывать возможные различия в поведении между выпусками. Для этого необходимо по-прежнему писать тесты.
См. также
PowerShell