Поделиться через


Использование экспериментальных функций в PowerShell

Поддержка экспериментальных функций в PowerShell обеспечивает механизм для сосуществования экспериментальных функций с имеющимися стабильными функциями в модулях PowerShell или PowerShell.

Экспериментальная функция — это функция, в которой проект не завершен. Эта функция доступна пользователям для тестирования и предоставления отзывов о ней. Как только процесс разработки экспериментальной функции будет завершен, изменения на этапе проектирования станут критическими.

Внимание

Экспериментальные функции не предназначены для использования в рабочей среде, так как изменения могут привести к нарушению работы. Экспериментальные функции официально не поддерживаются. Тем не менее мы будем признательны вам за любые отзывы и отчеты об ошибках. Сообщить о проблеме можно в исходном репозитории GitHub.

Дополнительные сведения о включении или отключении этих функций см. в статье Экспериментальные функции.

Жизненный цикл экспериментальных функций

Командлет Get-ExperimentalFeature возвращает все экспериментальные функции, доступные PowerShell. Экспериментальные функции могут поступать из модулей или подсистемы PowerShell. Экспериментальные функции на основе модулей доступны только после импорта модуля. В следующем примере psDesiredStateConfiguration не загружается, поэтому PSDesiredStateConfiguration.InvokeDscResource эта функция недоступна.

Get-ExperimentalFeature
Name                             Enabled Source   Description
----                             ------- ------   -----------
PSCommandNotFoundSuggestion        False PSEngine Recommend potential commands based on fuzzy searc…
PSCommandWithArgs                  False PSEngine Enable `-CommandWithArgs` parameter for pwsh
PSFeedbackProvider                  True PSEngine Replace the hard-coded suggestion framework with …
PSLoadAssemblyFromNativeCode       False PSEngine Expose an API to allow assembly loading from nati…
PSModuleAutoLoadSkipOfflineFiles    True PSEngine Module discovery will skip over files that are ma…
PSSerializeJSONLongEnumAsNumber     True PSEngine Serialize enums based on long or ulong as an nume…
PSSubsystemPluginModel              True PSEngine A plugin model for registering and un-registering…

Используйте командлеты Enable-ExperimentalFeature и Disable-ExperimentalFeature, чтобы включить или отключить функцию. Чтобы это изменение вступило в действие, вам нужно будет запустить новый сеанс PowerShell. Выполните следующую команду, чтобы включить эту функцию PSCommandNotFoundSuggestion :

Enable-ExperimentalFeature PSCommandNotFoundSuggestion
WARNING: Enabling and disabling experimental features do not take effect until next start
of PowerShell.

Когда экспериментальная функция становится основной, она больше не доступна в качестве экспериментальной функции, так как функциональность теперь является частью подсистемы PowerShell или модуля. Например, эта функция стала основной PSAnsiRenderingFileInfo в PowerShell 7.3. Вы автоматически получаете функциональные возможности функции функции.

Примечание.

Некоторые функции имеют требования к конфигурации, такие как переменные предпочтения, которые должны быть заданы, чтобы получить нужные результаты от функции.

Если экспериментальная функция прекращена, эта функция больше не доступна в PowerShell. Например, функция была прекращена PSNativePSPathResolution в PowerShell 7.3.

Доступные функции

В этой статье описываются доступные экспериментальные функции и сведения об их использовании.

Условные обозначения

  • Значок Экспериментальный указывает, что экспериментальная функция доступна в версии PowerShell
  • Значок Основной указывает версию PowerShell, в которой экспериментальная функция стала основной
  • Значок Выведено из использования указывает версию PowerShell, в которой была удалена экспериментальная функция.
Имя. 7.2 7,4 7.5 (предварительная версия)
PSCommandNotFoundSuggestion Экспериментальный Экспериментальный Основной
PSDesiredStateConfiguration.InvokeDscResource Экспериментальный Экспериментальный Экспериментальный
PSNativePSPathResolution Экспериментальный
PSSubsystemPluginModel Экспериментальный Экспериментальный Экспериментальный
PSNativeCommandArgumentPassing Экспериментальный
PSAnsiRenderingFileInfo Экспериментальный
PSLoadAssemblyFromNativeCode Экспериментальный Экспериментальный Экспериментальный
PSNativeCommandErrorActionPreference Основной
PSFeedbackProvider Экспериментальный Экспериментальный
PSModuleAutoLoadSkipOfflineFiles Экспериментальный Основной
PSCommandWithArgs Экспериментальный Основной
PSNativeWindowsTildeExpansion Экспериментальный
PSRedirectToVariable Экспериментальный
PSSerializeJSONLongEnumAsNumber Экспериментальный

