Вышел PowerShell 7.0 Preview6


Вышла последняя предварительная версия PowerShell 7.0 перед RC, который ожидается через месяц.

Найти описание и дистрибудив можно по ссылке https://github.com/PowerShell/PowerShell/releases/tag/v7.0.0-preview.6

Как всегда множество исправлений и несколько новинок.

Появились новые операторы — null-conditional operators.

Обновился портированный Test-Connection. Теперь он более пригодный для использования, хотя проблемы ещё остались.

Запуск Windows PowerShell из PowerShell Core происходит более корректно (в смысле поиска и загрузки модулей).

Появился более удобный механизм использования несовместимых с PowerShell Core модулей — https://github.com/PowerShell/PowerShell/pull/10973 По сути создается «удаленная» сессия, в которой запущен Windows PowerShell. Это не решает всех проблем из-за сериализации, но это работает!

Как всегда улучшена производительность в некоторыз сценариях.

Командлет Select-String получил новый параметр Culture, который позволяет не только использовать правила конретного языка для поиска, но и выполнять самый быстрый бинарный поиск (Ordinal). Рекомендую попробовать.

Целый ряд непортированных командлетов добавлены обратно для лучшей совместимости скриптов с Windows PowerShell — Get-Counter, Get-ClipboardSet-Clipboard, Out-Printer, Clear-RecycleBin, Out-GridViewShow-Command и Get-Help -ShowWindow.

Не забываем про новый Get-Error, который постоянно улучшается.

И ещё много чего найдёте по ссылке.

PowerShell 7.0 Preview5


Начинаю привыкать писать PowerShell 7.0 без Core. Это уже официальное имя. Да и намерение Microsoft сделать этот продукт полноценной заменой Windows PowerShell 5.1 уже не выглядит фантастичным.

Чем же нас порадует и удивит очередная предварительная версия?

Прежде чем рассмотреть новшества, стоит отметить ближайшие планы. Очередная предварительная версия Preview6 выйдет в ноябре. Затем в декабре будет RC на базе .Net Core 3.1. И релиз в январе 2020 года. Это будет LTS версия, что означает поддержку в течение 3 лет. Как я уже писал, выпуски PowerShell будут следовать в русле версий .Net Core. Так .Net Core 3.1 является LTS версией, и, соответственно, PowerShell на её базе также будет LTS. Через пару лет выйдет .Net Core 5.0, которая по всей видимости заменит .Net Framework, и, соответственно, мы можем предположить, что PowerShell на её основе заменит Windows PowerShell.

Теперь о Preview5. Конечно в ней есть всё что появилось в предыдущих предварительных версиях, и об этом смотрите в предыдущих постах.

1. Get-Hotfix теперь снова работает, но только на Windows. Постепенно возвращаются командлеты, которые невозможно портировать. Ранее правило было жёстким: в PowerShell Core должны быть только портированные командлеты, т.е. только те, которые работают на всех поддерживаемых платформах. Но курс на замену Windows PowerShell гнёт в свою сторону.

2. Select-String научился делать выделение найденных фрагментов.

Пишите отзывы, пока есть время до релиза.

3. Операторы && и || для цепочек команд

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

4. Операторы ?? и ??=

Это так называемые Null-coalescing operators. Работают точно также как в языках программирования: вернуть значение переменной, если это не null, иначе правую часть.

5. IntelliSense работает для Enum типов и атрибутов (type constraints)

Попробуйте:

$ErrorActionPreference = <tab>

[ValidateSet(1, 2)][int]$a= <tab>

6. Format-Hex значительно улучшен. Разнородные объекты выводятся в более удобном виде. Примеры можно посмотреть тут.

7. Изменен формат вывода ошибок в консоли. Он стал более дружественным и лаконичным. Для вывода полной информации об ошибке теперь есть новый командлет Get-Error. Посмотрите, попробуйте и напишите отзывы, пока есть время до релиза.

ПопробуйтеЖ

1/0

Get-Error

8. При запуске интерактивной сессии вы теперь можете получить уведомление о наличии новой версии. Не знаю насколько это нужно. Оповещение можно отключить переменной окружения POWERSHELL_UPDATECHECK_OPTOUT = 0 или запустив pwsh -NoLogo.

