Я начинаяю новую рубрику — Power Shell скрипты. Это не просто командная строка, это конкретный интерпретатор логического языка. В интернете предлагают использовать его для выполения отдельных команд. Но это, как микроскопом колоть орехи, а это реальная среда для выполнения целых сценариев, таких как SH, BASH, ZSH и т.д. Кому это полезно — в первую очередь системным администратором ))) Ведь автоматизация процессов (рутина) — это их прерогатива.
Руководство по установке Server 2019
Итак начнем:
Какой должен быть инструмент для автоматизации работы сервера для компании:
- работа в разных версиях операционной системы (в идеальном случае во всех) без установки какого-либо дополнительного программного обеспечения;
- интеграция с командной строкой;
- согласованный и непротиворечивый синтаксис команд и утилит;
- наличие подробной встроенной справки по командам с примерами использования;
- возможность выполнения сценариев, составленных на простом для изучения языке;
- возможность использования всех технологий, поддерживаемых операционной системой.
В 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_OPTOUTPOWERSHELL_DISTRIBUTION_CHANNELPOWERSHELL_UPDATECHECKPSExecutionPolicyPreferencePSModulePathPSModuleAnalysisCachePathPSDisableModuleAnalysisCacheCleanup
Полные описания этих переменных см. в переменных среды 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, используется командлет New-Variable с параметром -Option, установленным в значение Constant. Вот основной синтаксис, который вы можете использовать:
|
1 |
New-Variable -Name 'YourConstName' -Value 'YourValue' -Option Constant |
Создание переменных
В самом простом варианте для создания новой переменной достаточно ввести в консоли ее допустимое имя. Имя переменной всегда начинается со знака $ и может содержать любые буквы и цифры, а также знак подчеркивания. К примеру, команда $var создаст переменную с именем $var. Однако созданная таким образом переменная не имеет значения. Создать переменную и присвоить ей какое-либо значение можно одним действием, например:
|
1 |
$var = 8 |
или
|
1 |
$var = ″Windows″ |
PowerShell создаст переменную только в том случае, если она не существует, иначе указанное значение присваивается существующей переменной.
Переменная может хранить в себе различные данные. Обычно при создании переменной тип данных выбирается автоматически, но при необходимости его можно уточнить, например текстовый: