Новые возможности PowerShell 7.1
11 ноября 2020 г. мы объявили о выпуске общедоступной версии PowerShell 7.1. Основываясь на фундаменте, заложенном в PowerShell 7.0, мы уделили больше внимания проблемам сообщества и реализовали ряд усовершенствований и исправлений. Мы стремимся поддерживать высокую стабильность и производительность платформы PowerShell.
Ниже перечислены новые функции, обновления и критические изменения в PowerShell 7.1.
- PSReadLine 2.1.0 с прогнозной технологией IntelliSense
- Версия PowerShell 7.1 опубликована в Microsoft Store.
- Пакеты установщика обновлены для новых версий ОС с поддержкой ARM64.
- 4 новые экспериментальные функции; 2 экспериментальные функции стали основными.
- Несколько критических изменений для повышения удобства использования
Полный список изменений доступен в журнале изменений в репозитории GitHub.
PSReadLine 2.1.0
Кроме того, PowerShell 7.1 включает версию PSReadLine 2.1.0. В ней реализована прогнозная технология IntelliSense. Дополнительные сведения о прогнозной технологии IntelliSense см. в объявлении, опубликованном в блоге PowerShell.
Пакет установщика в Microsoft Store
Версия PowerShell 7.1 опубликована в Microsoft Store. Этот выпуск PowerShell можно найти на веб-сайте Microsoft Store или в приложении Store в ОС Windows.
Пакет Microsoft Store обеспечивает следующие преимущества:
- автоматические обновления, встроенные непосредственно в Windows;
- интеграция с другими механизмами распространения программного обеспечения, такими как Intune и SCCM.
Примечание
Параметры конфигурации системного уровня, хранящиеся в $PSHOME
, нельзя изменить. Это относится и к конфигурации WSMAN. Это означает, что вы не сможете подключать удаленные сеансы к установкам PowerShell на основе хранилища. Поддерживаются конфигурации уровня пользователя и удаленное взаимодействие по SSH.
Другие установщики
Более актуальные сведения о поддерживаемых операционных системах и жизненном цикле поддержки см. в статье Жизненный цикл поддержки PowerShell.
Обратитесь к инструкциям по установке для своей операционной системы:
Кроме того, PowerShell 7.1 поддерживает выпуски Debian и Ubuntu для ARM32 и ARM64, а также Alpine Linux для ARM64.
Сообщество также предоставило пакеты для Arch и Kali Linux, хотя они не поддерживаются официально.
Примечание
Debian 10+, CentOS 8+, Ubuntu 20.04, Alpine и ARM сейчас не поддерживают удаленное взаимодействие WinRM. Подробные сведения о настройке удаленного взаимодействия на основе SSH см. в статье Удаленное взаимодействие с PowerShell через SSH.
Экспериментальные возможности
Дополнительные сведения см. в статье об использовании экспериментальных функций.
В этом выпуске следующие экспериментальные функции стали основными:
В этом выпуске были добавлены следующие экспериментальные функции:
Microsoft.PowerShell.Utility.PSManageBreakpointsInRunspace
- В PowerShell 7.1 эта экспериментальная функция расширена: ко всем командлетам
*-PSBreakpoint
добавлен параметр Runspace. Параметр Runspace указывает объекту Runspace взаимодействовать с точками останова в указанном пространстве выполнения.
- В PowerShell 7.1 эта экспериментальная функция расширена: ко всем командлетам
PSNativePSPathResolution — эта функция позволяет передавать пути к поставщикам PowerShell в собственные команды, которые не поддерживают синтаксис путей PowerShell.
PSCultureInvariantReplaceOperator — когда левый операнд в инструкции оператора
-replace
не является строкой, он преобразуется в строку. Когда эта функция включена, при преобразовании строк не используются настройки языка и региональных параметров.PSSubsystemPluginModel — основа для поддержки будущих подключаемых модулей с прогнозной технологией IntelliSense.
Критические изменения и улучшения
Изменение в поведении при сравнении строк в .NET 5.0
Версия PowerShell 7.1 создана на основе версии .NET 5.0, в которой представлены следующие критические изменения:
Начиная с версии .NET 5.0, при сравнении неизменяемых строк не учитываются непечатаемые управляющие символы.
Например, следующие две строки считаются идентичными:
# Escape sequence "`a" is Ctrl-G or [char]7 'Food' -eq "Foo`ad"
True
Исправлено ошибочное значение
$false
для$?
при записи собственной команды вstderr
(#13395).Обычно, когда собственные команды выполняют запись в
stderr
, им не нужно сообщать об ошибке. В результате этого изменения$?
задается равным$false
только в том случае, если собственная команда имеет ненулевой код выхода. Это изменение не связано с экспериментальной функциейPSNotApplyErrorActionToStderr
.Теперь
$ErrorActionPreference
не влияет на выходные данныеstderr
собственных команд (#13361).Обычно, когда собственные команды выполняют запись в
stderr
, им не нужно сообщать об ошибке. В результате этого изменения выходные данныеstderr
по-прежнему фиксируются в объектах ErrorRecord, но среда выполнения больше не применяет$ErrorActionPreference
, если ErrorRecord поступает от собственной команды.Переименуйте
-FromUnixTime
в-UnixTimeSeconds
onGet-Date
, чтобы разрешить ввод времени Unix (No 13084) (выражаем благодарность). @aetos382!)Параметр
-FromUnixTime
был добавлен в версии 7.1-preview.2. Он был переименован, чтобы лучше соответствовать типу данных. Этот параметр принимает целочисленное значение, которое представляет время в секундах с 0:00:00 1 января 1970 г.В этом примере время в формате Unix (представленное количеством секунд с 0:00:00 01.01.1970) преобразуется в тип DateTime.
Get-Date -UnixTimeSeconds 1577836800 Wednesday, January 01, 2020 12:00:00 AM
Разрешено переопределять явно заданным именованным параметром аналогичный параметр из сплаттинга хэш-таблицы (#13162)
В результате этого изменения именованные параметры, передаваемые через сплаттинг, перемещаются в конец списка параметров, так что они привязываются после привязки всех явно указанных именованных параметров. При привязке параметров в простых функциях не возникает ошибка, если не удается найти указанный именованный параметр. Неизвестные именованные параметры привязываются к параметру
$args
простой функции. Перемещение сплаттинга в конец списка аргументов приводит к изменению порядка, в котором параметры следуют в$args
.Пример:
function SimpleTest { param( $Name, $Path ) "Name: $Name; Path: $Path; Args: $args" }
В предыдущем случае аргумент MyPath не привязан к
-Path
, так как он является третьим в списке аргументов. ## В результате он помещается в '$args' вместе сBlah = "World"
PS> $hash = @{ Name = "Hello"; Blah = "World" } PS> SimpleTest @hash "MyPath" Name: Hello; Path: ; Args: -Blah: World MyPath
В результате этого изменения аргументы из
@hash
перемещаются в конец списка аргументов. MyPath становится первым аргументом в списке, поэтому он привязывается к-Path
.PS> SimpleTest @hash "MyPath" Name: Hello; Path: MyPath; Args: -Blah: World
Сделайте параметр
-Qualifier
switch не позициональным дляSplit-Path
(No 12960) (выражаем благодарность) @yecril71pl!)Разрешите рабочий каталог как литеральный путь для
Start-Process
, если он не указан (No 11946) (выражаем благодарность) @NoMoreFood!)Сделайте
-OutFile
параметр в веб-командлетах работать как-LiteralPath
(No 11701) (выражаем благодарность) @iSazonov!)Исправлена привязка строковых параметров для
BigInteger
числовых литерал (No 11634) (выражаем благодарность) @vexx32!)В Windows
Start-Process
создает среду процесса со всеми переменными среды из текущего сеанса, используя-UseNewEnvironment
создание новой среды процесса по умолчанию (No 10830) (выражаем благодарность). @iSazonov!)Устранен перенос возвращаемого результата в
PSObject
при преобразованииScriptBlock
в делегат (#10619).Когда
ScriptBlock
преобразуется в тип делегата для использования в контексте C#, перенос результата вPSObject
приводит к ненужным проблемам.- Когда значение преобразуется в возвращаемый тип-делегат,
PSObject
по сути разворачивается. ПоэтомуPSObject
не требуется. - Если возвращаемый тип-делегат —
object
, он переносится вPSObject
, что затрудняет работу с ним в коде C#.
В результате этого изменения возвращается базовый объект.
- Когда значение преобразуется в возвращаемый тип-делегат,