Глава 1. Установка и конфигурирование PowerShell 7

Данная глава рассматривает следующие рецепты:

  • Установка PowerShell 7

  • Применение консоли PowerShell 7

  • Исследование артефактов установки PowerShell 7

  • Сборка файлов профиля PowerShell 7

  • Установка VS Code

  • Установка шрифта Cascadia Code

  • Исследование PSReadLine

Введение

PowerShell 7 представляет самые последние шаги в развитии PowerShell. PowerShell впервые был представлен общественности в 2003, причём формально был выпущен в качестве Windows PowerShell v1 в 2006. На протяжении следующего десятилетия Microsoft выпустил множество версий, завершившиеся на PowerShell 5.1. На протяжении разработки Windows PowerShell, данный продукт продвинулся от представления в качестве добавки поверх Windows до интегрированной функциональной возможности. Microsoft планирует поддерживать Microsoft PowerShell 5.1 на протяжении длительного времени, однако, скорее всего, никаких новых свойств.

Команда разработки PowerShell приступила к работе над версией PowerShell с открытым исходным кодом на основе версии .NET Core с открытым исходным кодом. Самые первые три версии PowerShell Core 6.0, 6.1 и 6.2 представляли проверку концепции - вы можете выполнять центральные функции и функциональные возможности PowerShell по всем платформам Windows, Mac и Linux. Однако они были крайне ограничены в плане поддержки всех богатых потребностей профессионального сообщества ИТ.

С PowerShell 7.0 пришло улучшение паритета с Windows PowerShell. Имеются несколько модулей, которые не работают в PowerShell 7, а также ещё несколько, которые работают через описанный в Главе 3, Изучаем совместимость с Windows PowerShell механизм. PowerShell 7.0 начал поставляться в 2019 и за ним последовала версия 7.1. Данная книга применяет термин "PowerShell 7" чтобы объединять и PowerShell 7.0 и 7.1.

После установки PowerShell 7 вы можете запускать его и применять просто как консоль Windows PowerShell. Та команда, которая запускает PowerShell 7 это теперь pwsh.exe (вместо powershell.exe в Windows PowerShell). PowerShell 7 также применяет иные местоположения файлов профилей по сравнению с Windows PowerShell. Вы можете настраивать свои профили PowerShell 7 для применения новых функциональных возможностей PowerShell. Вы также можете применять различные файлы профилей для Windows PowerShell и PowerShell 7.

Integrated Scripting Environment (ISE) Windows PowerShell это инструмент, который применяется с PowerShell. Однако ISE не поддерживается с PowerShell . Для его замены пользуйтесь Visual Studio Code (VS Code), проектом редактирования с открытым исходным кодом, который предоставляет все необходимые свойства самого ISE и значительно больше дополнительных. {Прим. пер.: также рекомендуем новый терминал Windows, подробнее в нашем переводе Изучаем подсистемы Windows для Linux Прэйтика Сингха}.

Microsoft также разработал новый шрифт, Cascadia Code, чтобы он совпадал с запускаемым VS Code. Этот шрифт хорошее улучшение Courier или прочих шрифтов с моношириной. Все снимки экранов работы кода в этой книге применяют этот новый шрифт.

PSReadLine это модуль PowerShell, разработанный для предоставления раскрашенного кода PowerShell в консоли PowerShell. Этот модуль, по умолчанию включённый в PowerShell 7, превращая редактирование в командной строке более простым и более схожим со свойствами, доступными в оболочках Linux.

Установка PowerShell 7

PowerShell 7 по умолчанию не устанавливается в Windows, по крайней мере на момент написания этих строк. Команда PowerShell сделала доступным PowerShell 7.1 доступным из Microsoft Store, что полезно для установки PowerShell 7.1 или более поздних версий в системе Windows 10. Поскольку Microsoft Store не повсеместно покрывается в установках Windows Server, вы можете устанавливать PowerShell при помощи сценария Install-PowerShell.ps1, который вы выгружаете из Интернета, как это показано в данном рецепте. Вы также можете применять этот рецепт в хостах Windows 10.

Подготовка

Данный рецепт применяет SRV1, Windows Server хоста рабочей группы. Нет никаких приложений функциональности, загруженных на этом сервере (пока).

Как это сделать...

  1. Устанавливаем политику исполнения для Windows PowerShell (в новой консоли Windows PowerShell)

    
    Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force
    		
  2. Установите самые последние версии NuGet и PowerShellGet

    
    Install-PackageProvider Nuget -MinimumVersion 2.8.5.201 -Force |
      Out-Null
    Install-Module -Name PowerShellGet -Force -AllowClobber
    		
  3. Убедитесь что имеется папка C:\Foo

    
    $LFHT = @{
      ItemType    = 'Directory'
      ErrorAction = 'SilentlyContinue' # should it already exist
    }
    New-Item -Path C:\Foo @LFHT | Out-Null
    		
  4. Выгрузите сценарий установки PowerShell 7

    
    Set-Location C:\Foo
    $URI = 'https://aka.ms/install-powershell.ps1'
    Invoke-RestMethod -Uri $URI | 
      Out-File -FilePath C:\Foo\Install-PowerShell.ps1
    		
  5. Просмотрите подсказку сценария установки

    
    Get-Help -Name C:\Foo\Install-PowerShell.ps1
    		
  6. Установите PowerShell 7

    
    $EXTHT = @{
      UseMSI                 = $true
      Quiet                  = $true 
      AddExplorerContextMenu = $true
      EnablePSRemoting       = $true
    }
    C:\Foo\Install-PowerShell.ps1 @EXTHT | Out-Null
    		
  7. Для любителей приключений - установка предварительной версии и ежедневных сборок

    
    C:\Foo\Install-PowerShell.ps1 -Preview -Destination C:\PWSHPreview |
      Out-Null
    C:\Foo\Install-PowerShell.ps1 -Daily   -Destination C:\PWSHDailBuild |
      Out-Null
    		
  8. Создайте профили по умолчанию Windows PowerShell

    
    $URI = 'https://raw.githubusercontent.com/doctordns/PACKT-PS7/master/' +
           '/scripts/goodies/Microsoft.PowerShell_Profile.ps1'
    $ProfileFile    = $Profile.CurrentUserCurrentHost
    New-Item $ProfileFile -Force -WarningAction SilentlyContinue |
       Out-Null
    (Invoke-WebRequest -Uri $URI -UseBasicParsing).Content |
      Out-File -FilePath  $ProfileFile
    $ProfilePath    = Split-Path -Path $ProfileFile
    $ChildPath      = 'Microsoft.PowerShell_profile.ps1'
    $ConsoleProfile = Join-Path -Path $ProfilePath -ChildPath $ChildPath
    (Invoke-WebRequest -Uri $URI -UseBasicParsing).Content |
      Out-File -FilePath  $ConsoleProfile
    		
  9. Проверка номера загруженной версии PowerShell 7

    
    Get-ChildItem -Path C:\pwsh.exe -Recurse -ErrorAction SilentlyContinue
    		

Как это работает...

На Шаге 1 вы открываете новую консоль Windows PowerShell и настраиваете политику исполнения PowerShell на работу без ограничений, что упрощает применение сценариев для настройки хостов. В промышленных применениях вы можете пожелать настроить политику исполнения на более ограниченную. Однако имейте в виду, что политика исполнения это не реальный механизм безопасности - она просто тормозит неопытного администратора.

Для хорошего пояснения Руководящих принципов безопасности PowerShell обратитесь к https://devblogs.microsoft.com/powershell/powershells-security-guiding-principles/.

Галерея PowerShell это репозиторий модулей и сценариев PowerShell и является существенным ресурсом для всех профессионалов ИТ. Данная книга пользуется некоторыми модулями из этой Галереи PowerShell. На Шаге 2 вы обновляете как поставщиков пакетов NuGet (для версии 2.8.5.201 или более поздней) и обновляете версию модуля PowerShellGet.

На протяжении этой книги вы пользуетесь папкой C:\Foo для хранения различных файлов, которые вы применяете в сочетании с этими рецептами. На Шаге 3 вы убеждаетесь что эта папка существует.

В настоящее время PowerShell 7 не устанавливается по умолчанию в Windows (или macOS либо Linux), хотя это может и измениться. Чтобы позволить вам установить PowerShell 7 в Windows вы делаете выборку сценария установки с GitHub и сохраняете её в папке C:\Foo. На Шаге 4 вы пользуетесь закладной URL, которая указывает на GitHub и затем пользуемся Invoke-RestMethod для выгрузки необходимого файла. Обратите внимание, что Шаги 1 и 4 не предоставляет никакого вывода.

На Шаге 5 вы видите справочные сведения, содержащиеся в файле подсказки, которые производят следующий вывод:

 

Рисунок 1-1


Просмотр подсказки сценария установки

Обратите внимание, что после установки PowerShell 7, когда вы в самый первый раз вы запускаете Get-Help у вас запрашивается согласие на выгрузку текста подсказки (что не показано на этом рисунке).

На Шаге 6 вы пользуетесь полученным сценарием установки и выполняете инсталляцию PowerShell 7. Эта команда применяет MSI, который далее устанавливается втихую. Этот MSI обновляет путь исполнения своей системы для добавления папки установки PowerShell 7. Этот код выполняет выборку самой последней поддерживаемой версии PowerShell 7 и вы можете наблюдать его реальное имя файла в следующем выводе:

 

Рисунок 1-2


Установка PowerShell 7

PowerShell 7 продолжает работу. Каждый день команда PowerShell собирает обновлённые версии PowerShell и предварительные представления выпуска для следующей основной версии. Такие предварительные представления сборок в целом стабильны и позволяют вам попробовать новые функциональные возможности которые придут со следующим основным выпуском. Все ежедневные сборки позволяют вам наблюдать за развитием конкретных ошибок в функциональных возможностях. Вы можете находить полезным устанавливать их обе (и обеспечивать их современное отслеживание со временем).

На Шаге 7 вы устанавливаете ежедневную сборку и самую последнюю сборку предпросмотра, которые выглядят так:

 

Рисунок 1-3


Установка предпросмотра и ежедневных сборок

PowerShell пользуется файлами профиля чтобы позволить вам настраивать PowerShell при каждом его запуске (будь то консоль PowerShell или как часть VS Code или ISE). На Шаге 8, вы выгрузили образец сценария профиля и сохранили его локально. Обратите внимание, что тот файл профиля, который мы создали на Шаге 8, предназначен только для Windows PowerShell.

Названием исполняемого файла для PowerShell 7 выступает pwsh.exe. На Шаге 9 вы видите номер версий этого файла:

 

Рисунок 1-4


Проверка загруженных версий PowerShell 7

Как вы можете видеть, в SRV1 имеются установленными три версии PowerShell 7: самая последний полный выпуск, самое последний предпросмотр и сборка текущего дня.

Есть кое- что ещё...

На Шаге 1 Вы открываете новую консоль Windows PowerShell . Убедитесь что вы запускаете эту консоль в качестве локального администратора.

На Шаге 4 вы пользуетесь сокращённым URL для выгрузки необходимого сценария Install-PowerShell.ps1. Когда вы применяете Invoke-RestMethod, PowerShell обнаруживает лежащий в основе целевой URL для искомого сценария. Такой сокращённый URL позволяет Microsoft и команде PowerShell публиковать хорошо известные URL, а затем иметь возможность перемещать целевое расположение в случае необходимости. На момент написания этих строк таким целевым URL выступал https://raw.githubusercontent.com/PowerShell/PowerShell/master/tools/install-powershell.ps1.

На Шаге 7 вы устанавливаете версии как самой последней ежедневной сборки, так и самый последний предварительный просмотр. Наблюдаемые вами конкретные версии файлов отличаются от показанных здесь, по крайней мере для версий предпросмотра!

{Прим. пер.: На начало 2022 года имеется стабильная версия PowerShell 7.2.1. Установить её можно при помощи Диспетчера пакетов командной строки (winget) следующим образом:

  1. Найдите последнюю версию PowerShell

    
    winget search Microsoft.PowerShell
    
    Name               Id                           Version         Source
    -----------------------------------------------------------------------
    PowerShell         Microsoft.PowerShell         7.2.1.0         winget
    PowerShell Preview Microsoft.PowerShell.Preview 7.3.0-preview.1 winget
    		
  2. Установите PowerShell окончательной или предварительной версии, используя параметр Id

    
    winget install --id Microsoft.Powershell --source winget
    winget install --id Microsoft.Powershell.Preview --source winget
    		

    Подробнее: Установка PowerShell в Windows.}

Применение консоли PowerShell 7

Для PowerShell 7 названием исполняемого файла PowerShell теперь является, как вы видели это в предыдущем рецепте, pwsh.exe. После установки PowerShell 7 в Windows вы можете запустить консоль PowerShell 7, кликнув Start (Пуск) и набрав pwsh.exe с последующим нажатием Return. Установщик MSI PowerShell не создаёт закладок в панели Start или панели задач.

Подготовка

После установки PowerShell 7, вы можете выполнить это рецепт в SRV1.

Как это сделать...

  1. Запустите консоль PowerShell 7. На рабочем столе Windows в SRV1 кликните клавишу Windows, затем наберите pwsh и нажмите Enter.

  2. Просмотрите номер версии PowerShell

    
    $PSVersionTable
    		
  3. Просмотрите значение переменной $Host

    
    $Host
    		
  4. Взгляните на значение процесса PowerShell

    
    Get-Process -Id $Pid | 
      Format-Custom MainModule -Depth 1
    		
  5. Взгляните на статистику применения ресурсов

    
    Get-Process -Id $Pid | 
      Format-List CPU,*Memory*
    		
  6. Обновите подсказку PowerShell

    
    $Before = Get-Help -Name about_*
    Update-Help -Force | Out-Null
    $After = Get-Help -Name about_*
    $Delta = $After.Count - $Before.Count
    "{0} Conceptual Help Files Added" -f $Delta
    		
  7. Сколько команд доступно?

    
    Get-Command | 
      Group-Object -Property CommandType
    		

Как это работает...

На Шаге 1 в консоли SRV1 вы запустили PowerShell 7. Эта консоль должна выглядет как- то так:

 

Рисунок 1-5


Консоль PowerShell 7

На Шаге 2 вы просматриваете значение конкретной версии PowerShell через значение встроенной переменной $PSVersionTable, что выглядит примерно так:

 

Рисунок 1-6


Просмотр значения версии PowerShell

На Шаге 3 для определения подробностей относительно своего хоста PowerShell (консоли PowerShell) вы исследуете значение переменной $Host, что отображается следующим образом:

 

Рисунок 1-7


Просмотр значения переменной $Host

Как вы может видеть, значением текущей культуры установлено EN-GB. В своём случае вы можете обнаружить иное значение, в зависимости от конкретной применяемой версии Windows Server.

На Шаге 4 вы пользуетесь Get-Process для того чтобы взглянуть на подробности своего процесса PowerShell, что выглядит примерно так:

 

Рисунок 1-8


Взгляд на подробности процесса PowerShell

На этом рисунке вы можете видеть значение пути к исполняемому файлу PowerShell . Это значение изменяется в зависимости от того, исполняете ли вы версию официального выпуска, или свои выпуски ежедневный/ предпросмотр.

На Шаге 5 вы можете наблюдать подробности использования ресурсов запущенного в хосте SRV1 процесса pwsh.exe:

 

Рисунок 1-9


Взгляд на статистики применения ресурсов pwsh.exe

Конкретные значения для каждого из счётчиков производительности, скорее всего, отличаются и вы можете наблюдать иные значения.

По умолчанию, PowerShell, как и Windows PowerShell, поставляются с минимальным числом файлов подсказок. Вы можете, как вы это видите а Шаге 6 , воспользоваться командой Update-Help для выгрузки обновлённого содержимого подсказок PowerShell, подобно этому:

 

Рисунок 1-10


Обновление подсказки PowerShell

Как вы можете наблюдать в полученном выводе, не все файлы подсказок были обновлены. В данном случае, например, таков наш модуль ConfigDefender, в настоящее время обладающий обновлённой информацией. Также обратите внимание, что могут отсутствовать подробности подсказок версий UK English, имеются версии US English, которые вы можете установить и которые окажутся полезными. Между британскими и американскими текстами нет существенной разницы.

Команды в PowerShell включают в свой состав функции, командлеты и псевдонимы. На Шаге 7 вы изучаете сколько команд каждого типа имеется по умолчанию, например, так:

 

Рисунок 1-11


Изучение общего числа доступных команд каждого типа

Есть кое- что ещё...

На Шаге 1 вы открыли консоль PowerShell для той версии, которую вы установили в нашем рецепте Установка PowerShell 7. Для нашего выпуска PowerShell 7.1, то значение номера версии, которое вы должны видеть, это 7.1.0. На момент чтения данной книги этот номер версии мог двинуться далее. Чтобы убедиться что вы установили самую последнюю версию PowerShell 7, выполните повторно сценарий PowerShell.ps1, который мы выгружали в своём рецепте Установка PowerShell 7.

Кроме того, на Шаге 1, вы могли наблюдать вывод, вырабатываемый предложениями Write-Host в вашем файле профиля при вашей настройке в рецепте Установка PowerShell 7. Вы может удалить эти предложения для снижения общего числа вывода, который вы наблюдаете всякий раз при запуске вами PowerShell.

На Шаге 4 вы применяете значение переменной $PID, которая содержит значение идентификатора своего процесса консоли для процесса Windows. Реальное значение $PID изменяется при каждом запуске вами PowerShell, но это значение всегда содержит значение идентификатора процесса нашего текущего процесса консоли.

На Шаге 6 вы можете наблюдать некую ошибку в сведениях подсказок модуля PSReadLine (Рисунок 1-10). Разработчики этого модуля, в своих последних версиях, переименовали этот модуль в PSReadLine (изменив на заглавную букву L в Line). Тем не менее, URL подсказок, по ряду причин, чувствительны к регистру. Вы можете исправить это переименовав свой модуль на диске и изменив на заглавное название папки.

На Шаге 7 вы наблюдаете, что у вас имеются доступными 1786 команд. Это число изменяется, поскольку вы добавляете дополнительные функциональные возможности (и сопровождающие их модули) или выгружаете и устанавливаете модули из таких репозиториев, как Галерея PowerShell.

Изучение артефактов установки PowerShell 7

В PowerShell 7 определённые объекты, добавляемые установщиком PowerShell 7 (и самим PowerShell 7) отличаются от тех, которые применяются Windows PowerShell.

Подготовка

Этот рецепт пользуется SRV1 после установки вами PowerShell 7. В этом рецепте для выполнения своих шагов мы пользуемся консолью PowerShell 7.

Как это сделать...

  1. Проверяем значение таблицы версии для своей консоли PowerShell 7

    
    $PSVersionTable
    		
  2. Исследуем папку установки PowerShell 7

    
    Get-Childitem -Path $env:ProgramFiles\PowerShell\7 -Recurse |
      Measure-Object -Property Length -Sum
    		
  3. Просматриваем JSON файл конфигурации PowerShell 7

    
    Get-ChildItem -Path $env:ProgramFiles\PowerShell\7\powershell*.json | 
      Get-Content
    		
  4. Проверяем значение изначальной Политики выполнения для PowerShell 7.

    
    Get-ExecutionPolicy
    		
  5. Просматриваем свои папки модулей

    
    $I = 0
    $ModPath = $env:PSModulePath -split ';'
    $ModPath |
      Foreach-Object {
        "[{0:N0}]   {1}" -f $I++, $_
      }
    		
  6. Проверяем свои модули

    
    $TotalCommands = 0
    Foreach ($Path in $ModPath){
      Try { $Modules = Get-ChildItem -Path $Path -Directory -ErrorAction Stop 
            "Checking Module Path:  [$Path]"
      }
      Catch [System.Management.Automation.ItemNotFoundException] {
        "Module path [$path] DOES NOT EXIST ON $(hostname)"
      }
      $CmdsInPath = 0
      Foreach ($Module in $Modules) {
        $Cmds = Get-Command -Module ($Module.name)
        $TotalCommands += $Cmds.Count
      }
    }
    		
  7. Просматриваем значение общего числа команд и модулей

    
    $Mods = (Get-Module * -ListAvailable | Measure-Object).count
    "{0} modules providing {1} commands" -f $Mods,$TotalCommands
    		

Как это работает...

На Шаге 1 вы изучаете значение переменной $PSVersionTable для просмотра сведений значения версии для PowerShell 7, которые выглядят как- то так:

 

Рисунок 1-12


Проверка сведений версии для PowerShell 7

Программа установки PowerShell 7 устанавливает в папку (по умолчанию), отличающуюся от той, которая используется Windows PowerShell. На Шаге 2 вы видите суммарные сведения о тех файлах, которые установлены в папке установки PowerShell 7 следующим образом:

 

Рисунок 1-13


Изучение папки установки

PowerShell 7 хранит значения конфигурации в файле JSON в папке установки PowerShell 7. На Шаге 3 вы видите содержимое этого файла:

 

Рисунок 1-14


Просмотр JSON файла конфигурации

На Шаге 4 вы просматриваете политику выполнения PowerShell 7:

 

Рисунок 1-15


Проверка политики выполнения PowerShell 7

Как и в случае с Windows PowerShell, PowerShell 7 загружает команды из модулей. PowerShell для определения в каких папках PowerShell 7 хранятся эти модули файлов применяет свою переменную $PSModulePath. Просмотр содержимого и изучение папок на Шаге 5 выглядит так:

 

Рисунок 1-16


Просмотр папок модулей

С определёнными так папками (по умолчанию), вы можете проверить сколько команд имеется в каждой из папок, на Шаге 6 их вывод выглядит подобно этому:

 

Рисунок 1-17


Проверка того, сколько команд имеется в каждой из папок модулей

На Шаге 7 вы можете просмотреть результаты того, сколько команд имеется в каждом из модулей в каждом из путей модулей. Вывод выглядит примерно так:

 

Рисунок 1-18


Просмотр общего числа модулей и команд

Есть кое- что ещё...

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

На Шаге 4 вы просматриваете политику выполнения PowerShell 7. При каждом запуске PowerShell 7, он считывает соответствующий файл JSON для получения необходимых значений политики выполнения. Вы можете применять командлет политики Set-Execution для немедленного сброса установленной политики, или изменить это значение в своём файле JSON и перезапустить консоль PowerShell.

На Шаге 5 вы просматриваете подробности папок, которые PowerShell 7 применяет для поиска модуля (по умолчанию). Самая первая папка это ваши персональные модули, за ними следуют PowerShell и потом модули Windows PowerShell. Мы рассмотрим более подробно совместимость модулей Windows PowerShell и PowerShell в Главе 2, Введение в PowerShell 7.

Построение файлов профиля PowerShell 7

В Windows PowerShell и PowerShell 7 файлы профиля это сценарии PowerShell, которые PowerShell исполняет всякий раз когда вы запускаете новый экземпляр PowerShell (будь то консоль, ISE или VS Code). Эти файлы позволяют вам выполнять предварительное конфигурирование PowerShell 7. Вы можете добавлять переменные, PSDrives PowerShell, функции и дополнительно применяемые профили. Что касается данной книги, вы выгружаете и устанавливаете изначальные файлы профиля на основе образцов, которые вы можете выгружать из GitHub.

Этот рецепт выгружает и устанавливает необходимые файлы профиля для нашей консоли PowerShell 7.

Подготовка

Вы можете выполнить этот рецепт в SRV1 после установки вами PowerShell 7.