PSAnsiRenderingFileInfo

Примечание.

Эта функция стала основной в PowerShell 7.3.

Функции форматирования ANSI добавлены в PowerShell 7.2. Эта функция добавляет $PSStyle.FileInfo элемент и включает цвет определенных типов файлов.

  • $PSStyle.FileInfo.Directory — встроенный элемент, указывающий цвет каталогов
  • $PSStyle.FileInfo.SymbolicLink — встроенный элемент, указывающий цвет символьных ссылок
  • $PSStyle.FileInfo.Executable — Встроенный элемент, указывающий цвет исполняемых файлов.
  • $PSStyle.FileInfo.Extension — Используйте этот элемент для определения цветов для разных расширений файлов. Элемент Расширения изначально включает расширения для файлов архива и PowerShell.

Дополнительные сведения см. в статье about_Automatic_Variables.

PSCommandNotFoundSuggestion

Примечание.

Эта функция стала основной в PowerShell 7.5-preview.5.

Рекомендует потенциальные команды на основе поиска нечетких соответствий после CommandNotFoundException.

PS> get
get: The term 'get' isn't recognized as the name of a cmdlet, function, script file,
or operable program. Check the spelling of the name, or if a path was included, verify
that the path is correct and try again.

Suggestion [4,General]: The most similar commands are: set, del, ft, gal, gbp, gc, gci,
gcm, gdr, gcs.

PSCommandWithArgs

Примечание.

Эта функция стала основной в PowerShell 7.5-preview.5.

Эта функция включает -CommandWithArgs параметр для pwsh. Этот параметр позволяет выполнять команду PowerShell с аргументами. В отличие от -Commandэтого параметра, эта переменная заполняет $args встроенную переменную, которую можно использовать командой.

Первая строка — это команда, а последующие строки, разделенные пробелами, — это аргументы.

Например:

pwsh -CommandWithArgs '$args | % { "arg: $_" }' arg1 arg2

В примере получается следующий вывод.

arg: arg1
arg: arg2

Эта функция добавлена в PowerShell 7.4-preview.2.

PSDesiredStateConfiguration.InvokeDscResource

Эта функция включает компиляцию в MOF в системах, отличных от Windows, и позволяет использовать Invoke-DSCResource без LCM.

Начиная с PowerShell 7.2 модуль PSDesiredStateConfiguration был удален, и эта функция отключена по умолчанию. Чтобы включить эту функцию, необходимо установить модуль PSDesiredStateConfiguration версии 2.0.5 из коллекция PowerShell и включить эту функцию.

DSC версии 3 не имеет этой экспериментальной функции. DSC версии 3 поддерживает Invoke-DSCResource только и не поддерживает компиляцию MOF. Дополнительные сведения см. в разделе PowerShell Desired State Configuration версии 3.

PSFeedbackProvider

При включении этой функции PowerShell использует новый поставщик отзывов, чтобы дать отзыв, когда не удается найти команду. Поставщик отзывов является расширяемым и может быть реализован сторонними модулями. Поставщик отзывов может использоваться другими подсистемами, такими как подсистема прогнозирования, для предоставления прогнозных результатов IntelliSense.

Эта функция включает два встроенных поставщика отзывов:

  • GeneralCommandErrorFeedback обслуживает те же функции предложений, которые существуют сегодня

  • UnixCommandNotFound, доступный в Linux, предоставляет отзывы, аналогичные bash.

    UnixCommandNotFound служит как поставщиком отзывов, так и прогнозатором. Предложение команды, не найденной командой, используется как для предоставления обратной связи, если команда не удается найти в интерактивном запуске, так и для предоставления прогнозных результатов IntelliSense для следующей командной строки.

Эта функция добавлена в PowerShell 7.4-preview.3.

PSLoadAssemblyFromNativeCode

Предоставляет API, позволяющий загружать сборки из машинного кода.

PSModuleAutoLoadSkipOfflineFiles

Примечание.

Эта функция стала основной в PowerShell 7.5-preview.5.

Если эта функция включена, если PSModulePath пользователя содержит папку из поставщика облачных служб, например OneDrive, PowerShell больше не активирует скачивание всех файлов, содержащихся в этой папке. Все файлы, помеченные как не скачанные, пропускаются. Пользователи, использующие поставщики облачных служб для синхронизации модулей между компьютерами, должны пометить папку модуля как закрепленную или эквивалентную для поставщиков, отличных от OneDrive. Пометка папки модуля как закрепленная гарантирует, что файлы всегда хранятся на диске.

Эта функция была добавлена в PowerShell 7.4-preview.1.

PSNativeCommandArgumentPassing

Примечание.

Эта функция стала основной в PowerShell 7.3.

Когда эта экспериментальная функция включена, PowerShell использует свойство ArgumentList объекта StartProcessInfo, а не текущий механизм восстановления строки при вызове собственного исполняемого файла.

Внимание

Новое поведение значительно отличается от текущего. Оно может нарушить выполнение скриптов и задач автоматизации, которые устраняют различные проблемы, возникающие при вызове собственных приложений. Исторически кавычки должны быть экранированы, и невозможно предоставить пустые аргументы в собственном приложении. Используйте маркер остановки синтаксического анализа (--%) или Start-Process командлет для передачи собственного аргумента при необходимости.

Эта функция добавляет новую $PSNativeCommandArgumentPassing переменную предпочтения, которая управляет этим поведением. Эта переменная позволяет выбрать поведение во время выполнения. Возможные значения: Legacy, Standard и Windows. Поведение по умолчанию зависит от платформы. На платформах Windows параметр по умолчанию — Windows это и не windows-платформы по умолчанию Standard.

Legacy является историческим поведением. Поведение Windows и Standard режим одинаковы, кроме того, в Windows режиме вызовы следующих файлов автоматически используют Legacy передаваемые аргументы стиля.

  • cmd.exe
  • find.exe
  • cscript.exe
  • wscript.exe
  • sqlcmd.exe — добавлено в PowerShell 7.3.1
  • заканчивается на .bat
  • заканчивается на .cmd
  • заканчивается на .js
  • заканчивается на .vbs
  • заканчивается на .wsf

$PSNativeCommandArgumentPassing Если задано значение "ЛибоLegacy"Standard, средство синтаксического анализа не проверяет наличие этих файлов.

Поведение по умолчанию зависит от платформы. На платформах Windows значение по умолчанию — Windows, на платформах, отличных от Windows — Standard.

Примечание.

В следующих примерах используется TestExe.exe средство. Вы можете создать из TestExe исходного кода. См. раздел TestExe в исходном репозитории PowerShell.

Это изменение привело к появлению следующих новых поведений:

  • Литеральные или расширяемые строки со встроенными кавычками сохраняются:

    PS> $a = 'a" "b'
    PS> TestExe -echoargs $a 'c" "d' e" "f
    Arg 0 is <a" "b>
    Arg 1 is <c" "d>
    Arg 2 is <e f>
    
  • Пустые строки в качестве аргументов сохраняются:

    PS> TestExe -echoargs '' a b ''
    Arg 0 is <>
    Arg 1 is <a>
    Arg 2 is <b>
    Arg 3 is <>
    

Дополнительные примеры нового поведения см. в about_Parsing.

PowerShell 7.3 также добавил возможность трассировки привязки параметров для собственных команд. Дополнительные сведения см. в разделе Trace-Command.

PSNativeCommandErrorActionPreference

Примечание.

Эта функция стала основной в PowerShell 7.4.

Собственные команды обычно возвращают код выхода в вызывающее приложение, которое равно нулю для успешного выполнения или ненуля для сбоя. Однако собственные команды в настоящее время не участвуют в потоке ошибок PowerShell. Выходные данные перенаправленного stderr не интерпретируются так же, как и поток ошибок PowerShell. Многие собственные команды используют stderr как поток сведений или подробных сведений, поэтому обращать внимание стоит только на код завершения. Если вы работаете с собственными командами в скриптах, проверяйте состояние завершения после каждого вызова с помощью действий, аналогичных описанным ниже:

if ($LASTEXITCODE -ne 0) {
    throw "Command failed. See above errors for details"
}

Однако этот пример не поддерживает все случаи, когда $? может быть false из командлета или ошибки функции, что делает $LASTEXITCODE устаревшим.

Эта функция реализует $PSNativeCommandUseErrorActionPreference переменную предпочтения, которая управляет обработкой ошибок собственных команд в PowerShell. Это позволяет собственным командам создавать объекты ошибок, добавленные в поток ошибок PowerShell, и могут завершить выполнение скрипта без дополнительной обработки.

По умолчанию свойству $PSNativeCommandUseErrorActionPreference присваивается значение $false. При выборе $true параметра вы получите следующее поведение:

  • Когда $ErrorActionPreference = 'Stop'скрипты будут прерываться, когда собственная команда возвращает код выхода, отличный от нуля.
  • Если $ErrorActionPreference = 'Continue' (по умолчанию) вы увидите сообщения об ошибках powerShell для собственных команд, но скрипты не будут прерываться.

PSNativePSPathResolution

Примечание.

Эта экспериментальная функция была удалена в PowerShell 7.3 и больше не поддерживается.

Если путь PSDrive, использующий поставщик FileSystem, передается собственной команде, то и разрешенный путь к файлу передается собственной команде. Это означает, что такая команда, как code temp:/test.txt, сейчас работает должным образом.

Кроме того, в Windows, если путь начинается с ~, это разрешено в полный путь и передается в собственную команду. В обоих случаях путь нормализуется к разделителям каталогов для соответствующей операционной системы.

  • Если путь не является PSDrive или ~ (в Windows), нормализация пути не возникает
  • Если путь указан в одинарных кавычках, он не разрешается и рассматривается в качестве литерала.

PSRedirectToVariable

Примечание.

Эта экспериментальная функция была добавлена в PowerShell 7.5-preview.4.

При включении эта функция добавляет поддержку перенаправления на диск переменной. Эта функция позволяет перенаправить данные в переменную с помощью синтаксиса variable:name . PowerShell проверяет целевой объект перенаправления и если он использует поставщик переменных, который он вызывает Set-Variable , а не Out-File.

В следующем примере показано, как перенаправить выходные данные команды в переменную:

. {
    "Output 1"
    Write-Warning "Warning, Warning!"
    "Output 2"
} 3> variable:warnings
$warnings
Output 1
Output 2
WARNING: Warning, Warning!

PSSubsystemPluginModel

Эта функция включает модель подключаемого модуля подсистемы в PowerShell. Эта функция позволяет разделять компоненты System.Management.Automation.dll в отдельные подсистемы, находящиеся в их собственной сборке. Такое разделение сокращает объем дискового пространства ядра PowerShell и позволяет этим компонентам стать необязательными для минимальной установки PowerShell.

В настоящее время поддерживается только подсистема CommandPredictor. Эта подсистема используется вместе с модулем PSReadLine для предоставления настраиваемых подключаемых модулей прогнозирования. В будущем задание, CommandCompleter, удаленное взаимодействие и другие компоненты можно будет разделить на сборки подсистемы за пределами System.Management.Automation.dll.

Экспериментальная функция содержит новый командлет Get-PSSubsystem. Этот командлет доступен, только если функция включена. Этот командлет возвращает сведения о подсистемах, доступных в системе.

PSNativeWindowsTildeExpansion

Если эта функция включена, PowerShell развертывает неquoted tilde (~) в текущую домашнюю папку пользователя перед вызовом собственных команд. В следующих примерах показано, как работает функция.

Если функция отключена, тильда передается в собственную команду в виде литеральной строки.

PS> cmd.exe /c echo ~
~

С включенным компонентом PowerShell развертывает тильду перед передачей в собственную команду.

PS> cmd.exe /c echo ~
C:\Users\username

Эта функция применяется только к Windows. На платформах, отличных от Windows, расширение тильды обрабатывается изначально.

Эта функция добавлена в PowerShell 7.5-preview.2.

PSSerializeJSONLongEnumAsNumber

Эта функция позволяет командлету ConvertTo-Json сериализовать все значения перечисления на Int64/long основе числового значения или UInt64/ulong в виде строкового представления этого значения перечисления. Это соответствует поведению сериализации перечисления с другими базовыми типами перечисления, в которых командлет сериализует перечисления в качестве числового значения. Используйте параметр EnumsAsStrings для сериализации в виде строкового представления.

Например:

# PSSerializeJSONLongEnumAsNumber disabled
@{
    Key = [System.Management.Automation.Tracing.PowerShellTraceKeywords]::Cmdlets
} | ConvertTo-Json
# { "Key": "Cmdlets" }

# PSSerializeJSONLongEnumAsNumber enabled
@{
    Key = [System.Management.Automation.Tracing.PowerShellTraceKeywords]::Cmdlets
} | ConvertTo-Json
# { "Key": 32 }

# -EnumsAsStrings to revert back to the old behaviour
@{
    Key = [System.Management.Automation.Tracing.PowerShellTraceKeywords]::Cmdlets
} | ConvertTo-Json -EnumsAsStrings
# { "Key": "Cmdlets" }