Глава 1. Введение в PowerShell Core
Содержание
PowerShell Core, в качестве альтернативы с открытым исходным кодом для Windows PowerShell, из которого он и развился, быстро становится выбором механизма автоматизации для множества администраторов, а также и разработчиков. Будучи истинной кросс- платформенной оболочкой, PowerShell Core исключительно подходит для множества различных типов операционных систем и рабочих нагрузок.
Хотя следующая за имевшей место на момент написания книги итерация PowerShell Core была намечена на май 2019 и она снизит версию Core, сама данная книга и её рецепты останутся точными и полезными. Новый выпуск PowerShell это всего лишь ребрендинг для унификации разработки PowerShell. В будущем мы продолжим видеть быстрые новые итерации PowerShell. {Прим. пер.: по состоянию на 01 июня 2019 последняя доступная версия - 6.2.1}
Хотя установка PowerShell Core охожа на лёгкий бриз, сами первые шаги для новичков в PowerShell могут стать значительным вызовом. Этой главой я ставлю цель навести мосты над этими небольшими зазорами в знаниях и протянуть вам канаты.
Вы узнаете всё что вам требуется знать относительно установки и работы с PowerShell Core и разберётесь с cmdlet, необходимыми для поиска собственного пути в любой из систем, в которой запускается PowerShell Core. Помимо этого, вы узнаете как получать подсказки без того чтобы прибегать к Интернету и выполняя всё полностью пребывая в PowerShell.
Данная глава предназначена новичкам, которые мало знакомы с PowerShell Core и поможет вам понять самые основы PowerShell, в то время как все последующие главы предполагают основательные знания по сценариям.
В этой главе мы рассмотрим следующие рецепты:
-
Установку PowerShell Core в Windows
-
Установку PowerShell Core в Linux
-
Запуск PowerShell Core
-
Получение подсказки
-
Обзор
-
Как работает cmdlet?
-
Выполнение операций ограниченных чтением
-
Внесение изменений в систему
-
Исследование среды
Для того чтобы следовать рецептам данной главы вам требуется некач машина, способная запускать PowerShell Core, которая имеет подключение к Интернет.
В этом рецепте вы изучите как предоставлять PowerShell Core в системах Windows начиная с Windows 6.1 (Server 2008 R2/Windows 7).
Для прохождения данного рецепта вам понадобится машина с по крайне мере Windows Server 2008 R2 или Windows 7. Если данная машина не подключена к Интернету, ва требуется изыскать способ пренесения необходимого установщика на эту машину.
Пожалуйста, выполите следующие шаги:
-
Для получения самого последнего выпуска PowerShell Core для Windows перейдите в https://github.com/powershell/powershell:
-
Выгрузите необходимую для вашей платфорvы редакцию. Я рекомендую по возможности воспользоваться стабильной версией с 64 битами (x64).
-
Откройте сам файл установки, например,
PowerShell-6.2.1-win-x64.msi
. -
Для установки PowerShell Core следуюте появляющимся на экране инструкциям.
-
В своей заключительной странице вы можете, если пожелаете, напрямую разрешить удалённый PowerShell. В данный момент оставьте этот параметр отключённым; вы настроете его подобающим образом позднее:
-
Pfgecnbnt PowerShell Core набрав
pwsh
в панели поиска!
При помощи стандартного метода установки MSI, PowerShell Core будет установлен для вашей системы по умолчанию в
64- битном каталоге Program Files
. Он не замещает Windows PowerShell , а вместо
этого продолжает мирно сосуществовать и содержать самые последние обновления для PowerShell.
Если оставить настройки устанавливаемыми по умолчанию, в вашей системе будет зарегистрирован некий манифест событий,
который включит регистрацию событий для PowerShell Core. Этот журнал будет помещён в
%SystemRoot%\System32\Winevt\Logs\PowerShellCore%4Operational.evtx
и его можно найти
в Applications and Services Logs
.
По умолчанию не выполняется настройка для удалённого доступа. Мы обсудим удалённую работу в Главе 8, Удалённое и Просто достаточное администрирование, в которой мы включим удалённый PowerShell для некой системы.
Помимо самой установки, которую вы можете выгружать и устанавливать вручную или посредством множества решений разработки программного обеспечения, вы также можете применять Chocolatey. Chocolatey является исходным пакетом NuGet для исполняемых пакетов и может применяться для начальной раскрутки в системе программного обеспечения.
Приводимые ниже шаги установят Chocolatey и PowerShell Core в системе Windows. Для самой инициализации процесса этим шагам требуется применение Windows PowerShell:
-
В Windows PowerShell выполните такую команду (подробности в https://chocolatey.org/docs/installation):
Set-ExecutionPolicy Bypass -Scope Process -Force iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
-
После установки Chocolatey просто выполните
choco install powershell /y
-
Запустите PowerShell Core отыскав
pwsh
через панель поиска!
Если вы предрасположены к этому, также имеется вариант компиляции всего кода с нуля. Просто следуйте приводимому ниже руководству, размещаемому в репозитории GitHub для выполнения этого:
# Клонируйте сам репозиторий
git clone https://github.com/powershell/powershell
Set-Location -Path .\powershell
Import-Module ./build.psm1
# Убедитесь что у вас имеется самая последняя версия .NET Core и прочие необходимые компоненты
Start-PSBootStrap
# Запустите сам процесс построения
Start-PSBuild
# Либо напрямую запустите PowerShell ...
& $(Get-PSOutput)
# ...либо скопируйте его в предпочитаемое вами место (здесь: Program Files в Windows, требуются необходимые права доступа)
$source = Split-Path -Path $(Get-PSOutput) -Parent
$target = "$env:ProgramFiles\PowerShell\$(Get-PSVersion)"
Copy-Item -Path $source -Recurse -Destination $target
С момента появления PowerShell Core его ключевой особенностью была возможность исполнения на множестве платформ и обеспечивать в точности тe же самую практику работы в любой операционной системе. Установка PowerShell в Linux почти так же проста, как и в Windows. Если ваш дистрибутив входит в список поддерживаемых дистрибутивов, таких как CentOS, openSUSE или Ubuntu, процесс довольно прост.
Для прохождения данного рецепта вам потребуется любой дистрибутив Linux (даже подсистема Windows для Linux), который предпочтительно подключён к Интернету и способен выгружать пакеты. Я применяю CentOS и Ubuntu чтобы показать некие весьма различные подходы.
На момент написания книги данный рецепт был правильным. Тем не менее, проверьте его применимость на официальной странице установки для вашей операционной системы, нпример, на https://docs.microsoft.com/en-us/powershell/scripting/setup/installing-powershell-core-on-linux.
В CentOS 7.x выполните следующие шаги:
-
Зарегистрируйте репозиторий RPM Microsoft:
curl https://packages.microsoft.com/config/rhel/7/prod.repo | sudo tee /etc/yum.repos.d/microsoft.repo.
-
Установите сам пакет:
sudo yum install -y powershell
-
Запустите PowerShell исполнив
pwsh
, который теперь установлен.
В платформе Ubuntu 18.10 выполните сдедующие шаги:
-
Откройте Ubuntu Software store.
-
Отыщите
powershell
:
-
Установите и запустите PowerShell Core:
Все шаги установки PowerShell в прочих дистрибутивах достаточно похожи по мере того как вы можете применять ваши
системы управления пакетами дистрибутивов, такими как rpm
или
dpkg
.
Как правило, все инструкции установки для Linux требуют выполнения регистрации некого пакета репозиториев, который сопровождается Microsoft и применятес для публикации PowerShell Core. Эти настройки репозиторя содержать сам URL, некую ссылку на общедоступный ключ GPG и значение состояния этого репозитория.
В Linux исполняемые файлы обычно компилируются при помощи некого makefile в самой исполняемой ОС а заетм, например, связываются или копируются в один из путей исполняемых файлов (binary). Наилучшим примером этого, вероятно, является Gentoo, в котором компилируются ваше ядро и все на самом деле требуемые компоненты, библиотеки и программное обеспечение. С помощью пакетов RPM и DEB разработчики могут лучше разрешать зависимости и включать все требуемые инструкции для установки некого исполняемого пакета или компиляции какого- то иходного пакета.
В исполняемых (binary) пакетах все компоненты скомпилированы для конкретной архитектуры с установленными общими флагами компиляции. Хотя это и не позволяет конекретному пользователю выолнять тонкую настройку всех частей инсталяции, это предоставляет все преимущества простейшего развёртывания.
PowerShell поступает предварительно собранным, например, в виде некого пакета RPM для различных архитектур ОС. Применяя имеющееся средство управления пакетами поставщика данного дистрибутива, вы обеспечиваете установку всех необходимых зависимостей помимо собственно установки данного пакета.
В Ubuntu 18.10, PowerShell доступен в виде пакета Snap из Ubuntu Software store. Это делает установку PowerShell более дружественной и не требует восе командной строки - помимо применения самого PowerShell, естественно.
Существует множество разновидностей Linux - имеются macOS, Windows и, возможно, появятся прочие платформы. Оставайтесь информированными в состоянии текущего дня и поглядывайте в официальные инструкции установки.
-
Информация о формате пакета Snap
-
Официалный исходный пакет для пакетов PowerShell.
Применять PowerShell Core очень просто. Данный рецепт покажет вам самые первые шаги и поможет вам в запуске PowerShell Core после его установки.
Для выполнения данного рецепта вам следует иметь завершённой установку PowerShell Core для вашей операционной системы.
Давайте выполним следующие шаги:
-
В Windows запустите
pwsh.exe
. В Linux или macOS запускайтеpwsh
. -
Наберите свой первый cmdlet,
Get-Process
для выборки некого перечня запущенных в вашей системе процессов и нажмитеEnter
для подтверждения. -
Сопоставьте получаемый вывод этого cmdlet с выводом
tasklist
(в Windows) иps
(в Linux):
-
Наберите
Get-Date
и нажмитеEnter
в качечтве подтверждения. -
Сопоставьте полученный вывод с выводом
date /t
(в Windows)date
(в Linux):
-
Выполните такую строку:
Get-Process | Where-Object -Property WorkingSet -gt 100MB
. -
Снова сопоставьте её вывод с выводом
tasklist /FI "MEMUSAGE gt 102400"
(в Windows) иps -aux | awk -F" " '$5 > 102400'
(в Linux):
-
Наконец, выполните этот cmdlet:
Stop-Computer -WhatIf
. На этот раз нет команды ни в Windows, ни в Linux
PowerShell работает с командами как и все прочие оболочки сред. Внутренние команды PowerShell имеют название cmdlet. В отличии от команд прочих оболочек, cmdlet PowerShell обязаны обслуживать единственную цель и осуществлять лишь эту цель. Как всегда, имеются исключения из этого правила. В некоторых случаях переключатели командной строки, называемые параметрами переключения, могут применяться для переключения дополнительных функций.
Самый первый пример, Get-Process
возвращает (Get
-
получает) некий список исполняемых процесов (Process
). В то время как получаемый
формат вывода кажется аналогичным тому что выдаёт команда
tasklist
Windows,
PowerShell не просто возвращает текст, а выдаёт объекты .NET.
Наш второй пример, Get-Date
снова возвращает значения текущей даты и времени в виде
некого объекта .NET. В .NET время вычисляется в тиках, которые являются интервалами в 100 наносекунд, начиная с
0001-01-01 00:00:00. Получаемый вывод форматируется в зависимости от культуры вашей операционной системы и может изменяться по
запросу.
Наш третий пример имеет фильтр получаемого вывода для PowerShell, который очень просто сопоставляется как с Windows, так и
с Linux. В особенности ярким этот пример делают безграничные возможности работы в Linux с текстом. Применяемая команда
ps
не допускает большой фильтрации, а следовательно вам требуется полагаться на
подобные awk
инструменты для обработки возвращаемого текста. Данный пример задач
без PowerSell требует знания обработки текста и его фильтрации различными инструментами.
Самый последний пример, Stop-Computer
, демонстрирует очень распространённый во
многих cmdlet параметр с названием WhatIf
. Этот параметр позволяет вам просто
попробовать некий cmdlet прежде чем на самом деле выполнить что- то. Это исключительный способ для проверки изменений на
общую правильность, например, прежде чем изменить ваших 10 000 учётных записей пользователей Active Directory:
В PowerShell имеется ещё много чего посмотреть и сделать - часть этого мы обсудим в данной книге. Попробуйте следовать за последующими рецкптами чтобы узнать об обнаружении cmdlet, потоке между cmdlet и конвейером, и много иное.
-
Вся официальная относящаяся к PowerShell документация.
-
Learn PowerShell Core 6.0 Дэвида дас Нивса и Жан-Эндрик Питерса в качестве дополнительного пособия по изучению самого языка. {Прим. пер.: рекомендуем также наш перевод 2 издания Полного руководства Windows Server 2019 Джордана Краузе.}
Подсказка никогда не располагалась вдали от PowerShell и в этом разделе мы изучим как применять имеющуюся подсказку для вашей выгоды.
Чтобы следовать данному рецепту вам следует выполнить установку PowerShell в вашей операционной системе.
Выполните, пожалуйста, следующие шаги:
-
Откройте PowerShell Core.
-
Наберите cmdlet
Get-Help
и нажмитеEnter
. Данный cmdlet отобразит подсказку относительно самой системы подсказок. -
Воспользуйтесь параметром
-?
с любым из cmdlet, к примеру,Start-Process -?
. Обратите внимание на получаемый вывод после данного cmdlet. Вы можете видеть сам синтаксис этого cmdlet, а также некие дополнительные замечания:
-
Наберите команду
Get-Help Start-Process -Parameter FilePath
. Обратите внимание на вывод на этот раз. Возвращается лишь подсказка для параметраFilePath
. Из этого вывода вы можете видеть, что этот параметр обязателен, имеет два псевдонима и не выглядит как ввод конвейера:
-
Наберите команду
Get-Help Start-Process -Full
. Вы можете заметить, что файлы справки ещй пока не были выгружены. -
Наберите команду
Update-Help -Scope CurrentUser
для выгрузки всего текущего содержимого подсказок. -
Изучите содержимое папки
$home\Documents\PowerShell\Help
в Windows и~/.local/share/powershell
в Linux. -
Наберите команду
Update-Help -Module CimCmdlets -UICulture ja-jp,sv-se
. Обращаем ваше внимание что не все модули предоставляют локализацию содержимого подсказок - однако, содержимоеen-us
должно быть доступным для большинства модулей. -
Теперь, после того как выгружено содержимое подсказок, попробуйте снова
Get-Help Start-Process -Full
. -
Отметим, что теперь доступно всё содержимое, что делает для вас возможным получать информацию об cmdlet.
Имеющаяся система подсказок PowerShell Core может применяться для обновления файлов подсказок из самого Интернета или
из некого совместного ресурса CIFS
. Без обновления содержимого подсказок, имеющаяся
система подсказок всегда отображает название и синтаксис некого cmdlet, а также подробную справку по всем параметрам некого
cmdlet.
Для обновления подсказок модулей в вашей локальной системе Update-Help
опросит все
модули из переменной среды PSModulePath
чтобы отыскать все модули, имеющие
установленным свойство HelpInfoUri
. Он попытается разрешить данный URI, который должен
указывать на некий просматриваемый вебсайт, в котором он далее должен выглядеть как некий файл XML с названием
<ModuleName>_<ModuleGuid>_HelpInfo.xml
. Внутри этого файла XML хранится
местоположение файла Cabinet (*.cab
), который впоследствии и применяется для выгрузки
реального содержимого.
При помощи нового параметра Scope
, введённого в PowerShell Core, всё содержимое подсказок
будет помещаться в персональной папке пользователя, к примеру, в C:\Users\<UserName>\Documents\PowerShell
вместо папки для всей системы, которая требовала бы полномочий администратора, например,
C:\Program Files\PowerShell
.
Сам по себе cmdlet Update-Help
будет выгружать содержимое только один раз в день
при вызове cmdlet. Чтобы выгружать искомое содержимое более часто вы можете применять параметр
Force
.
Содержимое подсказок также может размещаться на площадку при помощи особого cmdlet Save-Help
и распространения своего содержимого. В системах Windows можно отыскать некую установку групповой политики, которая также способна
управлять значением пути по умолчанию для Update-Help
. Эта настройка хранится в
Administrative Templates | Windows Components | System | Windows PowerShell.
Данная установка допустима только для Windows PowerShell. Вне зависимости от применяемой редакции, сам cmdlet
Update-Help
поддерживает параметр SourcePath
для определения источника выгрузки содержимого его подсказки.
Чтобы предоставлять надлежащим образом ваше собственное содержимое подсказик взгляните на модуль
PlatyPS
. Этот модуль делает очень простым выработку содержимого подсказок для ваших
собственных модулей, упаковвая его в правильном формате, а также много чего ещё.
PlatyPS
поддерживает справки markdown, позволяя вам составлять справки очень
простым путём, который воспринимается более естественно, чем создание больших и сложных файлов
MAML
.
-
Модуль PowerShell для выработки содержимого подсказок.
В этом разделе мы изучим как обойти всё в любой системе запуская PowerShell Core через обнаружение cmdlet.
Чтобы следовать данному рецепту вам следует выполнить установку PowerShell в вашей операционной системе.
Выполните, пожалуйста, следующие шаги:
-
Откройте PowerShell Core.
-
Наберите команду
Get-Command
. Обратите внимание, что будут доступны все cmdlet из вашей системы. В зависимости от установленных в вашей системе модулей, их может быть очень много. -
Наберите
Get-Command New-Item -Syntax
. Отметим что на этот раз не будет вовращён определённый cmdlet, а только отобразится сам синтаксис:
-
Наберите
Get-Command -Verb Get -Module Microsoft.PowerShell.Utility
. Отметим что вовращаются все cmdlet, доступные только для чтения некого определённого модуля, что значительно сужает получаемые результаты:
-
Наберите
Get-Command -CommandType Application
. На этот раз возвращаются все внешние приложения (иными словами, исполняемые файлы - binaries). Попробуйте, где это возможно, применять натуральные cmdlet PowerShell вместо внешних приложений:
-
Наберите
Get-Command -ParameterName ComputerName,CimSession,PSSession
. Это одно из моих самых любимых; при помощи данного параметра выдаются только cmdlet, которые имеют определённые параметры. Для данного экземляра будут возвращены лишь cmdlet с возможностями удалённого доступа. Однако, данный параметр выполняет поиск только по всем cmdlet, доступным для данного текущего сеанса:
-
Наберите
Get-Command *Process,*Item
. Отметим, что теперь поиск по маске выполняется для всех cmdlet, которые присутсвуют в данной системе. -
Наберите
New-Alias -Name Start-Process -Value hostname
, а затем введитеGet-Command Start-Process
. В этот рах будет возвращён лишь псевдоним, действенно скрывая имеющийся cmdlet,Start-Process
-
Введите
Get-Command Start-Process -All
. В этот раз будут возвращены как сам псевдоним, так и первоначальный cmdlet.
PowerShell и его невероятно гибкая система легко выявляются при помощи Get-Command
.
Даже для бывалых экспертов PowerShell Get-Command
является бесценной, так как
она работает во всех систсемах, не требует дополнительного содержимого и сохранит ваше драгоценное время. Кроме того,
никто даже не в состоянии знать все существующие cmdlet - иногда вам всего лишь требуется быстро взглянуть на их
синтаксис.
Псевдонимы являются частью PowerShell, также как и cmdlet. порой некий псевдоним вводится когда такое название
некого cmdlet изменяется для поддержки обратной совместимости до некоторой степени. Прочие псевдонимы создаются просто
для более быстрой интерактивной работы или для более простой миграции из иного языка сценариев, например ьакие псевдонимы
как dir
и ls
.
Выполняя инспекцию манифестов модулей и определений модулей, Get-Command
способен обнаруживать экспортированные cmdlet некого модуля, которые составляют все доступные в системе cmdlet. Кроме того,
для выявления внешних приложений, таких как исполняемые файлы, библиотеки и текстовые файлы, применяется значение переменной
среды PATH
.
Вывод команды Get-Command
может фильтроваться с помощью символов маски для выявления
cmdlet, имеющих определённую цель, например, *Process
перечислит все cmdlet,
которые имеют нечто для работы с процессами.
Один из параметров, который всегда следует применять это параметр Syntax
.
Прочтение синтаксиса определённого cmdlet является простейшим способом определения того как можно применять этот
cmdlet, какие параметры обязательны для использования и как должны выглядеть его значения параметров.
Даже если вы обладающий опытом пользователь PowerShell, Get-Command
способен
помогать вам. Просто взгляните на тот объём данных, который может быть доступным для каждой команды при помощи
Format-List
. В дальнейшем мы также изучим и
Get-Member
:
# Дополнительно исследуйте некий cmdlet при помощи Format-List
Get-Command New-Item | Format-List -Property *
# Изучите прочие свойства, которые могут оказаться полезными
$cmd = Get-Command New-Item
# Откуда должно поступать содержимое справки данного cmdlet
$cmd.HelpUri
# Быстрый прыжок к местоположению модуля cmdlet
Set-Location -Path $cmd.Module.ModuleBase
# Сколько параметров имеет некий cmdlet содержащимися среди общих параметров?
$cmd.Parameters.Count
# Выявляние данных некого параметра, в данном случае выяснение того что
# New-Item допускает пустые строки или $null для передачи в значение параметра Name
$cmd.Parameters.Name
Взгляните на следующий снимок экрана того как выглядит вывод:
-
Информация относительно последовательности команд и того как
Get-Command
отображает свои результаты.
В противовес натуральным командам ОМ, таким как ps
в Linux, или
tasklist
в Windows, PowerShell применяет cmdlet. Такие cmdlet всегда следуют
одному и тому же, простому синтаксису. Более того, задание параметров и их значений также всегда работает одним тем же
образом для любого cmdlet.
Данный раздел поможет вам понять как работают cmdlet прежде чем глубоко погружаться в них в последующих главах.
Чтобы следовать данному рецепту вам следует выполнить установку PowerShell в вашей операционной системе.
Выполните, пожалуйста, следующие шаги:
-
Запустите PowerShell Core.
-
Наберите
New-Item -Path variable: -Name myVariable -Value "Isn't it great?"
-
Введите
$myVariable
.$myVariable
является переменной - временным пространством хранения для ваших данных. Простое исполнение этой переменной помещает её в вывод. -
Наберите
Get-ChildItem $home *.*
. Этот cmdlet не использует никаких имён параметров, а лишь значения параметров.$home
является встроенной переменной, а*.*
фильтрует все файлы, содержащие в названии точку. -
Наберите
Get-ChildItem *.txt $home
. На этот раз вы наблюдаете сообщение об ошибке. Вы не можете смешивать позиционные параметры. -
Введите
Get-ChildItem -Filter *.txt -Path $home
. За счёт названия параметра данный cmdlet вновь работает. -
Наберите
$processName = 'powershell'
. Назначение чего- то некой переменной, как в данном случае, сохранит результат в этой переменной. -
Наберите
Get-Process $processName
. -
Введите
Get-Process $pid
. В противоположность верному значению названия процесса, применение некого идентификатора вновь завершает неудачей данный cmdlet. -
Введите
Get-Process -Id $pid
. Применив верный параметр, мы вновь получили рабочий cmdlet. -
Наберите
Get-Command -Syntax -Name Get-Process
. Рассмотрите синтаксис данного cmdlet; имеется более одного способа исполнения cmdlet. Это имет название наборов параметров.
Естественные cmdlet PowerShell всегда обязаны в точности следовать одному и тому же синтаксису: глагол-существительное.
Значение глагола указывает само действие, а значение существительного указывает на того кто является получателем данного
действия. Будет ли это cmdlet New-Item
, либо Get-Process
,
их синтаксис всегда следует одному и тому же принципу.
При всём своём разнообразии применяемых параметров, полный вызов cmdlet может выглядеть подобно следующему образцу:
Get-ChildItem $home -Filter *.txt -File
Get-ChildItem
выступает в качестве названия самого cmdlet.
$home
является значением так называемого позиционного параметра,
Path
(пути). -Filter
применяется в качестве
названия определённого параметра, а *.txt
является значением, предоставляемым этому
параметру. -File
является чем- то, именуемым параметром переключателя, который
напоминает переключатель командной строки.
Очень часто PowerShell применяется для выборки данных с целью составления отчётов, экспорта и просмотра настроек и тому
подобного. Это обычно выполняется различными cmdlet Get
. В
Главе 2, Считывание и запись вывода мы потом увидим дополнительно
как обрабатывать получаемые данные.
Так как cmdlet Get
ничего не изменяет в вашей системе, это великолепный способ
исследовать что должен предлагать PowerShell.
Чтобы следовать данному рецепту вам следует выполнить установку PowerShell в вашей операционной системе. Некоторые cmdlet являются специфичными для Windows и требууют какой- то операционной системы Windows/
Выполните, пожалуйста, следующие шаги:
-
С помощью PowerShell Core вы можете применять в Windows множество встроенных cmdlet. попробуйте
Import-Module Storage -SkipEditionCheck
. -
В системе Windows наберите
Get-Disk
для перечисления всех дисков. Получаемый вывод должен выглядеть аналогично следующему:
-
В системе Windows введите
Get-Disk -Number 0 | Get-Partition
для выборки всех разделов на самом первом диске:
-
В любой из систем попробуйте cmdlet
Get-Uptime
для вычисления времени работы этой системы. -
Воспользуйтесь
Get-Culture
иGet-UICulture
для просмотра текущих настроек языка. -
Просмотрите получаемый от
Get-PackageProvider
результат. В системе Windows видны дополнительные поставщики.
PowerShell предоставляет доступ к некоторым различным источникам данных посредством cmdlet Get
.
После выборки полученных данных PowerShell обёртывает их в некую модель объекта, что позволяет вам сохранять, отображать,
фильтровать и обрабатывать эти данные.
В качестве такого источника данных может быть что угодно, начиная со служб, журналов событий и файлов вплоть до функций и переменных. Всякий получаемый элемент ызывается как некий объект и будет иметь различные свойства и методы, оторые мы будем применять в дальнейшем.
Только изучите Get-Command -Verb Get
чтобы найти все cmdlet доступные только для
чтения и просто взгляните на то чем являются возвращаемые значения. нет никакого вреда в этих попытках!
Вы пытаетесь создать вечный двигатель? Ради забавы заставьте PowerShell исполнить все cmdlet
Get
:
$ErrorActionPreference = 'SilentlyContinue'
Get-Command -Verb Get | ForEach-Object { & $_ }
Имеющийся оператор амперсанда (логического и, &) вызовет некое выражение. Выполняя итерации по всем cmdlet
Get
это выполнит возврат результатов от Get-Command
,
мы попробуем прочесть всё что мы можем получить в свои собственные руки. Имейте в виду, что это потербует значительного
времени.
Хотя обычно считывание данных это отлично, PowerShell также некоий великолепный механизм автоматизации, который способен изменять настройки системы. Мы изучим парочку cmdlet которые будут, в неком виде, изменять настройку вашей системы.
Чтобы следовать данному рецепту вам следует выполнить установку PowerShell в вашей операционной системе.Вам следует подготовить некую виртуальную машину для целей проверок, так как применяемые в данном рецепте cmdllet неумышленно изменят нистройку вашей системы.
Выполните, пожалуйста, следующие шаги:
-
Просмотрите вывод
Get-Command -Verb New,Set,Remove,Register,Unregister,Start,Stop
для обзора некоторых из наиболее часто применяемых cmdlet. -
Для создания некого временного файла исполните
$file = New-TemporaryFile
. -
Для изменения содержимого этого файла примените
'SomeContent' | Set-Content -Path $file
. -
Для добавления данных в самый конец этого файла данных воспользуйтесь
'More content!' | Add-Content -Path $file
. -
Просмотрите содержимое с помощью
$file | Get-Item | Get-Content -Path
. -
Наконец воспользуйтесь
$file | Remove-Item -Verbose
чтобы вычистить этот файл снова. -
Примените
$ping = Start-Process -FilePath ping -ArgumentList 'packtpub.com' -PassThru
. -
Для останова имеющегося фонового процесса воспользуйтесь
$ping | Stop-Process -PassThru
. -
Примените
Start-Job -Name Sleepy { Start-Sleep -Seconds 100; Get-Date}
. -
Взгляните на созданное задание при помощи
Get-Job -Name Sleepy
- готово ли оно к доставке данных? -
Для ожидания результатов воспользуйтеь
Get-Job -Name Sleepy | Wait-Job
. -
В конце концов, для выборки результатов примените
Get-Job -Name Sleepy | Receive-Job -Keep
. -
В качестве адьтернативы попробуйте
$job = Get-ChildItem -Recurse -Force -Path $home & and $job | Wait-Job | Receive-Job
-
Очистите все остающиеся задания закрыв PowerShell или выполнив
$job | Remove-Job; Get-Job -Name Sleepy | Remove-Job
В PowerShell имеется множество глаголов, которые указывают на изменения, например, New
,
Set
и Remove
. Многие из этих cmdlet также возвращают
объекты для изменённых или созданных данных. Если один из этих параметров не производит вывода, например,
Stop-Process
, вы можете попробовать воспользоваться соответствующим параметром
PassThru
, если он доступен. Обычно это означает что будут возвращены объекты.
В данном рецепте вы можете наблюдать обычно имеющий место поток между различными cmdlet. При использовании соответствующего конвейера и связанных друг с другом cmdlet будет создан, изменён и удалён необходимый файл. В Главе 2, Считывание и запись вывода мы увилим как обычно обрабатывается ввод конвейера.
При помощи обозначенного нами нового параметра, &
вы можете запускать некое
фоновое задание, во многом аналогично имеющемуся в Linux параметру ветвления (fork). Также позднее мы сможем собрать
результаты этого задания.
Существует бесчисленное множество cmdlet, которые изменяют работающую систему, причём некоторые из них мы рассмотрим в этой книге. Не забудьте просмотреть репозиторий самого PowerShell на GitHub и имеющуюся документацию, чтобы ознакомиться со всеми сведениями, прежде чем испортить свои выходные или смену вашего коллеги по вызову.
PowerShell Core имеет достаточное число встроенных переменных, которые немедленно выдают вам информацию относительно той среды, в которой вы работаете. Следующий рецепт покажет вам наиболее важные из них.
Чтобы следовать данному рецепту вам следует выполнить установку PowerShell в вашей операционной системе.
Выполните, пожалуйста, следующие шаги:
-
Ознакомьтесь с выводом
$PSVersionTable
. При помощи этой переменной вы всегда знаете с какой версией и редакцией вы работаете. -
Попробуйте исполнить
Set-Location $PSHome; Get-ChildItem
. Эта папка содержит все исполняемые файлы PowerShell, необходимые для запуска его оболочки. -
Взгляните на значение переменной
$pid
. Эта переменная всегда указывает на ваш собственный процесс PowerShell. -
Попробуйте исполнить cmdlet
Get-Item DoesNotExist
, а после этого просмотреть содержимое$Error
. Эта переменная собирает ошибки, которые возникают в вашем сеансе. Не все собранные здесь ошибки можно просмотреть через CLI. -
попробуйте следующее:
$true = $false
. Вы будете приятно удивлены, что эти переменные являются так называемыми константами и не могут быть изменены. -
Взгляните на вывод
Get-Process | Format-Table Name,Threads
. Вы можете заметить, что все потоки всегда выглядят остановленными на четырёх элементах. -
Отобразите содержимое такой переменной как
$FormatEnumerationLimit
. Его начение не сучайно совпадает. Эта переменная обслуживает как форматировать список вывода. -
Взгляните на
$PSScriptRoot
. По какой- то причине эта переменная пустая. Основная причина состоит в том, что значение этой переменной устанавливается только когда исполняется некий сценарий. После этого она будет указывать на тот каталог, который содержит данный сценарий.$PSCommandPath
будет содержать весь путь сценария. -
Выполните такую команду:
Set-Content -Path ~/test.ps1 -Value '$PSScriptRoot;$PSCommandPath'; ~/test.ps1
. Изучите её вывод; самая первая строка содержит значение каталога сценария, в то время как вторая строка отобразит полный путь исполняемого вами сценария. -
Наконец, попробуйте
Get-Variable *Preference
. Эти переменные контролируют поведение PowerShell в отношении ошибок, предупреждений и тому подобного. В Главе 2, Считывание и запись вывода мы ближе ознакомимся с ними.
Всякий раз когда запускается некий новый сеанс PowerShell, регистрируется и заполняется целая пачка переменных. Вы всегда можете полагаться на то, что эти переменные существуют и будут представлены в ваших сценариях. Многие из этих переменных содержат предпочтения для cmdlet, форматирования и вывода.
В наших последующих главах будет ещё много чего. Мы продолжим применять имеющиеся встроенные переменные для различных целей.