9. PSReadLine 2.0.0-beta6

Скачивайте и работайте. Обратная связь.

10. Ternary Operator

Это оператор «?». Работает точно также как в языках программирования.

Попробуйте:

$IsWindows ? «Yes» : «No»

Полный список изменений в Release Notes

Вышел PowerShell 7.0 Preview4


Команда Microsoft определилась со сроками выпуска окончательной версии PowerShell 7.0 — в декабре RC и в январе окончательная версия на базе .Net Core 3.1. Это будет LTS версия с поддержкой на несколько лет. Собственно версии будут привязаны к выпускам LTS версий .Net Core.

PowerShell 7.0 Preview4 вполне стабильная версия и баризуется на одном из последних релизов .Net Core 3.0 Preview8.

Прямые ссылки можно найти на GitHub. Ниже только краткие комментарии об изменениях.

ForEach-Object стал заметно быстрее для большинства сценариев, включая параллелизм (параметер -Parallel). Рекомендую попробовать в реальных сценариях.

Кстати посмотрите статью PowerShell ForEach-Object Parallel Feature. Обратите внимание, что параллелизм имеет накладные расходы и не всегда приводит к ускорению.

Еще ранее появилась новая телеметрия New Telemetry in PowerShell 7 Preview 3. Надеюсь, Microsoft поделится новой статистикой. Кто ещё не видел Dashboard?

Появился Ternary Operator:

$var = $isWindows ? "Windows" : "Not Windows"

Некоторым очень хотелось это иметь в языке.

За несколько последних месяцев Кирк Манро внёс неколько улучшений в отладчик и продолжает эту работу. Если вы активно используете откладчик, то подключайтесь к процессу — обратная связь всегда полезна.

Добавлена поддержка групповых политик (GPO). Если нет политик для PowerShell Core, то будут использоваться политики от Windows PowerShell. Это большой шаг к использованию PowerShell Core в корпоративной среде.

Продолжаю работать на улучшениями в PowerShell Core. Уже целая пачкаа улучшений производительности добавлена. Несколько ожидают одобрения и в планах ещё несколько. Результатом должно стать ускорение запуска и создания runspace (что важно для параллелизма).

Совместимость модулей с PowerShell Core


Этим летом мы могли убедиться, что в последних версиях Windows появился целый ряд модулей совместимых с PowerShell Core.

Их легко определить на наличию строки CompatiblePSEditions = @(‘Desktop’,’Core’) в файле манифеста. (Речь о модулях в папке C:\Windows\System32\WindowsPowerShell\v1.0\Modules\ )

Приближается время выпуска новой версии PowerShell Core 7.0, и самое время протестировать стандартные модули Windows, которыми вы пользуетесь? на совместимость с этой версией, тем более что только что появилась предварительная версия 7.0 Preview4.

Что делать, если выявлены проблемы совместимости? Создавайте обращение в репозитории https://github.com/PowerShell/WindowsCompatibility. Для модулей третьих лиц пишите разработчикам. Чем раньше, тем лучше.

Помните, что уже близко то время, когда PowerShell Core заменит Windows PowerShell полностью. Windows PowerShell уже несколько лет заморожен, и все новые возможности появляются только в Windows Core.

Вышел PowerShell 7.0 Preview2


Стоит попробовать его в деле!

В основе уже .Net Core 3.0 Preview6, который очень хорош в быстродействии и особенно в управлении памятью: вы можете обнаружить, что теперь процесс PowerShell не раздувается в памяти во многих сценариях как ранее.

Помимо улучшений производительности полученных из Net Core 3.0 Preview6 в самом PowerShell Core добавлено несколько коммитов, которые также улучшают производительность.

Так Foreach-Object в некоторых случаях будет работать вдвое быстрее! Также можно сказать о WildcardPattern.IsMatch(). Последний используется в нескольких местах в движке, который также стал бастрее, например, при файловых операциях глоббинга. Там также есть ещё несколько улучшений производительности для файловых операций.

Из функциональных добавлений DBNull.Value и NullString.Value теперь работают точно также как $null, что полезно при работе с базами данных.

-split оператор теперь понимает отрицательный параметр, чтобы выполнять разбиение строки от конца к началу. https://github.com/PowerShell/PowerShell/pull/8960

Для разработчиков теперь работает dotnet tool install —global PowerShell — вы получите версию 6.2.2 как глобальный инструмент. https://devblogs.microsoft.com/powershell/introducing-powershell-as-net-global-tool/

Теперь не нужно спецально замерять время выполнения команды в консоли: Get-History покажет вам поле Duration!

Get-History

  Id     Duration CommandLine
  --     -------- -----------
   1        6.153 [io.Directory]::GetFileSystemEntries
   2        0.416 [io.Directory]::GetFileSystemEntries("./")

Командлет Set-Service имеет параметер SecurityDescriptorSddl для установки прав.

Теперь можно использовать зарезервированные имена для имен методов, функций и ресурсов.

Если вы часто использете COM на Windows, то оцените возможность увидеть сигнатуру метода. Ранее это работало только для обычных методов

$shell = New-Object -ComObject "Shell.Application"
$shell.AddToRecent

OverloadDefinitions
-------------------
void AddToRecent (Variant varFile, string bstrCategory)

В основной код вошли TempDrive: и UseAbbreviationExpansion. Первое интуитивно понятно. Второе позволяет вещи вроде:

gcm -UseAbbreviationExpansion i-psdf

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Import-PowerShellDataFile                          6.1.0.0    Microsoft.PowerShell.Utility

Остальное можно найти на сайте GitHub https://github.com/PowerShell/PowerShell/releases/tag/v7.0.0-preview.2

Вышел PowerShell 7.0 Preview1


Страница загрузки https://github.com/PowerShell/PowerShell/releases/tag/v7.0.0-preview.1

Там же вы найдете список последних изменений. Некоторые очень полезные. Например, сделана оптимизация работы с объектами в движке, что делает его быстрее, в некоторых сценариях это очень заметно. Ожидаем еще несколько важных улучшений производительности. О других изменениях я уже писал ранее, смотрите предыдущие посты.

Почему 7.0, а не 6.3? Читаем в блоге команды https://devblogs.microsoft.com/powershell/the-next-release-of-powershell-powershell-7/. По сути происходит очередной этап миграции платформы: после .Net Core 3.0 следующая версия будет 5.0, и она окончательно заменит .Net Framework (последняя версия будет 4.8), PowerShell 7.0 это шаг в том же направлении — заменить Windows PowerShell 5. Последующие выпуски PowerShell будут привязаны к выпускам .Net, в том числе LTS (Long Term Servicing).

Главное изменение внутри — теперь движок работает на .Net Core 3.0 Preview. Релиз .Net Core 3.0 намечен на сентябрь, значит релиз PowerShell 7.0 будет не позднее ноября.

Сейчас работа над PowerShell 7.0 будет заключаться в адаптации к .Net Core 3.0. С одной стороны можно убрать некоторый код и использовать стандарное API, которое стало доступным. С другой стороны можно использовать новые возможности, которые появились в 3.0. Например, теперь доступно WinForms, и мы вернем обратно Out-GridView (только на Windows конечно).

Если у вас есть идеи, предложения, то добро пожаловать на https://github.com/PowerShell/PowerShell/. Любой вклад идёт всем на пользу. Не думайте, что это сложно: идея, обсуждение, реализация — всё просто, и вы делаете только ту часть, которая вам важна и интересна, сообщество может подхватить и сделать остальное. Хлтя может не быстро. И это повод начать по-раньше.

Напомню также, что есть https://github.com/MicrosoftDocs/PowerShell-Docs , где вы можете запросить изменения в документацию или сделать их сами. Нашли ошибку — пишите сразу, не откладывайте.

.Net Core 3.0 и PowerShell Core


Если кратко, то в .Net Core 3.0 мы получим PowerShell Core как global tool.

Достаточно будет сделать:
dotnet tool install

Это будет работать в Docker контейнерах тоже.

Кстати (это уже совсем другая история) возможно уже в следующей предварительной версии 7.0.0 Preview1 PowerShell Core будет работать на .Net Core 3.0. Всё должно будет работать шустрее, да и набор API для разработчиков ощутимо расширяется.