Я начинаяю новую рубрику — Power Shell скрипты. Это не просто командная строка, это конкретный интерпретатор логического языка. В интернете предлагают использовать его для выполения отдельных команд. Но это, как микроскопом колоть орехи, а это реальная среда для выполнения целых сценариев, таких как SH, BASH, ZSH и т.д. Кому это полезно — в первую очередь системным администратором ))) Ведь автоматизация процессов (рутина) — это их прерогатива.
Итак начнем:
Какой должен быть инструмент для автоматизации работы сервера для компании:
- работа в разных версиях операционной системы (в идеальном случае во всех) без установки какого-либо дополнительного программного обеспечения;
- интеграция с командной строкой;
- согласованный и непротиворечивый синтаксис команд и утилит;
- наличие подробной встроенной справки по командам с примерами использования;
- возможность выполнения сценариев, составленных на простом для изучения языке;
- возможность использования всех технологий, поддерживаемых операционной системой.
В UNIX-системах в качестве инструмента автоматизации выступает стандартная оболочка (sh) или ее модификации (bash, ksh, csh и т. д.).
Комментарии
Использование комментариев считается частью хорошего стиля программирования наряду с правильными отступами и пробелами, это делает код более читабельным:
1 2 3 4 5 6 |
# Для строчных комментариев используется символ решетки # — содержимое строки интерпретатор не обрабатывает. <# Так обозначаются начало и конец блочного комментария. Заключенный между ними текст интерпретатор игнорирует. #> |
Константы и системные переменные:
Системные (окружение среды)
Помимо объявленных пользователем существуют встроенные (системные) переменные, которые не удаляются после завершения текущего сеанса. Делятся они на два типа, при этом данные о состоянии PowerShell хранятся в автоматических переменных, которым нельзя самостоятельно присвоить произвольные значения. К их числу относится, например, $PWD:
1 |
$PWD.Path |
Для хранения пользовательских настроек нужны переменные предпочтений, значения которых можно изменить. К примеру, с помощью $ErrorActionPreference задается реакция интерпретатора команд на возникновение некритических ошибок.
Вдобавок к операторам и командлетам для обращения к объявленным переменным существует псевдонакопитель Variable:. Работать с ним можно по аналогии с другими накопителями, а переменные в этом случае напоминают объекты файловой системы:
1 |
Get-ChildItem Variable: | more |
или
1 |
ls Variable: | more |
Переменные среды хранят данные, используемые операционной системой и другими программами. PowerShell создает следующие переменные среды:
POWERSHELL_TELEMETRY_OPTOUT
POWERSHELL_DISTRIBUTION_CHANNEL
POWERSHELL_UPDATECHECK
PSExecutionPolicyPreference
PSModulePath
PSModuleAnalysisCachePath
PSDisableModuleAnalysisCacheCleanup
Полные описания этих переменных см. в переменных среды PowerShell этой статьи.
-
PATH
Переменная
$Env:PATH
среды содержит список расположений папок, которые операционная система ищет исполняемые файлы. В Windows список расположений папок разделен символом с запятой (;
). На платформах, отличных от Windows, двоеточие (:
) отделяет расположения папок в переменной среды. -
PATHEXT
Переменная
$Env:PATHEXT
содержит список расширений файлов, которые Windows считает исполняемыми файлами. Если файл скрипта с одним из перечисленных расширений выполняется из PowerShell, скрипт выполняется в текущем сеансе консоли или терминала. Если расширение файла не указано, скрипт запускается в новом сеансе консоли.Чтобы убедиться, что скрипты для другого языка сценариев выполняются в текущем сеансе консоли, добавьте расширение файла, используемое языком сценариев. Например, чтобы запустить скрипты Python в текущей консоли, добавьте
.py
расширение в переменную среды. Для поддержки.py
расширения в виде исполняемого файла необходимо зарегистрировать расширение с помощьюftype
командной оболочки CMD иassoc
команд. PowerShell не имеет прямого метода регистрации обработчика файлов. Дополнительные сведения см. в документации по команде ftype .Скрипты PowerShell всегда начинаются в текущем сеансе консоли. Вам не нужно добавлять
.ps1
расширение.
Переменные среды, в отличие от других типов переменных в PowerShell, всегда хранятся в виде строк.
Использование синтаксиса переменной
Можно отобразить и изменить значения переменных среды с помощью следующего синтаксиса:
1 |
$Env:<variable-name> |
Например, чтобы отобразить значение переменной windir
среды:
1 |
$Env:windir |
1 |
C:\Windows |
В этом синтаксисе знак доллара ($
) указывает переменную, а имя диска (Env:
) указывает переменную среды, за которой следует имя переменной (windir
).
В следующем примере создается новая переменная среды с Foo
значением Bar
, а затем возвращается его значение.
1 2 |
[Environment]::SetEnvironmentVariable('Foo','Bar') [Environment]::GetEnvironmentVariable('Foo') |
Константы:
В программировании константа определяется как значение, которое не изменяется во время выполнения программы. В PowerShell константы схожи — как только вы определяете константу, ее значение остается фиксированным и не может быть изменено. Эта характеристика делает константы особенно ценными, поскольку они могут помочь предотвратить случайные изменения критических значений, обеспечивая при этом согласованность кода.
Использование констант PowerShell вместо переменных даёт несколько преимуществ. В отличие от переменных, которым можно присваивать новые значения, константы сохраняют свою целостность на протяжении всего выполнения скрипта. Такая неизменяемость повышает ясность кода и предотвращает непредвиденные побочные эффекты, которые могут возникнуть при случайном изменении значения. Используя константы, вы создаёте самодокументируемый код, благодаря чему другим разработчикам (и вам в будущем) будет проще с первого взгляда понять, какие значения вы имеете в виду.
1 2 |
New-Variable -Name 'PI' -Value 3.14159 -Option Constant Write-Output "The value of PI is: $PI" |
Переменные и их типы
Переменные в PowerShell — это именованные объекты. Их названия могут включать символ подчеркивания, а также буквы и числа. Перед именем всегда используется символ $, а чтобы объявить переменную, достаточно указать интерпретатору допустимое имя:
Для инициализации переменной (присвоения ей значения) применяется оператор присваивания (символ =):
1 |
$test = 100 |
Объявить переменную можно с указанием ее типа в квадратных скобках (оператор приведения типов) перед именем или значением:
1 |
[int]$test = 100 |
1 |
$test = [int]100 |
Важно понимать, что переменные в PowerShell — это полноценные объекты (классы) со свойствами и методами, типы которых основаны на имеющихся в .NET Core. Перечислим основные:
Тип (класс .NET) | Описание | Пример кода |
---|---|---|
[string] System.String |
строка Unicode | $test = «тест» $test = ‘тест’ |
[char] System.Char |
символ Unicode (16 бит) | [char]$test = ‘c’ |
[bool] System.Boolean |
булевский тип (логическое значение True или False) | [bool]$test = $true |
[int] System.Int32 |
тридцатидвухразрядное целое число (32 бита) | [int]$test = 123456789 |
[long] System.Int64 |
шестидесятичетырехразрядное целое число (64 бита) | [long]$test = 12345678910 |
[single] System.Single |
число с плавающей точкой длиною в 32 бита | [single]$test = 12345.6789 |
[double] System.Double |
число с плавающей точкой длиною в 64 бита (8 байт) | [double]$test = 123456789.101112 |
[decimal] System.Decimal |
число с плавающей точкой длиною в 128 бит (обязательно указывать d на конце) | [decimal]$test = 12345.6789d |
[DateTime] System.DateTime |
дата и время | $test = Get-Date |
[array] System.Object[] |
массив, индекс элементов которого начинается с 0 | $test_array = 1, 2, «тест», 3, 4 |
[hashtable] System.Collections.Hashtable |
хэш-таблицы — ассоциативные массивы с именованными ключами, построенные по принципу: @{ключ = «значение»} | $test_hashtable = @{one=«один»; two=«два»; three=«три»} |
PowerShell поддерживает неявное преобразование типов, кроме того тип переменной может меняться на ходу (например, при помощи оператора присваивания), если он не указан принудительно — в этом случае интерпретатор выдаст ошибку. Определить тип переменной из предыдущего примера можно при помощи вызова метода GetType():
1 |
$test.GetType().FullName |
Существует некоторое количество командлетов для управления переменными. Их список в удобной форме выводится с помощью команды:
1 |
Get-Command -Noun Variable | ft -Property Name, Definition -AutoSize -Wrap |
Для просмотра объявленных переменных и их значений можно использовать специальный командлет:
1 |
Get-Variable | more |
Такой способ кажется чрезмерно громоздким, с переменными намного удобнее работать через операторы или обращаясь к их свойствам и методам напрямую. Тем не менее командлеты имеют право на существование, поскольку позволяют задать некоторые дополнительные параметры. Важно понимать, что пользовательские переменные определены только в рамках текущего сеанса. После закрытия консоли или завершения сценария они удаляются.
Вот пример объявления переменных:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# Настройки # Список серверов для проверки $servers = "Server1", "Server2", "Server3" # Порог свободного места в процентах $threshold = 15 # Путь к файлу журнала $logFile = "C:\Logs\DiskSpace_$(Get-Date -Format 'yyyyMMdd').log" # Отправлять ли email - уведомления $sendEmail = $true $emailParams = @{ From = "monitoring@yourdomain.com" To = "admin@yourdomain.com" Subject = "Предупреждение: Низкий уровень свободного места на диске" SmtpServer = "smtp.yourdomain.com" } |
Вычисление выражений
Кроме выполнения команд, в PowerShell можно вычислять выражения, то есть пользоваться оболочкой как калькулятором (в оболочке cmd.exe эта возможность отсутствовала). Например: PS C:\> 2+3 5 Глава 2. Первые шаги в PowerShell. Основные понятия 29 PS C:\> 10-2*3 4 PS C:\> (10-2)*3 24 Как видите, результат вычислений сразу же выводится на экран, и нет необходимости использовать для этого какую-либо специальную команду (эту особенность PowerShell следует запомнить на будущее). Предыдущие примеры показывают, что PowerShell справляется с вычислением целочисленных выражений, в том числе со скобками. Проверим выражение, результатом которого является число с плавающей точкой: PS C:\> 10/3 3.33333333333333 Здесь тоже все в порядке, результат вычислен верно. На самом деле в PowerShell можно выполнять и более сложные вычисления, включающие в себя различные математические функции. Для этого используются методы .NETкласса System.Math. Например, следующая команда вычисляет и выводит на экран корень квадратный из числа 169: PS C:\> [System.Math]::Sqrt(169) 13 ЗАМЕЧАНИЕ Более подробно использование методов .NET-классов будет обсуждаться в главе 10. Результат вычисления выражения в PowerShell можно сохранять в переменной и пользоваться этой переменной в других выражениях. Например: PS C:\> $a=10/2 PS C:\> $a 5 PS C:\> $a*3 15 Отметим здесь, что в PowerShell имена переменных должны начинаться со знака доллара ($). Области видимости: Для переменных в PowerShell существует понятие области видимости (Scope). Действие глобальной области (Global) распространяется на весь текущий сеанс — в нее входят, например, системные переменные. Локальные (Local) переменные доступны только в области, где они были определены: скажем внутри функции. Есть еще понятие области действия сценария (Script), но для команд скрипта она по сути является локальной. По умолчанию при объявлении переменных им задается локальная область действия, а чтобы это изменить, нужна специальная конструкция вида: $Global: переменная = значение. Например, так:
1 |
$Global:test = 100 |
Переменные среды (окружение)
Из PowerShell доступен еще один псевдонакопитель Env:, с помощью которого можно обратиться к переменным среды. При запуске оболочки они копируются из родительского процесса (т.е. из инициировавшей текущий сеанс программы) и обычно их первоначальные значения совпадают со значениями в панели управления. Для просмотра переменных окружения используется командлет Get-ChildItem или его псевдонимы (алиасы): ls и dir.
1 |
dir Env: |
Эти переменные представляют собой последовательности байтов (или символов, если угодно), интерпретация которых зависит только от использующей их программы. Командлеты *-Variable с переменными среды не работают. Чтобы обратиться к ним, придется использовать префикс диска:
1 |
$env:TEST = "Hello, World!" |
Арифметические операторы и операторы сравнения
В PowerShell есть следующие арифметические операторы: + (сложение), — (вычитание), * (умножение), / (деление) и % (модуль или остаток от деления). Результат арифметического выражения вычисляется слева направо в соответствии с общепринятым порядком операций, а для группировки частей выражения применяются круглые скобки. Пробелы между операторами игнорируются, их используют только для облегчения восприятия. Оператор + также объединяет, а оператор * повторяет строки. При попытке прибавить число к строке оно будет преобразовано в строку. Кроме того, в языке PowerShell есть множество операторов сравнения, которые проверяют соответствие между двумя значениями и возвращают логические True или False:
Оператор | Описание | Пример кода |
---|---|---|
-eq | Equal / Равно (аналог = или == в других языках) | $test = 100 $test -eq 123 |
-ne | Not equal / Не равно (аналог <> или !=) | $test = 100 $test -ne 123 |
-gt | Greater than / Больше (аналог >) | $test = 100 $test -gt 123 |
-ge | Greater than or equal / Больше или равно (аналог >=) | $test = 100 $test -ge 123 |
-lt | Less than / Меньше (аналог <) | $test = 100 $test -lt 123 |
-le | Less than or equal / Меньше или равно (аналог <=) | $test = 100 $test -le 123 |
Синтаксис для определения констант
Чтобы определить константу в PowerShell, используется командлет New-Variable
с параметром -Option
, установленным в значение Constant
. Вот основной синтаксис, который вы можете использовать:
1 |
New-Variable -Name 'YourConstName' -Value 'YourValue' -Option Constant |
Создание переменных
В самом простом варианте для создания новой переменной достаточно ввести в консоли ее допустимое имя. Имя переменной всегда начинается со знака $ и может содержать любые буквы и цифры, а также знак подчеркивания. К примеру, команда $var создаст переменную с именем $var. Однако созданная таким образом переменная не имеет значения. Создать переменную и присвоить ей какое-либо значение можно одним действием, например:
1 |
$var = 8 |
или
1 |
$var = ″Windows″ |
PowerShell создаст переменную только в том случае, если она не существует, иначе указанное значение присваивается существующей переменной.
Переменная может хранить в себе различные данные. Обычно при создании переменной тип данных выбирается автоматически, но при необходимости его можно уточнить, например текстовый: