При переходе с bash на PowerShell часто возникают неудобства, связанные с незнанием, какие есть аналоги в пошике и как ими пользоваться. К примеру, лично мне очень нравится bash своей логикой. Вот нужно тебе из текстового файла найти только что-то определенное, и ты знаешь, что для этого нужно задействовать, скажем, cat и grep. А вот при написании подобного на пошике часто возникает полный ступор. И вроде вся логика понятна, и скрипт-то в одну строку, а как реализовать — неясно. Именно с этим и предлагаю разобраться.

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

К примеру, данный код выведет последовательность цифр в скобках, между цифрами поставит знак -> плюс раскрасит бэкграунд и сам текст. Конечно, для скрипта на коленке это не нужно, но вот для каждодневного отчета почему бы и нет.

Пример работы командлета Write-Host
Пример работы командлета Write-Host

Нужно что-либо сравнить? Для этого есть целая таблица, которая так или иначе знакома любому линуксоиду:

Аргумент Тип Описание
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 комментарий

  1. LuckyTiger

    29.08.2018 at 11:12

    Все таки командная строка Linux удобнее в разы.
    Спасибо за труд!

Оставить мнение

Check Also

CCleaner принудительно обновился до версии 5.46, не спрашивая пользователей

Совсем недавно пользователи обвиняли разработчиков CCleaner в слежке, а теперь утилита сам…