Скрипты PowerShell - Ультимативное руководство для начинающих
Автоматизация ежедневных задач, извлечение информации из систем или управление Microsoft 365? Скрипты PowerShell действительно упрощают вашу повседневную работу. Если вы работаете в ИТ, то без PowerShell вам не обойтись.
PowerShell — это продинутый интерфейс командной строки (CLI) и язык сценариев, который может использоваться на Windows, Linux и macOS. С помощью командлетов мы можем выполнять такие задачи, как извлечение пользователей из Active Directory или тестирование сетевого соединения сервера. Мы можем объединять эти задачи и процессы в сценарии, которые можно быстро запускать на нескольких компьютерах или планировать как ежедневную задачу.
В этой статье я объясню, как вы можете создать свои собственные скрипты PowerShell. Какие инструменты вы можете использовать, как форматировать свои скрипты и несколько общих советов для начала. В конце статьи вы также найдете шаблон, который вы можете использовать для своих скриптов.
Редактор PowerShell
Большинство людей, которые начинают писать скрипты PowerShell, используют простое текстовое редактор, такой как Notepad++. Это работает для небольших скриптов, но хороший редактор значительно упрощает написание скриптов PowerShell. Они имеют подсветку синтаксиса, функции автозаполнения, обнаружение ошибок и т. д. И что мне нравится больше всего, так это то, что вы можете создать проект, что позволяет быстро переключаться между файлами и поддерживать их организованными.
Для PowerShell одним из лучших бесплатных редакторов, с которого стоит начать, является Visual Studio Code. Этот редактор от Microsoft полностью бесплатен и может использоваться на Windows, Linux и macOS. Чтобы использовать редактор с PowerShell, вам нужно будет установить плагин (расширение).
- Сначала, установите Visual Studio Code с помощью установщика. Просто нажимайте 'Далее' на всех экранах.
- Нажмите на Расширения
- Поиск PowerShell
- Установите расширение PowerShell от Microsoft
Чтобы создать наш первый скрипт PowerShell, нам нужно создать новый файл. Чтобы поддерживать порядок, мы создадим новую папку «скрипты», где будем хранить наши файлы. В Visual Studio Code:
- Откройте Проводник
- Выберите Открыть папку
- Создайте новую папку под названием scripts, например, в вашем OneDrive
- Нажмите Выбрать папку
Вы получите запрос, если доверяете файлам в этой папке, убедитесь, что вы отметили «Доверять авторам всех файлов в родительской папке» и нажмите Да, я доверяю авторам.
Чтобы создать новый файл, щелкните правой кнопкой мыши в редакторе (или нажмите на значок "Новый файл") и создайте свой первый скрипт PowerShell. Вы также можете создать подпапку, чтобы организовать свои скрипты, конечно.
Запуск скрипта PowerShell
Прежде чем начать писать наш скрипт PowerShell, полезно знать, как можно запускать или тестировать свои скрипты. Одной из распространённых проблем при попытке запустить скрипт является ошибка “Запуск скриптов отключён в этой системе”. Чтобы решить эту проблему, нам необходимо изменить разрешения на выполнение на вашем компьютере с Windows 10 или 11.
Откройте PowerShell и введите команду ниже, чтобы изменить политику выполнения. Узнайте больше о политике выполнения PowerShell в этой статье.
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
Verify the setting with
Get-ExecutionPolicyС установленной политикой выполнения мы можем запускать наши скрипты без ошибок разрешений. Теперь есть несколько вариантов для запуска скрипта PowerShell, прочитайте об этом в статье, но в данном руководстве мы сосредоточимся на двух следующих:
- Используя встроенный терминал в Visual Studio Code
- Запустите скрипт в PowerShell
Используя Visual Studio Code
Одно из преимуществ использования Visual Studio Code в качестве редактора для ваших скриптов PowerShell заключается в том, что вы можете тестировать и запускать свои скрипты в встроенном терминале. Вы можете запустить весь скрипт, нажав F5, или запустить выделенные строки, нажав F8.
Используя PowerShell
Другой метод заключается в использовании самого PowerShell для выполнения вашего скрипта. Откройте Windows PowerShell или Windows Terminal (щелкните правой кнопкой мыши на 'Пуск') и перейдите в папку, где сохранен ваш скрипт. Введите имя файла вашего скрипта и нажмите Enter.
Основы
Использование Cmdlet в PowerShell
В командной строке есть команды, которые являются встроенными функциями (командами), выполняющими определенную задачу. Например, если вы введете hostname в командной строке, она покажет имя вашего компьютера. Или команда dir отобразит содержимое текущего каталога.
В PowerShell у нас есть команды (cmdlets). Вы можете распознать cmdlet по его названию, потому что оно состоит из пары Глагол-Существо. Эта номенклатура помогает вам понять, что делает конкретный cmdlet.
Заметка
В некоторых примерах ниже я использую командлеты из модуля Active Directory. Убедитесь, что у вас установлен этот модуль, если вы хотите следовать шагам. Выполните следующую команду, чтобы установить модуль:Add-WindowsCapability -online -Name “Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0 ”
Например, cmdlet Get-ComputerInfo получает всю информацию о вашем компьютере. Чтобы показать содержимое папки, мы можем использовать Get-ChildItem, например.
Кроме встроенных командлетов, вы также можете устанавливать модули в PowerShell. Эти модули могут, например, использоваться для работы с Exchange Online или Azure AD. Каждый модуль поставляется с собственными командлетами для своей конкретной задачи.
Чит-лист по PowerShell
Убедитесь, что вы также посмотрите и скачаете шпаргалку по PowerShell
Глаголы PowerShell
Существует множество одобренных глаголов, которые вы можете использовать при создании собственных команд или функций PowerShell. Но самые распространенные глаголы, с которыми вы столкнетесь, это:
| Глагол | Действие | Пример |
|---|---|---|
| Добавить | Добавляет или присоединяет ресурсы к другому элементу | Add-MailboxPermission |
| Ясно | Удаляет все ресурсы из контейнера, но не удаляет контейнер. | Clear-Host |
| Соединить | Устанавливает соединение с другой системой | Подключить-AzureAD |
| Отключить | Разорвите соединение с другой системой | Отключить-AzureAD |
| Получить | Извлекает данные из ресурса | Get-ChildItem |
| Новый | Создает новый ресурс | New-Mailbox |
| Удалить | Удалите ресурс из контейнера | Remove-Mailbox |
| Набор | Заменяет данные в существующем ресурсе | Set-Mailbox |
| Выбрать | Выбирает ресурс в контейнере | Select-Object |
Переменные
При написании скриптов вам часто потребуется временно хранить данные, чтобы использовать их позже в вашем скрипте. Для этого мы используем переменные. В PowerShell нам не нужно инициализировать переменные, мы можем просто создать их по мере необходимости. Переменные могут хранить не только данные, такие как строки и целые числа, но также и полный вывод командлетов.
Давайте начнем с простого примера, мы возьмем командлет Get-Computer из предыдущего. Командлет возвращает имя вашего компьютера:
Заметка
Содержимое после # в скрипте PowerShell является комментарием. Комментарии используются для объяснения того, что делает функция, и для улучшения читаемости вашего кода.
hostname
Result
LazyBookМы не хотим просто показать имя компьютера, а вместо этого хотим включить имя компьютера в красивую строку. В этом случае мы можем сначала сохранить результат команды Get-Computername в переменной, которую мы назовем computername. А затем включить эту переменную в строку:
Store computer name inside the variable
$computername = hostname
Include the variable inside the string
Write-Host "The name of your computer is $computername"
Result
The name of your computer is LazyBookОператоры сравнения и условия If-Else
В PowerShell мы можем использовать операторы сравнения для сравнения или поиска совпадающих значений. По умолчанию операторы нечувствительны к регистру, но вы можете поставить c перед оператором, чтобы сделать его чувствительным к регистру. Например:
'a-d' -eq 'LazyAdmin'
Result
True
'a-d' -ceq 'LazyAdmin'
Result
FalseОператоры, которые мы можем использовать в PowerShell, это:
| Оператор | Оператор контрпартии | Описание |
|---|---|---|
| -eq | -ne | Равно или не равно |
| -gt | -lt | Больше или меньше чем |
| -ge | Больше или равно | |
| -le | Меньше или равно | |
| -Like | -NotLike | Сопоставить строку с помощью подстановочного знака * или нет |
| -Match | -NotMatch | Совпадает или нет с указанным регулярным выражением |
| -Contains | -NotContains | Коллекция содержит заданное значение или нет |
| -In | -NotIn | Указанное значение в коллекции или нет |
| -Replace | Заменить указанное значение |
Мы можем использовать эти операторы в комбинации, например, с оператором If-Else. Условия If позволяют нам проверить, является ли определенное сравнение истинным или ложным. В зависимости от результата мы можем выполнить часть кода или перейти к другой части.
Давайте снова возьмем пример с именем компьютера. Мы сохранили имя компьютера внутри переменной. Теперь давайте проверим, является ли имя компьютера "мой ноутбук:"
$computername = hostname
Check if the computer name equal LazyBook
if ($computername -eq 'LazyBook') {
Write-Host "This computer is from LazyAdmin"
}else{
Write-host "This is someone else's computer"
}Наши названия компьютеров начинаются с LT для ноутбуков и PC для настольных ПК. Таким образом, мы могли бы определить, является ли устройство ноутбуком или нет, основываясь на названии компьютера. Для этого мы собираемся использовать оператор if с оператором -like. Оператор like принимает подстановочный символ, поэтому мы можем, например, проверить, начинается ли строка с “LT” в этом случае.
$computername = hostname
Or better is
$computername = $env:COMPUTERNAME
Check if the computer name start with Lazy
if ($computername -like 'Lazy*') {
Write-Host "This is a laptop"
}else{
Write-host "This is something else"
}Передача истинных результатов с помощью конвейерной обработки
Помимо переменных, существует еще один способ передать данные в другой командлет в PowerShell, который используется с оператором конвейера | . Оператор конвейера передает результаты команды следующей команде. Наиболее распространенным примером передачи является форматирование или выбор результата командлета.
Рассмотрим следующий пример: cmdlet Get-NetIPAddress возвращает конфигурацию IP-адресов всех ваших сетевых интерфейсов. По умолчанию он возвращает результаты в виде списка.
Get-NetIPAddressЧтобы сделать результаты более читаемыми, мы можем отформатировать результаты в таблицу или выбрать только те свойства, которые нам нужны. Мы делаем это, передав командлет format-table (ft) или командлет select-object (select):
Get-NetIPAddress | FT
Or select the fields
Get-NetIPAddress | Select InterfaceAlias, IPAddress, PrefixOriginТеперь это простой пример использования конвейеров командлетов. Но давайте посмотрим на более сложное использование конвейеров командлетов. Мы собираемся собрать все почтовые ящики пользователей, для каждого почтового ящика мы будем запрашивать статистику почтового ящика, выбирать только те поля, которые нам нужны, и экспортировать результаты в файл CSV. Без оператора конвейера нам пришлось бы написать код, похожий на этот:
Заметка
Команда Get-EXOMailbox является частью модуля Exchange Online. Убедитесь, что вы установили его, если хотите следовать приведенным ниже шагам.
$mailboxes = Get-EXOMailbox -RecipientTypeDetails UserMailbox
$mailboxes.ForEach({
$Mailboxstats = Get-EXOMailboxStatistics -Identity $_.Identity
$fields = Select-Object -InputObject $Mailboxstats -Property DisplayName,ItemCount,TotalItemSize
Export-CSV -InputObject $fields -Path c:\temp\file.csv -Append
})Но с конвейерами в PowerShell мы можем просто сделать следующее:
Get-EXOMailbox -RecipientTypeDetails UserMailbox | Get-EXOMailboxStatistics | Select DisplayName, ItemCount, TotalItemSize | Export-CSV c:\temp\filename.csvХранение данных в массивах и хеш-таблицах
Массивы и хэш-таблицы могут использоваться для хранения коллекции данных. Хэш-таблицы используют принцип ключ-значение, где необходимо определить ключ, прежде чем вы сможете сохранить значение. Массивы используют автоматически сгенерированный индекс для хранения значений.
Чтобы создать массив, мы можем просто присвоить несколько значений переменной, разделяя каждое из них запятой. Например:
Create an array of fruits
$array = 'apple','raspberry','kiwi'Другой вариант - сначала инициализировать массив, а затем добавлять значения в массив. Чтобы создать пустой массив, мы будем использовать символ @, за которым следуют скобки :
Create an empty array
$fruits = @()
Add content to the array
$fruits += "apple"Хэш-таблицы также известны как ассоциативные массивы, они используются, когда вам нужно хранить данные более структурированным образом. Вместо числового индекса они основаны на паре ключ-значение, где вы должны определить ключ самостоятельно. Чтобы создать пустую хэш-таблицу, вам нужно использовать фигурные скобки и символ @:
Create empty hashtable
$hashTable = @{}Вы могли бы, например, использовать хэш-таблицу для хранения IP-адресов серверов.
$serverIps= @{
'la-srv-lab02' = '192.168.10.2'
'la-srv-db01' = '192.168.10.100'
}
Result
Name Value
---- -----
la-srv-lab02 192.168.10.2
la-srv-db01 192.168.10.100Или как файл конфигурации внутри вашего скрипта:
$mail = @{
SmtpServer = 'smtp.contoso.com'
To = 'johndoe@a-d.site'
From = 'info@contoso.com'
Subject = 'super long subject goes here'
Body = 'Test email from PowerShell'
Priority = High
}Цикл по данным с помощью Foreach и Do-While
Циклический перебор данных является одной из распространенных задач в любом языке сценариев. Циклы ForEach позволяют вам пройти через каждый элемент в коллекции и выполнить с ним определенное действие. Например, мы берем массив фруктов и выводим каждый элемент (фрукт) в консоль:
$fruits = @('apple','pear','banana','lemon','lime','mango')
Foreach block
Foreach ($fruit in $fruits) {
Write-Host $fruit;
}
Shorthand
$fruits.foreach( {
Write-Host $_;
})В вышеупомянутом примере мы использовали только простой массив, но вы также можете использовать ForEach для объектов. Внутри блока ForEach вы можете получить доступ к каждому свойству объекта, например, если мы получаем все почтовые ящики, мы можем получить доступ к отображаемому имени следующим образом:
$mailboxes = Get-EXOMailbox -RecipientTypeDetails UserMailbox
$mailboxes.ForEach({
# Write the displayname of each mailbox
Write-host $_.DisplayName
})В дополнение к циклам ForEach, мы также можем использовать циклы While и Do-While. Цикл while будет выполняться только тогда, когда выполнено условие, а цикл Do-While всегда выполняется один раз и до тех пор, пока условие истинно.
Do While loop
Do {
Write-Host "Online"
Start-Sleep 5
}
While (Test-Connection -ComputerName 8.8.8.8 -Quiet -Count 1)
Write-Host "Offline"
While loop
$i = 0;
$path = "C:\temp"
While ($i -lt 10) {
# Do Something
$newFile = "$path\while_test_file_" + $i + ".txt";
New-Item $newFile
$i++;
}Узнайте больше о циклах For, операторах ForEach и циклах Do While в этой статье.
Отлавливайте ошибки с помощью Try-Catch
Блоки try-catch используются для обработки ошибок должным образом. Обычно, когда функция не работает или возникает ошибка, скрипт просто останавливается и выбрасывает ошибку. Иногда это нормально, но в других случаях вы можете захотеть показать более понятную ошибку или просто продолжить выполнение.
Например, когда вы обновляете несколько пользователей в Active Directory, используя цикл ForEach. Когда одна из учетных записей пользователей не существует, скрипт выдает ошибку и останавливается. Но лучшее решение заключается в том, чтобы скрипт выводил имена пользователей, которых он не обновил, и просто продолжал с следующим. Здесь и приходят на помощь блоки Try-Catch.
Беря приведенный выше пример, следующий блок кода попытается найти и обновить пользователя Azure AD. Если в блоке Try произойдет ошибка, то часть Catch отобразит ошибку.
$users.ForEach{
Try{
# Find the user to update
$ADUser = Get-AzureAdUser -SearchString $_.name
# Update the job title
Set-AzureAdUser -ObjectId $ADUser.ObjectId -JobTitle $_.jobtitle
}
Catch{
Write-Host ("Failed to update " + $($_.name)) -ForegroundColor Red
}
}Теперь это базовая реализация блока try-catch. Даже возможно использовать несколько блоков catch в одном операторе Try, что позволяет перехватывать разные ошибки. Узнайте больше о блоках Try-Catch в этой подробной статье.
Создание скриптов PowerShell
Теперь у вас должно быть общее представление о том, какие инструменты вы можете использовать в PowerShell для создания скриптов. Давайте посмотрим, как мы можем объединить это в настоящие скрипты PowerShell. В приведенных ниже примерах мы собираемся создать небольшой скрипт, который создает тестовые файлы в заданной папке.
Ниже вы найдете основной принцип скрипта. У нас есть путь, закодированный в скрипте, массив с числами от 1 до 10 и цикл ForEach. С приведенными ниже примерами мы улучшим этот скрипт до настоящего скрипта PowerShell.
$path = "C:\temp"
1..10 | ForEach-Object {
$newFile = "$path\test_file_$_.txt";
New-Item $newFile
}Документирование и комментарии
При создании скриптов PowerShell всегда полезно добавлять документацию к вашему скрипту. Документация размещается в верхней части вашего скрипта в блоке комментариев и описывает, что делает скрипт, несколько примеров его использования и блок заметок с указанием автора, версии, даты и т.д.
Итак, для нашего тестового файла скрипта мы можем добавить следующее описание в начале нашего файла:
<#
.SYNOPSIS
Create test files in given directory
.DESCRIPTION
The script generates an x amount of text file based test file in the given folder. The files don't
contain any content.
.EXAMPLE
CreateTestFiles.ps1 -path c:\temp -amount 50
Create 50 files in c:\temp
.NOTES
Version: 1.0
Author: R. Mens - LazyAdmin.nl
Creation Date: 04 oct 2022
Modified Date:
Purpose/Change: Init
Link: https://a-d.site/powershell/powershell-scripting
#>Если вы сейчас выполните команду Get-Help, за которой следует имя скрипта в PowerShell, вы получите объяснение вашего скрипта:
Узнайте больше о комментариях и документации в Руководстве по лучшим практикам PowerShell.
Параметры Cmdlet
При использовании командлетов PowerShell вы, вероятно, заметили, что большинство из них имеют параметры, которые мы можем устанавливать. Например, когда вы хотите получить почтовый ящик из Exchange Online, вы можете указать имя пользователя с помощью параметра -Identity. Мы можем сделать то же самое в наших собственных скриптах PowerShell, определяя атрибуты параметров.
В примере выше мы жестко закодировали переменную пути. Если вы хотите создать тестовые файлы в другой директории, то вам нужно будет изменить скрипт. Лучшим вариантом было бы, если бы вы могли задать путь из командной строки. Итак, мы собираемся создать блок параметров с параметром path:
param(
[Parameter()]
[string]$path
)
Create files
1..10 | ForEach-Object {
$newFile = "$path\test_file_$_.txt";
New-Item $newFile
}Мы ожидаем, что путь будет строкой, другие варианты - это, например, переключатель, где вы можете выбрать значение, или целое число. Если вы откроете PowerShell и введете имя скрипта, то вы также можете добавить параметр -path:
Но что если пользователь скрипта не задаст путь? В этом случае путь обязателен, без него тестовый файл будет создан в корневом каталоге скрипта. Чтобы сделать его обязательным, мы добавляем параметр Mandatory и устанавливаем его в true. Другой вариант — установить значение по умолчанию:
param(
[Parameter(
Mandatory = $true,
HelpMessage = "Enter path were test files should be created"
)]
[string]$path,
[Parameter(
HelpMessage = "How many files should be created"
)]
[int]$amount = 10
)Read-Host
Наш скрипт будет создавать текстовые файлы в указанной папке. Если пользователь сделает опечатку, то возможно, что скрипт создаст 1000 файлов, например, вместо 100. Поэтому перед тем, как мы начнем создавать файлы, будет хорошей идеей запросить подтверждение. Для этого мы будем использовать командлет Read-Host.
Read-Host используется для запроса ввода от пользователя. Это может быть строка или пароль, например. Результаты ввода можно проверить с помощью простого сравнения. В этом случае мы сначала выведем в консоль значения, которые пользователь указал через параметры, а затем спросим, хочет ли пользователь продолжить:
Ask for confirmation
Write-host "Creating $amount test files in $path" -ForegroundColor Cyan
$reply = Read-Host -Prompt "Is this correct? [Y] Yes [N] No "
Check the reply and create the files:
if ( $reply -match "[yY]" ) {
# Create files
1..10 | ForEach-Object {
$newFile = "$path\test_file_$_.txt";
New-Item $newFile
}
}Функции
Функции - отличный способ организовать и повторно использовать части кода внутри вашего скрипта. Функция должна выполнять одну задачу. Хороший пример этого можно найти в этом скрипте отчета о размере OneDrive. Функция ConvertTo-G принимает значение и преобразует его в гигабайты, возвращая результат. Если вы прокрутите немного вниз по скрипту, вы увидите, что функция Get-OneDriveStats собирает все OneDrive и обрабатывает каждый из них. Внутри цикла ForEach я конвертирую значения, используя функцию ConvertTo-GB.
Структура функции в основном представляет собой небольшой скрипт. Начинаем с короткого описания, синопсиса. Если нам нужно передать значения в скрипт, мы используем параметры. Вы также можете заметить, что некоторые функции имеют 3 блока кода: начало, обработка и конец. Блок обработки выполняется для всех значений, которые вы передаете функции, а блоки начала и конца выполняются только один раз. Теперь я должен сказать, что я не часто использую начало и конец.
Итак, мы собираемся создать простую функцию для нашего скрипта тестовых файлов. Я также добавил параметр Path в функцию. Это не так уж необходимо, потому что функция также имеет доступ к параметрам, которые мы задали в начале скрипта. (это больше для демонстрации возможностей)
Function New-TestFiles{
<#
.SYNOPSIS
Create test files
#>
param(
[Parameter(Mandatory = $true)]
[string]$path
)
1..$amount | ForEach-Object {
$newFile = "$path\test_file_$_.txt";
New-Item $newFile
}
}Теперь мы можем использовать функцию в нашем скрипте следующим образом:
if ( $reply -match "[yY]" ) {
New-TestFiles -path $path
}Точки останова
Опечатка, забытая цитата или небольшая ошибка могут легко произойти при создании скрипта PowerShell. Вот почему важно постоянно тестировать свой скрипт во время его написания. Но даже тогда может быть трудно найти причину ошибки в вашем скрипте.
Чтобы помочь вам найти ошибки в вашем скрипте, вы можете использовать точки останова. Если вы используете Visual Studio Code, то можете воспользоваться встроенной функцией Запуска и Отладки, которая позволяет устанавливать точки останова на строках и выполнять ваш скрипт построчно.
В Visual Studio Code мы можем устанавливать точки остановки, щелкнув по красной точке перед номером строки. На скриншоте ниже я установил точку остановки (1) на командлете New-Item на 46-й строке. Когда мы нажмем 'Запуск' (2), скрипт будет выполнен и остановится на точке останова на 46-й строке. В этот момент мы можем видеть переменные слева (3). Это говорит нам о том, что цикл ForEach-Object находится на первом элементе, и новый файл будет создан в c:\temp\files с именем test_file_1.txt.
С помощью кнопок вверху (5) мы можем перейти к следующему шагу, пропустить шаг и т.д.
Использование точек останова в PowerShell
Другой способ отладки вашего скрипта PowerShell - использовать командлет Set-PSBreakpoint в консоли. Этот командлет позволяет устанавливать точки останова для любого скрипта, который вы хотите запустить в PowerShell. С помощью командлета мы можем установить точки останова по номеру строки, действию или переменной. Итак, давайте установим такую же точку останова, как мы сделали в Visual Studio Code:
Set the breakpoint on line 46 for the script CreateTestFiles.ps1
Set-PSBreakPoint -Script .\CreateTestFiles.ps1 -Line 46Когда мы теперь запустим скрипт, он остановится на строке 46:
Скрипт остановился, но ничего не показывает. Поэтому мы начнем с того, что покажем код вокруг нашей точки останова. Просто введите букву L в консоли:
Символ звездочки на строке 46 указывает на точки останова, которые мы установили. Если мы хотим узнать, что такое переменная пути или новое имя файла, мы просто можем ввести имена переменных в консоли и нажать Enter:
Мы можем просмотреть все точки останова, которые мы установили с помощью командлета Get-PSBreakpoint, и удалить их с помощью Remove-PSBreakpoint. Объединив оба, мы удалим все точки останова:
Get-PSBreakPoint | Remove-PSBreakpointЗаключение
При создании скриптов PowerShell всегда начинайте с малого и часто тестируйте ваш скрипт. Также убедитесь, что вы добавляете комментарии к вашему коду, где это необходимо. Возможно, сейчас вам ясно, что делают эти коды, но если вам нужно будет отредактировать ваш скрипт через год, иногда это может быть загадкой, чтобы понять, что делает скрипт и как он работает.
Если вам интересно узнать больше о PowerShell, то книга ниже действительно стоит прочитать. Это один из бестселлеров, когда речь идет об изучении PowerShell:
- Планк, Трэвис (Автор)
- Английский (язык публикации)
- 360 страниц - 26 апреля 2022 года (Дата публикации) - Мэннинг (Издательство)
В приведенных выше примерах мы создаем небольшой скрипт, который создает тестовые файлы, ниже вы найдете полный скрипт. Как упоминалось, это немного избыточно для такой простой задачи, но это дает вам представление о том, как построить свой скрипт.
<#
.SYNOPSIS
Create test files in given directory
.DESCRIPTION
The script generates an x amount (by default 10) of text file based test file in the
given folder. The files don't contain any content.
.EXAMPLE
CreateTestFiles.ps1 -path c:\temp -amount 50
Create 50 files in c:\temp
.NOTES
Version: 1.0
Author: R. Mens - LazyAdmin.nl
Creation Date: 04 oct 2022
Modified Date:
Purpose/Change: Init
Link: https://a-d.site/powershell/powershell-scripting
#>
param(
[Parameter(
Mandatory = $true,
HelpMessage = "Enter path were test files should be created"
)]
[string]$path,
[Parameter(
HelpMessage = "How many files should be created"
)]
[int]$amount = 10
)
Function New-TestFiles{
<#
.SYNOPSIS
Create test files
#>
param(
[Parameter(Mandatory = $true)]
[string]$path
)
1..$amount | ForEach-Object {
$newFile = "$path\test_file_$_.txt";
New-Item $newFile
}
}
Ask for confirmation
Write-host "Creating $amount test files in $path" -ForegroundColor Cyan
$reply = Read-Host -Prompt "Is this correct? [Y] Yes [N] No "
if ( $reply -match "[yY]" ) {
New-TestFiles -path $path
}Надеюсь, вы нашли эту статью полезной. Если у вас есть вопросы, просто оставьте комментарий ниже. И, пожалуйста, поделитесь ей, если она вам понравилась!
