Как это сделать...

  1. Обнаруживаем имена файлов своих профилей

    
    $ProfileFiles = $PROFILE | Get-Member -MemberType NoteProperty
    $ProfileFiles | Format-Table -Property Name, Definition
    		
  2. Проверяем присутствие каждого файла профиля PowerShell

    
    Foreach ($ProfileFile in $ProfileFiles){
      "Testing $($ProfileFile.Name)"
      $ProfilePath = $ProfileFile.Definition.split('=')[1]
      If (Test-Path $ProfilePath){
        "$($ProfileFile.Name) DOES EXIST"
        "At $ProfilePath"
      }
      Else {
        "$($ProfileFile.Name) DOES NOT EXIST"
      }
      ""
    }
    		
  3. Отображаем значение профиля текущего пользователя/ текущего хоста

    
    $CUCHProfile = $PROFILE.CurrentUserCurrentHost
    "Current User/Current Host profile path: [$CUCHPROFILE]"
    		
  4. Создаём профиль текущего пользователя/ текущего хоста для своей консоли PowerShell 7

    
    $URI = 'https://raw.githubusercontent.com/doctordns/PACKT-PS7/master/' +
           'scripts/goodies/Microsoft.PowerShell_Profile.ps1'
    New-Item $CUCHProfile -Force -WarningAction SilentlyContinue |
       Out-Null
    (Invoke-WebRequest -Uri $URI).Content | 
      Out-File -FilePath  $CUCHProfile
    		
  5. Выходим из своей консоли PowerShell 7

    
    Exit
    		
  6. Перезапускаем свою консоль PowerShell 7 и просматриваем получаемый вывод профиля при запуске

    
    Get-ChildItem -Path $Profile
    		

Как это работает...

На Шаге 1 вы обнаруживаете значения названий каждого из четырёх файлов профилей (для нашей консоли PowerShell ), затем просматриваете их названия и местоположение (то есть, их определение), что выглядит так:

 

Рисунок 1-19


Выявление имеющихся названий файлов профилей

На Шаге 2 вы проверяете какие из этих файлов профиля, когда они имеются, существуют, что выглядит следующим образом:

 

Рисунок 1-20


Проверка на присутствие файлов профилей PowerShell

На Шаге 3 вы получаете и отображаете значение названия файла для файла профиля текущего пользователя/ текущего хоста, и это представляется так:

 

Рисунок 1-21


Обнаружение файла профиля текущего пользователя/ текущего хоста

На Шаге 4 вы создаёте изначальный файл профиля текущего пользователя/ текущего хоста. Этот файл является частью того репозитория GitHub, который поддерживает данную книгу. На Шаге 5 вы покидаете свою текущую консоль PowerShell 7 хоста. Эти шаги не предоставляют никакого вывода.

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

 

Рисунок 1-22


Файл профиля в действии

Есть кое- что ещё...

На Шаге 4 вы выгружаете образец файла профиля с GitHub. Этот образец файла профиля содержит персонализацию для конфигурации консоли PowerShell, включая изменение стартовой папки по умолчанию (на C:\Foo) и создание некоторых псевдонимов, устройств PowerShell и объекта полномочий. Этот представленный образец содержимого вы можете рассматривать включённым в файл профиля вашей консоли. Обратите внимание на то, что устанавливаемый вами в нашем следующем рецепте VS Code применяет отдельный файл профиля текущего пользователя/ текущего хоста, что делает для вас возможной различную персонализацию PowerShell в консоли и в VS Code.

Установка VS Code

ISE Windows PowerShell был великолепным инструментом, который Microsoft впервые ввёл в Windows PowerShell v2 (и чрезвычайно улучшил в v3). Этот инструмент обогатил завершённость функциональности и Microsoft не имеет планов по его дальнейшей разработке.

Однако, его замещает Visual Studio Code, или VS Code. Этот инструмент с открытым исходным кодом предоставляет расширенный диапазон функциональных возможностей для профессионалов ИТ и всех прочих. Для ИТ профессионалов это должен быть редактор вашего выбора. Хотя и существует некая кривая обучения (как и для всякого прочего продукта), VS Code содержит все те свойства, которые вы можете находить в ISE и даже больше.

VS Code, а также доступные для него расширения, работают над развитием. Всякий новый выпуск привносит дополнительные функциональные возможности, которые могут быть весьма ценными. Последнее добавление от Draw.io, например, это возможность создания схем непосредственно в VS Code. Загляните в следующий пост для дополнительных сведений относительно этого инструмента схем: https://tfl09.blogspot.com/2020/05/over-weekend-i-saw-tweet-announcing-new.html.

Имеется большое число прочих расширений, которые вы могли бы применять, в зависимости от своих рабочих процессов. Для получения дополнительных сведений относительно VS Code обращайтесь к https://code.visualstudio.com/.

За подробными сведениями относительно большого числа расширений VS Code вы можете обратиться к https://code.visualstudio.com/docs/editor/extension-marketplace.

Подготовка

Вы можете выполнить этот рецепт в SRV1 после установки вами PowerShell 7 и создания файла профиля консоли.

Как это сделать...

  1. Выгрузите сценарий установки VS Code из Галереи PowerShell

    
    $VSCPATH = 'C:\Foo'
    Save-Script -Name Install-VSCode -Path $VSCPATH
    Set-Location -Path $VSCPATH
    		
  2. Выполните этот сценарий установки и добавьте некоторые популярные расширения

    
    $Extensions =  'Streetsidesoftware.code-spell-checker',
                   'yzhang.markdown-all-in-one',
                   'hediet.vscode-drawio'
    $InstallHT = @{
      BuildEdition         = 'Stable-System'
      AdditionalExtensions = $Extensions
      LaunchWhenDone       = $true
    }             
    .\Install-VSCode.ps1 @InstallHT
    		
  3. Покиньте VS Code. Закройте окно VS Code.

  4. Перезапустите VS Code в качестве администратора.

    Кликните по клавише Windows и наберите code, что доставит в панель Start Windows плитку VS Code. Затем кликните по этой плитке VS Code и выберите Run as Administrator для запуска VS Code от имени администратора.

  5. Откройте новое окно терминала VS Code. Внутри VS Code нажмите Ctrl + Shift + `.

  6. Для VS Code создайте новый профиль текущего пользователя/ текущего хоста

    
    $SAMPLE = 
      'https://raw.githubusercontent.com/doctordns/PACKT-PS7/master/' +
      'scripts/goodies/Microsoft.VSCode_profile.ps1'
    (Invoke-WebRequest -Uri $Sample).Content |
      Out-File $Profile
    		
  7. Обновите настройки своего пользователя для VS Code

    
    $JSON = @'
    {
      "workbench.colorTheme": "PowerShell ISE",
      "powershell.codeFormatting.useCorrectCasing": true,
      "files.autoSave": "onWindowChange",
      "files.defaultLanguage": "powershell",
      "editor.fontFamily": "'Cascadia Code',Consolas,'Courier New'",
      "workbench.editor.highlightModifiedTabs": true,
      "window.zoomLevel": 1
    }
    '@
    $JHT = ConvertFrom-Json -InputObject $JSON -AsHashtable
    $PWSH = "C:\\Program Files\\PowerShell\\7\\pwsh.exe"
    $JHT += @{
      "terminal.integrated.shell.windows" = "$PWSH"
    }
    $Path = $Env:APPDATA
    $CP   = '\Code\User\Settings.json'
    $Settings = Join-Path  $Path -ChildPath $CP
    $JHT |
      ConvertTo-Json  |
        Out-File -FilePath $Settings
    		
  8. Создайте закладку для VS Code

    
    $SourceFileLocation  = "$env:ProgramFiles\Microsoft VS Code\Code.exe"
    $ShortcutLocation    = "C:\foo\vscode.lnk"
    # Create a  new wscript.shell object
    $WScriptShell        = New-Object -ComObject WScript.Shell
    $Shortcut            = $WScriptShell.CreateShortcut($ShortcutLocation)
    $Shortcut.TargetPath = $SourceFileLocation
    #Save the Shortcut to the TargetPath
    $Shortcut.Save()
    		
  9. Создайте закладку для PowerShell 7

    
    $SourceFileLocation  = "$env:ProgramFiles\PowerShell\7\pwsh.exe"
    $ShortcutLocation    = 'C:\Foo\pwsh.lnk'
    # Create a new wscript.shell object
    $WScriptShell        = New-Object -ComObject WScript.Shell
    $Shortcut            = $WScriptShell.CreateShortcut($ShortcutLocation)
    $Shortcut.TargetPath = $SourceFileLocation
    # Save the Shortcut to the TargetPath
    $Shortcut.Save()
    		
  10. Создайте и обновите некую схему XML

    
    $XML = @'
    <?xml version="1.0" encoding="utf-8"?>
    <LayoutModificationTemplate
      xmlns="http://schemas.microsoft.com/Start/2014/LayoutModification"
      xmlns:defaultlayout=
        "http://schemas.microsoft.com/Start/2014/FullDefaultLayout"
      xmlns:start="http://schemas.microsoft.com/Start/2014/StartLayout"
      xmlns:taskbar="http://schemas.microsoft.com/Start/2014/TaskbarLayout"
      Version="1">
    <CustomTaskbarLayoutCollection>
    <defaultlayout:TaskbarLayout>
    <taskbar:TaskbarPinList>
     <taskbar:DesktopApp DesktopApplicationLinkPath="C:\Foo\vscode.lnk" />
     <taskbar:DesktopApp DesktopApplicationLinkPath="C:\Foo\pwsh.lnk" />
    </taskbar:TaskbarPinList>
    </defaultlayout:TaskbarLayout>
    </CustomTaskbarLayoutCollection>
    </LayoutModificationTemplate>
    '@
    $XML | Out-File -FilePath C:\Foo\Layout.Xml
    		
  11. Импортируйте файл XML своей стартовой схемы

    
    Import-StartLayout -LayoutPath C:\Foo\Layout.Xml -MountPath C:\
    		
  12. Завершите сеанс

    
    logoff.exe 
    		
  13. Снова зарегистрируйтесь в Windows и посмотрите на панель задач

  14. Запустите консоль PowerShell через созданную закладку

  15. Запустите VS Code из новой закладки в панели задач и просмотрите исполнение соответствующего файла профиля

    
    > 
    		

Как это работает...

На Шаге 1 вы выгружаете сценарий установки VS Code из Галереи PowerShell. Этот этап не предоставляет никакого вывода.

На Шаге 2 вы запускаете выгруженный сценарий установки и добавляете три особых расширения. Выполнение данного этапа в консоли PowerShell 7 выглядит примерно так:

 

Рисунок 1-23


Запуск необходимого сценария установки и добавление некоторых расширений

После запуска VS Code вы обнаружите первоначальное открытие окна, которое выглядит следующим образом:

 

Рисунок 1-24


Приветственное окно VS Code

На Шаге 3 вы закрываете это окно. Затем, на Шаге 4, вы запускаете VS Code в качестве администратора. На Шаге 5 вы открываете новый Терминал VS Code и запускаете PowerShell , который теперь выглядит так:

 

Рисунок 1-25


Запуск PowerShell в VS Code

На Шаге 6 вы создаёте образец файла профиля VS Code. Расширение PowerShell VS Code применяет этот файл профиля при открытии некого файла .ps1. Данный шаг не выдаёт никакого вывода.

На Шаге 7 вы обновляете некоторые параметры времени выполнения VS Code. На Шаге 8 вы создаёте закладку для VS Code, а на Шаге 9 вы создаёте закладку для консоли PowerShell . Вы применяете эти закладки позднее в данном рецепте для создания закладок в своей панели задач Windows.

На Шаге 10 вы обновляете тот XML, который описывает панель задач Windows для добавления созданных вами ранее закладок на VS Code и консоль PowerShell. На Шаге 11 вы импортируете обновлённое описание панели задач обратно в Windows. Этот этап не производит как такового никакого вывода.

Далее, на Шаге 12 вы выходите из Windows. На Шаге 13 вы повторно регистрируетесь и замечаете обновлённую панель задач, которую можно наблюдать здесь:

 

Рисунок 1-26


Обновление панели задач закладками

На Шаге 14 вы открываете свою консоль PowerShell 7, что выглядит так:

 

Рисунок 1-27


Консоль PowerShell 7 (из закладки)

На Шаге 15 вы открываете VS Code, что выглядит следующим образом:

 

Рисунок 1-28


VS Code (из закладки)

Есть кое- что ещё...

На Шаге 2 вы устанавливаете VS Code и три дополнительных расширения. Устанавливаемое расширение Streetsidesoftware.code-spell-checker предоставляет проверку орфографии для ваших сценариев и прочих файлов. Следующее расширение yzhang.markdown-all-in-one поддерживает применение Markdown {облегчённого языка разметки}. Это расширение полезно когда, например, вы пишите документацию в GitHub или обновляете имеющиеся общедоступные справочные сведения PowerShell 7. Ещё одно расширение hediet.vscode-drawio позволяет вам создавать богатые схемы непосредственно в VS Code посетите Marketplace VS Code для получения дополнительных сведений по этому и прочим расширениям.

На Шаге 4 вы убеждаетесь что выполняете VS Code в качестве администратора. Некий код требует этого и отказывает вам когда вы не исполняете PowerShell (внутри VS Code) от имени администратора.

На Шаге 5 вы открываете некий терминал внутри VS Code. В VS Code такой "терминал" изначально это консоль PowerShell. Вы можете наблюдать получаемый вывод результатов запуска соответствующего файла профиля для Windows PowerShell. Именно этот терминал вы наблюдаете по умолчанию внутри VS Code.

На Шаге 7 вы обновляете и сохраняете некоторые настройки своего VS Code. Обратите внимание, что на этом шаге вы сообщаете VS Code где обнаруживать ту версию PowerShell, которую вы бы желали запускать. Если вы пожелаете, вы можете изменить это запуск на версию предварительного просмотра PowerShell или даже на ежедневную сборку.

Заметьте, что VS Code, по существу, обладает в игре двумя файлами профилей PowerShell. Когда вы открываете VS Code в нём самом, вы получаете тот терминал, который вы наблюдали на Шаге 5 - это ваш терминал по умолчанию. VS Code PowerShell запускает отдельный терминал всякий раз, когда вы открываете некий файл .ps1. В этом случае VS Code запускает особый для него профиль, который вы установили на Шаге 6.

На Шаге 8 и Шаге 9 вы создаёте закладки для VS Code и консоли PowerShell. На Шаге 10 вы обновляете схему панели задач Windows для включения в неё созданных закладок. К сожалению, вам придётся покинуть сеанс (что вы и выполняете на Шаге 12 перед тем как вы зарегистрируетесь обратно, когда вы сможете применять эти две закладки.

Установка шрифта Cascadia Code

В качестве части запуска VS Code Microsoft также создал новый и бесплатный шрифт, который вы можете выгружать и применять как в своей консоли PowerShell, так и внутри VS Code. Данный рецепт показывает как вы можете выгрузить этот шрифт, установить его и настроить этот шрифт по умолчанию\ для VS Code.

Подготовка

Вы можете выполнить этот рецепт в SRV1 после установки вами как PowerShell 7, так и VS Code.

Как это сделать...

  1. Получаем местоположение выгрузки для своего шрифта Cascadia Code

    
    $CascadiaFont    = 'Cascadia.ttf'    # font file name
    $CascadiaRelURL  = 'https://github.com/microsoft/cascadia-code/releases'
    $CascadiaRelease = Invoke-WebRequest -Uri $CascadiaRelURL # Get all
    $CascadiaPath    = "https://github.com" + ($CascadiaRelease.Links.href | 
                          Where-Object { $_ -match "($CascadiaFont)" } | 
                            Select-Object -First 1)
    $CascadiaFile    = "C:\Foo\$CascadiaFont"
    		
  2. Выгружаем файл шрифта Cascadia Code

    
    Invoke-WebRequest -Uri $CascadiaPath -OutFile $CascadiaFile
    		
  3. Устанавливаем шрифт Cascadia Code

    
    $FontShellApp = New-Object -Com Shell.Application
    $FontShellNamespace = $FontShellApp.Namespace(0x14)
    $FontShellNamespace.CopyHere($CascadiaFile, 0x10)
    		
  4. Перезапускаем VS Code, кликнув по закладке в панели задач

    
    > 
    		

Как это работает...

На Шаге 1 вы обнаруживаете самую последнюю версию шрифта Cascadia Code, а на Шаге 4 выгружаете это шрифт.

На Шаге 3 вы устанавливаете полученный шрифт в Windows. Поскольку Windows не предоставляет никаких командлетов для выполнения установки шрифта, вы полагаетесь на более ранний объект COM Windows Shell.Application.

На Шаге 4 вы перезапускаете VS Code и замечаете, что новый шрифт выглядит подобно следующему:

 

Рисунок 1-29


Взглянем на новый шрифт

Есть кое- что ещё...

Как и во многих прочих моментах при персонализации PowerShell 7, у вас имеется широкий диапазон шрифтов для применения их с VS Code. Шрифт Cascadia Code хорош собой, ясный шрифт и многим он нравится. Вы всегда можете изменить его, если он вам не приглянулся.

Изучение PSReadLine

PSReadLine это модуль PowerShell, который предоставляет дополнительные функциональные возможности редактирования в консоли как внутри PowerShell 7, так и внутри PowerShell. Это модуль предоставляет практику редактирования в командной строке, которая сопоставима с наилучшими оболочками командной строки Linux (такими как Bash).

Когда вы выполняете набор в консоли PowwerShell, PSReadLine перехватывает ваши нажатия клавиш для предоставления контроля синтаксиса, простейшего уведомления о синтаксических ошибках и много чего ещё. PSReadLine позволяет вам персонализировать вашу среду для её подгонки под ваши личные предпочтения. Некоторые ключевые функциональные возможности этого модуля составляют:

  • Синтаксический контроль записей командной строки

  • Редактирование множества строк

  • Управление историей

  • Настраиваемые привязки клавиш

  • Высокая настраиваемость

За обзором PSReadLine обратитесь к https://docs.microsoft.com/powershell/module/psreadline/about/about_psreadline. А дополнительные подробности вы можете увидеть в файле README GitHub PSReadLine: https://github.com/PowerShell/PSReadLine/blob/master/README.md.

Некая важная проблема имеется относительно именования этого модуля. Первоначальным названием данного модуля было PSReadline. В некий момент времени разработчики этого модуля изменили его название на PSReadLine (изменив на заглавный символ L в самом названии модуля).

Сам модуль PSReadLine поставляется естественным образом с PowerShell 7. При запуске, обе консоли, и VS Code, и PowerShell импортируют PSReadLine с тем, чтобы он был готов к применению. Вы также можете пользоваться PSReadLine в Windows PowerShell. Для упрощения обновлений подсказок этого модуля, рассмотрите возможность переименования данного модуля на заглавную L в PSReadLine.

Работа над PSReadLine находится в её развитии. Microsoft инкорпорировал самую раннюю версию данного модуля внутри Windows PowerShell v3. Windows PowerShell 5.1 (а также его ISE) внутри Windows Server снабжаются PSReadLine v2. Если вы всё ещё пользуетесь более ранними версиями PowerShell, вы можете выгрузить и применять самую последнюю версию PSReadLine.

Данный модуль улучшился и, по сравнению с выпуском v2 этого модуля, были внесены некоторые изменения, не имеющие обратной совместимости. Многие статьи блогов, к примеру, пользуются более ранним синтаксисом для Set-PSReadLineOption, который отказывает в версии 2 (и последующих) данного модуля. Вы можете всё ещё наблюдать такой старый синтаксис, когда вы пользуетесь механизмом поиска для обнаружения примеров. Кроме того, некоторые из примеров в данном рецепте будут отказывать, если запустите их при помощи PSReadLine v1 (выполненным со старым синтаксическим анализом имён модуля).

Подготовка

Вы можете выполнить этот рецепт в SRV1 после установки вами как PowerShell 7, VS Code и нашего шрифта Cascadia Code (а также после персонализации своей среды).

Как это сделать...

  1. Получаем необходимые команды в модуль PSReadLine

    
    Get-Command -Module PSReadLine
    		
  2. Получаем самые первые 10 обработчиков клавиш PSReadLine

    
    Get-PSReadLineKeyHandler |
      Select-Object -First 10 |
        Sort-Object -Property Key |
          Format-Table -Property Key, Function, Description
    		
  3. Подсчитываем число не привязанных обработчиков клавиш

    
    $Unbound = (Get-PSReadLineKeyHandler -Unbound).count
    "$Unbound unbound key handlers"
    		
  4. Получаем параметры PSReadLine

    
    Get-PSReadLineOption
    		
  5. Определяем название темы своего VS Code

    
    $Path       = $Env:APPDATA
    $CP         = '\Code\User\Settings.json'
    $JsonConfig = Join-Path  $Path -ChildPath $CP
    $ConfigJSON = Get-Content $JsonConfig
    $Theme = $ConfigJson | 
               ConvertFrom-Json |
                 Select-Object -ExpandProperty 'workbench.colorTheme'
    		
  6. Изменяем цветовую схему когда название темы Visual Studio Light

    
    If ($Theme -eq 'Visual Studio Light') {
      Set-PSReadLineOption -Colors @{
        Member    = "`e[33m"
        Number    = "`e[34m"
        Parameter = "`e[35m"
        Command   = "`e[34m"      
      }
    }
    		

Как это работает...

На Шаге 1 вы видите команды в своём модуле PSReadLine, которые выглядят так:

 

Рисунок 1-30


Просмотр команд в модуле PSReadLine

На Шаге 2 вы отображаете применяемые в настоящее время самые первые 10 обработчиков клавиш, что отображается ниже:

 

Рисунок 1-31


Отображение самых первых 10 обработчиков клавиш PSReadLine

PSReadLine предоставляет более 160 внутренних функций, к которым вы можете привязывать комбинации клавиш, на Шаге 3 вы выявляете сколько функций в данный момент не привязаны, что представляется следующим образом:

 

Рисунок 1-32


Обнаружение числа не привязанных обработчиков клавиш

На Шаге 4 вы просматриваете параметры PSReadLine, которые вы можете наблюдать тут:

 

Рисунок 1-33


Получение параметров PSReadLine

На Шаге 5 и на Шаге 6 вы определяете текущее название темы VS Code и обновляете цвета, применяемые PSReadLine для лучшей ясности. Эти два шага не производят никакого вывода, хотя вы и можете наблюдать изменение отображаемых цветов определённых синтаксических лексем PowerShell (для того чтобы увидеть эти изменения, выполните Get-PSReadLineOption).

Есть кое- что ещё...

На Шаге 1 вы представляете команды внутри модуля PSReadLine. Функция PSConsoleHostReadLine выступает точкой входа для функциональности этого модуля. Когда запускается консоль PowerShell, она загружает данный модуль и активирует данную функцию PSConsoleHostReadLine.

Одним из небольших недостатков PSReadLine является то, что он не работает должным образом со всеми программами чтения экрана Windows. По причинам доступности, когда консоль PowerShell определяет что вы пользуетесь какой- то программой считывания экрана, процесс запуска вашей консоли не загружает PSReadLine. Вы всегда можете загрузить PSReadLine вручную, либо в самой консоли, либо через обновление своего профиля (профилей) запуска.

На Шаге 2 вы просматриваете обработчики клавиш, применяемые в настоящее время PSReadLine. Каждый обработчик соответствует некой комбинации клавиш (к примеру, Ctrl + L) для одной из более чем 160 внутренних функций PSReadLine. По умолчанию, Ctrl + L соответствует функции ClearScreen - когда вы нажимаете эту последовательность клавиш, PSReadLine очищает ваш экран в консоли.

На Шаге 5 и на Шаге 6 вы определяете название темы VS Code и регулируете цветовую схему под свои предпочтения. До некоторой степени, PSReadLine и темы VS Code могут в результате приводить затруднительные для чтения сочетания. В таком случае вы можете настаивать на определённых настройках в своём файле профиля VS Code и изменять устанавливаемую цветовую схему под соответствие своим вкусам.