Поиск по сайту:

Скрипты 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, вам нужно будет установить плагин (расширение).

  1. Сначала, установите Visual Studio Code с помощью установщика. Просто нажимайте 'Далее' на всех экранах.
  2. Нажмите на Расширения
  3. Поиск PowerShell
  4. Установите расширение PowerShell от Microsoft

PowerShell Редактор - Visual Studio Code

Чтобы создать наш первый скрипт PowerShell, нам нужно создать новый файл. Чтобы поддерживать порядок, мы создадим новую папку «скрипты», где будем хранить наши файлы. В Visual Studio Code:

  1. Откройте Проводник
  2. Выберите Открыть папку
  3. Создайте новую папку под названием scripts, например, в вашем OneDrive
  4. Нажмите Выбрать папку

Вы получите запрос, если доверяете файлам в этой папке, убедитесь, что вы отметили «Доверять авторам всех файлов в родительской папке» и нажмите Да, я доверяю авторам.

Чтобы создать новый файл, щелкните правой кнопкой мыши в редакторе (или нажмите на значок "Новый файл") и создайте свой первый скрипт 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

Другой метод заключается в использовании самого PowerShell для выполнения вашего скрипта. Откройте Windows PowerShell или Windows Terminal (щелкните правой кнопкой мыши на 'Пуск') и перейдите в папку, где сохранен ваш скрипт. Введите имя файла вашего скрипта и нажмите Enter.

Используя Windows Terminal

Основы

Использование 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

Переменные

При написании скриптов вам часто потребуется временно хранить данные, чтобы использовать их позже в вашем скрипте. Для этого мы используем переменные. В 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Заменить указанное значение
Операторы PowerShell

Мы можем использовать эти операторы в комбинации, например, с оператором 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
    }
}

Использование Read-Host внутри сценария PowerShell

Функции

Функции - отличный способ организовать и повторно использовать части кода внутри вашего скрипта. Функция должна выполнять одну задачу. Хороший пример этого можно найти в этом скрипте отчета о размере 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.

Отладка PowerShell в Visual Studio Code

С помощью кнопок вверху (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
}

Надеюсь, вы нашли эту статью полезной. Если у вас есть вопросы, просто оставьте комментарий ниже. И, пожалуйста, поделитесь ей, если она вам понравилась!