Содержание статьи
INFO
Про общий синтаксис и основы языка PowerShell написано немало, есть огромное количество литературы, статей и видео на данную тему. Те же циклы и счетчики описаны уже не по одному десятку раз, поэтому в данной статье о них ничего не рассказано. Если вдруг про пошик ты узнал совсем недавно, то есть смысл обратиться в гугл с банальным запросом вида «powershell tutorial for beginners pdf».
Общие правила игры
Сперва давай разберемся с наиболее простым, но не менее важным — с тем, как работать с переменными. Скажем, если в bash для объявления переменной достаточно написать foo=1
, то для PowerShell нужно добавить знак доллара — $foo=1
. Для вывода значения переменной на экран можно воспользоваться универсальным echo
или, если работаешь с пошиком, командлетом Write-Host
. Длиннее? Да, безусловно, но при этом с помощью данного командлета можно весьма интересно управлять выводом:
Write-Host (2,4,6,8,10,12) -Separator "->" -ForegroundColor DarkMagenta -BackgroundColor White
К примеру, данный код выведет последовательность цифр в скобках, между цифрами поставит знак ->
плюс раскрасит бэкграунд и сам текст. Конечно, для скрипта на коленке это не нужно, но вот для каждодневного отчета почему бы и нет.
Нужно что-либо сравнить? Для этого есть целая таблица, которая так или иначе знакома любому линуксоиду:
Аргумент | Тип | Описание |
---|---|---|
eq | Equal | Равно |
ne | Not equal | Не равно |
ge | Greater than or equal | Больше или равно |
gt | Greater than | Больше |
lt | Less than | Меньше |
le | Less than or equal | Меньше или равно |
like | Wildcard comparison | Использование символов подстановки для поиска соответствия образцу. Пример: "file.doc" -like "f*.do?" |
notlike | Wildcard comparison | Использование символов подстановки для поиска несоответствия образцу. Пример: "file.doc" -notlike "p*.doc" |
match | Regular expression comparison | Использование регулярных выражений для поиска соответствия образцу |
notmatch | Regular expression comparison | Использование регулярных выражений для поиска несоответствия образцу |
replace | Replace operator | Заменяет часть или все значение слева от оператора |
contains | Containment operator | Определяет, содержит ли значение слева от оператора значение справа. В отличие от предыдущих операторов результатом является булево значение. Пример: 1,2,3 -contains 1 |
notcontains | Containment operator | Определяет, что значение слева от оператора не содержит значения справа. Результат — булево значение. Пример: 1,2,3 -notcontains 4 |
Для логических операторов это:
Аргумент | Описание |
---|---|
and | Оба условия должны быть истинны, чтобы выражение было истинно. Пример: (1 -eq 1) -and (2 -eq 2) |
or | Одно или оба условия должны быть истинны, чтобы выражение было истинно. Пример: (1 -eq 1) -or (1 -eq 2) |
xor | Одно условие должно быть истинно, а второе должно иметь значение «ложь», чтобы выражение было истинно |
not | Указанные условия должны иметь значение «ложь», чтобы выражение было истинно. Пример: -not (1 -eq 2) |
! | Указанное условие должно иметь значение «ложь», чтобы выражение было истинно. Пример: ! (1 -eq 2) |
Также будет полезно для типов:
Аргумент | Описание |
---|---|
is | Является типом |
isnot | Не является типом |
as | Как тип, без ошибки, если возникает неудача преобразования |
Если с операторами сравнения и логическими условиями все более-менее прозрачно, то вот с типом я бы рассмотрел простенький пример. Вот, скажем, нужно нам узнать среднее время ответа от сайта xakep.ru. Для этого нужно сделать серию пингов и высчитать среднее время ответа. Набросаем простой скрипт:
Write-Host `n "Waiting for test ..."
$Avg = 0
$Site = "www.xakep.ru"
$PingSite = Test-Connection -Count 5 $Site
$Avg = ($PingSite | Measure-Object ResponseTime -Average)
$Calc = ($Avg.average) -as [int]
Clear-Host
Write-Host "Average response time to $Site is $Calc ms"
Если использовать данный код без типа int, мы получим дробное значение, что нам не очень нужно.
Алиасы
Для упрощения работы с PowerShell можно использовать алиасы. Думаю, тебе будет интересно самому взглянуть на список актуальных алиасов в своей системе. Для этого нужно выполнить командлет Get-Alias.
С помощью алиасов можно ссылаться даже на программы. К примеру, сделаем алиас на запуск калькулятора.
Set-Alias -Name calc -value calc.exe
Теперь при вводе calc у нас будет запускаться калькулятор. Если хочется записать на алиас какую-нибудь команду с параметрами, то нужно использовать функцию
function AL01 {Test-Connection -Count 2 xakep.ru}
Set-Alias ping AL01
При вызове нашего алиаса по имени ping мы сделаем два пинга до сервера xakep.ru. Чтобы удалить ненужный для нас алиас, существует команда
Remove-Item alias:ping
Стоит отметить, что после закрытия оболочки PowerShell все созданные алиасы будут удалены. Чтобы этого не происходило, их нужно сохранить в свой пользовательский профиль. Вообще для PowerShell существует аж четыре профиля. Посмотреть их можно командой
$profile | Format-List -Force
А протестировать на наличие в системе — командой
$profile | Format-List -Force | ForEach-Object (Test-Path _$)
Если в ответ возвращается False, то их просто нет. Создадим наш файл, к примеру по первому пути:
C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
и в него напишем наши алиасы:
function AL01 {Test-Connection -Count 2 xakep.ru}
Set-Alias ping AL01
После сохранения и перезапуска пошик будет автоматически подгружать данный файл, и теперь настройки никуда не денутся. Стоит упомянуть и что по умолчанию в системе отключен запуск любых сценариев и, скорее всего, наш внешний файл будет забракован системой. Чтобы этого не произошло, давай посмотрим, что стоит в политике. Выполни в консоли PowerShell:
Get-ExecutionPolicy
Скорее всего, система вернет значение Restricted, что как раз означает запрет выполнения сценариев. Чтобы это обойти, выполни из-под администратора:
Set-ExecutionPolicy Unrestricted
После подтверждения сценарии будут запускаться без ошибок и наш файл тоже будет работать.
Погружаемся глубже
Теперь давай перейдем к наиболее востребованным тулзам «Линукса» и их аналогам в PowerShell. Начнем, как обычно, от простого к сложному.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»