PowerShell для Linux-пользователей

12 Декабря 2018

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

Помним о долларе

В bash для объявления переменной достаточно присвоить ей значение, например, max=100. В PowerShell, подобно PHP, нужно перед именем переменной поставить знак доллара: $max=100. Забывать о нем нельзя, иначе PowerShell не будет считать объявление переменной и сообщит об ошибке.

Форматирование вывода

Можно использовать универсальную команду echo, но это не интересно, тем более, что в PowerShell есть средства форматирования вывода — вывод можно даже разукрасить:

Write-Host (1,2,3,4,5,6) -Separator "->" —ForegroundColor Green - BackgroundColor White

Здесь мы выводим значения 1, 2, 3, 4, 5 и 6 с использованием разделителя «->», фон — белый, цвет шрифта — зеленый.

1.png

Форматирование вывода в PowerShell

Операторы сравнения

Следующий момент, на который нужно обратить внимание — операторы сравнения. Некоторые из них такие же, как в bash, некоторые — будут абсолютно новыми для бывшего bash-программиста.

Таблица 1. Операторы сравнения

Аргумент Тип Описание
eq Equal Равно
ne Not equal Не равно
ge Greater than or equal Больше или равно
gt Greater than Больше
lt Less than Меньше
le Less than or equal Меньше или равно
like Wildcard comparison Позволяет использовать подстановки для поиска соответствия образцу.
Пример: "index.php" -like "i*.ph?"
notlike Wildcard comparison Здесь символы подстановки используются для поиска несоответствия образцу.
Пример: "index.php" -notlike "p*.php"
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, or, xor, not и!. Примеры:

(1 -eq 1) -and (2 -eq 2)
(1 -eq 1) -or (1 -eq 2)
-not (1 -eq 2)

Для типов можно использовать операторы сравнения is (является типом), isnot (не является типом), as (используется для преобразования).
Дополнительную информацию можно получить по ссылке.

Если облака для вас
не просто теория
Широкий спектр услуг
по выделенным северам
и мультиклауд-решениям
Конфигурация VPS и бесплатный тест уже через 2 минуты
Организация вашей IT-инфраструктуры на основе мультиклауд-решения

Эквиваленты команд

В bash хорошо программисту тем, что он может использовать стандартные утилиты командной строки Linux, которые не являются, по сути, частью bash, но очень часто используются во всевозможных сценариях.

Таблица 2. Эквиваленты утилитам командной строки

Команда Linux Команда PowerShell
cd cd или Set-Location <путь>
ls Get-ChildItem <путь>
mkdir New-Item -ItemType Directory -Name 'имя_каталога'
touch New-Item -ItemType "file" -Path "<путь>\<имя>"
cp Copy-Item -Path <исходный_путь> -Destination <назначение>
rm Remove-Item <имя>
find Get-ChildItem <параметры>
tail Get-Content <файл> -TotalCount <к-во строк>
grep аналога нет
uname $Properties = 'Caption', 'CSName', 'Version', 'BuildType', 'OSArchitecture' Get-CimInstance Win32_OperatingSystem | Select-Object $Properties | Format-Table –AutoSize
ping TestConnection <имя узла>
cut Get-ChildItem $env:USERPROFILE -Filter "*.txt"
man Get-Help <имя команды>
clear cls
cat Get-Content –Path <Имя_файла>

Рассмотрим данные команды подробнее. Команда Set-Location позволяет перемещаться не только по файловой системе, но и по реестру, например:

Set-Location   -Path "HKEY_LOCAL_MACHINE\SYSTEM\Software\Microsoft "

Команда Get-Children позволяет вывести содержимое каталога или диска. В самом простом случае ее можно использовать так:

Get-Children E:\

Она покажет, что содержит корневой каталог диска Е:. Отсортировать по времени последнего изменения можно так:

Get-ChildItem E:\ | Sort-Object -Property LastWriteTime

2.png

Команда Get-Children

Команду New-Item можно использовать, как для создания каталога, так и файла. Например:

New-Item   -ItemType "directory"   -Path    "c:\foo\bar"

Данная команда создает подкаталог bar в каталоге C:\foo. Аналогично, эту же команду можно использовать и для создания файла:

New-Item   -ItemType "file"   -Path   "c:\foo\log.txt"

Для копирования файла используется команда Copy-Item:

Copy-Item  -Path   C:\foo\log.txt   -Destination C:\bar\

Прелесть команды Copy-Item заключается в возможности копирования по сети:

Copy-Item  -Path   C:\foo.txt -Destination  '\\server\f$\foo.txt'

Команда Remove-Item кроме точного имени файла может приманить маску. Следующая команда удаляет все *.log файлы в текущем каталоге:

Remove-Item *.log

Команду Get-Children можно использовать и для поиска файлов:

Get-Children  -Path  "*.txt"  -Depth 3 -Exclude "*server*" —Recurse

Здесь мы ищем все текстовые файлы, глубина поиска задана тремя уровнями, исключаем из результатов все, что содержит строку server в имени.
Вместо команды cat для вывода содержимого файла можно использовать команду Get-Content:

Get-Content -Path log.txt

Также эту команду можно использовать вместо tail, задав параметр TotalCount:

Get-Content -Path log.txt -TotalCount 10

Для получения справки об интересующей вас команде можно использовать Get-Help:

Get-Help Get-Content

На этом все. Надеемся, что данный материал помог хоть как-то адаптироваться в PowerShell.

Получить консультацию специалиста
Персональный ассистент
Cloud.Xelent