Игры в PowerShell
Я использую PowerShell для многих вещей, но вы знали, что вы также можете играть в игры в PowerShell? В этом блоге я покажу вам несколько таких игр, которые приятно поиграть, пока ждете завершения установки или компиляции кода 🙂
PSHangMan
Install-Module -Name PSHangManПосле установки вы можете начать новую игру, используя New-HangManGame в командной строке PowerShell:

PSWordle
Вероятно, вам знакома игра Wordle 🙂 Это простая игра на угадывание слов, которая до сих пор довольно популярна! Брэдли Уайатт также создал версию PowerShell, и вы можете установить ее, используя:
Install-Module -Name PSWordleПосле установки вы можете начать новую игру, используя New-PSWordleGame в командной строке PowerShell:

Также вы можете использовать параметр -UseEmojiResponse для другого формата:

Используйте Get-PSWordleLeaderBoard, чтобы увидеть таблицу лидеров:

PowerShelldle
Это онлайн-игра, созданная mjezew, Cody Bender, Steven van Dijk и Стивеном Стоддардом, в которой вы должны угадать cmdlet PowerShell. Доступ к ней можно получить по адресу https://powershelldle.com/. При открытии она будет выглядеть так:

Вы можете начать вводить cmdlet, который, по вашему мнению, это. Я сначала подумал, что это что-то с Read, но показал первый символ, T. Поэтому после еще двух попыток, я угадал Test-Connection 🙂

Это ежедневная головоломка, и вы можете делать ее каждый день, чтобы узнать новый cmdlet со своим кратким описанием 🙂
Еще игры?
Вы играете или знаете еще какие-то игры, о которых стоит упомянуть? Пожалуйста, дайте знать в комментариях!
Скрипты PowerShell для администратора
PowerShell – мощный инструмент для администраторов Windows, предоставляющий широкий набор команд и сценариев для автоматизации и управления системой. Ниже приведены несколько примеров PowerShell-скриптов, которые могут быть полезны администраторам:
Создание резервной копии файлов
$sourcePath = C:\Path\To\Source
$destinationPath = D:\Backup
$timestamp = Get-Date -Format yyyyMMddHHmmss
$backupFolder = $destinationPath\Backup_$timestamp
Copy-Item -Path $sourcePath -Destination $backupFolder -RecurseМониторинг дискового пространства
$threshold = 80
$diskLetter = $disk.DeviceID## Предупреждение: диск $diskLetter заполняется свободным местом ($freeSpacePercentage%)
## Можно добавить уведомление администратора
## Создание нового пользователя:
$password = ConvertTo-SecureString SecurePassword123 -AsPlainText -Force
## Мониторинг событий в журнале событий:
$logName = System
$events = Get-WinEvent -LogName $logName -MaxEvents 10
Write-Host Event ID $($event.Id): $($event.Message)
## Обновление всех установленных модулей PowerShell:
Update-Module -Name $\_.Name -Force
## Удаление временных файлов в системной директории:
Remove-Item $tempPath\\\* -Force
## Создание отчета о состоянии служб:
## Настройка правил брандмауэра:
New-NetFirewallRule -DisplayName Allow-SSH -Direction Inbound -Protocol TCP -LocalPort 22 -Action Allow
## Удаление неиспользуемых профилей пользователей:
$inactiveDays = 90
$lastUseDate = $profile.LastUseTime
$difference = (Get-Date) — $lastUseDate
Remove-WmiObject -InputObject $profile -Confirm:$false
Эти примеры предоставляют общее представление о том, как PowerShell может использоваться администраторами для автоматизации различных задач в Windows-среде. Помните, что некоторые команды могут потребовать выполнения от имени администратора.
Для вызова скриптов PowerShell, вы можете использовать команду Invoke-Expression или просто указать путь к файлу скрипта. Предположим, у вас есть следующие скрипты: ClearDisk.ps1, InstallPrograms.ps1, BackupScript.ps1, и UpdateSystem.ps1.
## Скрипт очистки диска (ClearDisk.ps1):
## Ваш код для очистки диска
## Пример: удаление временных файлов
Remove-Item -Path $env:TEMP\\\* -Recurse -Force
Используйте Invoke-Expression
Invoke-Expression -Command .\ClearDisk.ps1
Или просто указывайте путь к файлу скрипта
## Скрипт автоматической установки программ (InstallPrograms.ps1):
## Ваш код для автоматической установки программ
## Пример: установка программы Chocolatey и установка пакетов
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString(‘https://chocolatey.org/install.ps1’))
choco install packageName -y
Используйте Invoke-Expression
Invoke-Expression -Command .\InstallPrograms.ps1
Или просто указывайте путь к файлу скрипта
## Скрипт резервного копирования (BackupScript.ps1):
## Ваш код для создания резервной копии
## Пример: копирование файлов в другую директорию
$sourcePath = C:\Path\To\Source
$destinationPath = D:\Backup
Copy-Item -Path $sourcePath -Destination $destinationPath -Recurse
Используйте Invoke-Expression
Invoke-Expression -Command .\BackupScript.ps1
Или просто указывайте путь к файлу скрипта
## Скрипт автоматического обновления системы (UpdateSystem.ps1):
## Ваш код для автоматического обновления системы
## Пример: обновление всех установленных модулей PowerShell
Update-Module -Name $\_.Name -Force
Используйте Invoke-Expression## Invoke-Expression -Command .\\UpdateSystem.ps1
## Или просто указывайте путь к файлу скрипта
Убедитесь, что вы находитесь в той же директории, что и ваши скрипты, или укажите полный путь к файлу скрипта.
В этой статье мы коснулись всех аспектов создания, запуска и использования скриптов в Windows. Надеемся, что эти советы и примеры помогут вам освоить этот увлекательный мир автоматизации и сделают вашу работу более эффективной и приятной.
## Массивы, хеш-таблицы, функции и классы
В PowerShell есть множество возможностей для создания сложных структур данных и алгоритмов. Вот краткое описание некоторых из них:
### Массивы (Arrays)
Позволяют хранить набор элементов одного типа. Элементы могут быть доступны по индексам. Создаются массивы с использованием квадратных скобок `[ ]`.
$fruits = Apple, Banana, Orange
$fruits[0] # Доступ к элементу массива по индексу
### Хеш-таблицы (Hash Tables)
Представляют собой пары ключ-значение, где ключи уникальны. Полезны для хранения и быстрого доступа к данным по ключу.
$person = @{ Name = John Age = 30 City = New York
}
$person[Name] # Доступ к значению по ключу
### Пользовательские функции
Вы можете определить собственные функции для группировки кода и повторного использования. Их определение происходит с использованием ключевого слова `function`.
function Get-Sum { param($a, $b) return $a + $b
}
$result = Get-Sum 5 3
### Пользовательские классы
PowerShell поддерживает создание пользовательских классов, что позволяет создавать более сложные объекты с различными свойствами и методами.
class Person { [string] $Name [int] $Age Person([string] $name, [int] $age) { $this.Name = $name $this.Age = $age } [string] GetInfo() { return $($this.Name), $($this.Age) years old }
}
$person = [Person]::new(Alice, 25)
$info = $person.GetInfo
## Команды (командлеты) PowerShell
В языке программы PowerShell команды носят название командлеты (от английского cmdlet). Все они формируются с использованием шаблона Глагол-Существительное или Действие-Объект. Например, Get-Services и Start-Process. Благодаря такой структуре, можно легко понять предназначение команды, даже если вы с ней еще не работали ранее.
### Синтаксис командлетов
После имени самого командлета следует указание параметров и их значений. Между всеми частями команды следует проставлять пробелы. Вот пример синтаксиса командлета, который позволяет перейти в директорию C:\:
Set-Location -LiteralPath C:\ -PassThru
Разберем его на составные части:
- Set-Location: буквально вызвать команду. Этот командлет позволяет выполнять указанный блок сценария.
- -LiteralPath C\: — здесь передаем блок сценария, в котором используется команда Set-Location для перехода в каталог C\:.-Параметр: **PassThru**
По умолчанию командлет `Invoke-Command` не возвращает результат выполнения. Этот параметр указывает на необходимость вывода информации о местоположении, в которое был выполнен переход с помощью команды `Set-Location`.

**Важно отметить, что регистр букв в командах PowerShell не имеет значения.** Таким образом, данную команду можно записать в виде заглавных букв, строчных букв или даже смешанного регистра, и она все равно будет выполняться:
```powershell
sEt-loCATion -PATH c:\ -passthruКогда в одной строке объединены несколько команд, они разделяются точкой с запятой ;.
Иногда команда может быть слишком длинной. Для разделения на несколько строк можно использовать символ обратного апострофа ` в месте переноса. Новую строку можно создать, нажав Shift + Enter (для переноса строки ниже текущей) или Ctrl + Enter (для переноса строки выше текущей).
Разделим предыдущую команду:
Set-Location `
-LiteralPath C:\ `
-PassThru
Алиасы
В процессе работы с терминалом иногда может быть неудобно постоянно вводить полные названия командлетов. Именно поэтому у наиболее часто используемых командлетов существуют псевдонимы (алиасы) — их сокращенные варианты.
Чтобы получить список доступных алиасов, вы можете воспользоваться командой Get-Alias. Кроме того, данной команде также доступен псевдоним gal.

Чтобы получить список алиасов для конкретного командлета, вы можете использовать параметр -Definition. Пример:
Get-Alias -Definition Set-Location
Если вам нужно узнать полное название командлета по его алиасу, используйте параметр -Name. Этот параметр необязателен, так как он является аргументом по умолчанию.
Оба следующих варианта эквивалентны:
Get-Alias -Name clear
Get-Alias clear
Особенности обработки путей к каталогам
Для многих командлетов необходимо предоставить путь к файлу или каталогу. Это делается с использованием строки, например: C:\Windows\System32.
Однако, если в пути встречается пробел или другой специальный символ, PowerShell будет рассматривать его как разделитель. Например:
Set-Location C:\Program Files
PowerShell «воспринимает» пробел и интерпретирует его так, будто путь к папке закончился на слове `Program`, а `files` — это уже значение другого параметра.
Чтобы избежать подобных ситуаций, существует два метода:
* Экранировать символы с помощью обратного апострофа `` ` ``: `` C:\Program` Files ``. Однако это может быть неудобным, если путь длинный.
* Поместить весь путь в одинарные или двойные кавычки: `'C:\Program Files'` или `"C:\Program Files"` (желательнее использовать одинарные кавычки).
Кроме того, в PowerShell существуют сокращения для быстрого доступа к ближайшим директориям:
* Точка `.` указывает на текущий каталог. Например, `Get-ChildItem .` позволяет просмотреть содержимое текущего местоположения.
* Две точки `..` указывают на родительский каталог. Например, `Set-Location ..` позволяет перейти к родительскому каталогу. Это может быть полезно, если вы находитесь в глубоко вложенной директории.
Большинство командлетов имеют параметры `-Path` и `-LiteralPath`, позволяющие указать путь к файлу или папке. Разница между ними заключается в том, что в `-Path` можно включать переменные, в то время как —`LiteralPath` интерпретирует символы буквально, даже если они содержат имя переменной.
### Get-Help: как изучать новые командлеты
Для получения подробной информации о конкретном командлете воспользуйтесь командой `Get-Help Название-Командлета`. Пример:
Get-Help Get-Childitem

У команды `Get-Help` имеется несколько полезных параметров:
* `-Detailed` предоставляет более подробную справку по командлету.
* `-Full` предоставляет полную справку.
* `-Examples` демонстрирует примеры использования командлета.
* `-Online` перенаправляет пользователя на веб-страницу с соответствующей документацией.
## Выполняемые скрипты Windows
Это скрипты, которые могут быть выполнены в среде операционной системы Windows и обычно предназначены для автоматизации различных задач. Включают в себя bat-скрипты (командные файлы), PowerShell-скрипты, а также другие типы скриптов, которые можно выполнять в Windows. Общее отличие между bat-скриптами и PowerShell-скриптами заключается в языке программирования, используемом для написания команд и инструкций. Bat-скрипты используют язык пакетных команд, который является устаревшим и имеет ограниченные возможности по сравнению с PowerShell, который представляет более современный и мощный язык с разнообразными функциональными возможностями для автоматизации задач в Windows.
## Выполнение скриптов в PowerShell
PowerShell представляет собой новую командную оболочку для операционной системы Windows, созданную Microsoft с целью полного замещения и улучшения cmd. Эта оболочка уже включена в состав операционных систем Windows 7 и выше. Если у вас старая версия операционной системы или вы хотите загрузить более новую версию PowerShell. Windows — операционная система, пользующаяся огромной популярностью среди миллионов пользователей по всему миру. В ее арсенале множество функций и возможностей, однако некоторые из них остаются недостаточно известными обычным пользователям. В данной статье мы расскажем о нескольких полезных сценариях, способных сделать вашу работу с Windows более эффективной и удобной.
Политика исполнения PowerShell-скриптов представляет собой механизм безопасности, управляющий условиями загрузки конфигурационных файлов и запуска сценариев в данной среде. Её основное предназначение — предотвращение выполнения потенциально вредоносных сценариев.

## Какое расширение имеют файлы скриптов PowerShell
PowerShell-скрипты имеют расширение \*.ps1\*, и для их выполнения часто требуется предварительная настройка политики выполнения скриптов (Execution Policy), чтобы разрешить запуск скрипта через PowerShell в системе.
## Полезные сценарии для Windows
### 1\. Скрипт выключения Windows (или перезагрузки):
Простейшая операция выключения компьютера. Откройте блокнот и введите:
_shutdown -s -t 0_
Сохраните файл с расширением \*.cmd\* (например, \*shutdown.cmd\*). При запуске этого файла компьютер выключится. Замените «-s» на «-r» для перезагрузки. Параметр «-t» устанавливает таймер; в данном случае, он равен 0 секунд, но можно установить, например, на 60 для выключения через 60 секунд.
### 2\. Удаление ненужных приложений:
С помощью следующего скрипта можно удалить предустановленные приложения:
Замените \*APPNAME\* на название ненужного приложения. Хотя удаление можно выполнить стандартным способом или через программы, этот скрипт делает процесс более удобным.
### 3\. Управление процессами:
Воспользуйтесь PowerShell для борьбы с медленными процессами. Выведите все службы:
Или получите информацию о конкретной службе с кодовым именем \*NAME\*:
Создайте файл, который закрывает процессы с повышенным потреблением ресурсов:
_Stop-Service -Name \*ANTIVIRUS\*_
_Stop-Service -Name \*BROWSER\*_
Замените \*ANTIVIRUS\* и \*BROWSER\* на соответствующие названия.
### 4\. Переименование группы файлов:
Решите проблему однотипных файлов с помощью скрипта группового переименования:
_$path = «$comp\\desktop\\journey\\russia»_
_$filter = ‘\*.jpg’_
Укажите путь, расширение и выполните замены в строке.
### 5\. Поиск файлов:
Используйте PowerShell для поиска файлов в директории:
Для более сложного поиска в подпапках:
Get-ChildItem C:\\Windows\\\* -Include \*.log -Recurse -Force
### 6\. Справка:
Пользуйтесь командой \*Get-Help\* для получения информации:
Для более подробной справки по конкретной команде:
_Get-_ _Help —_ _Name \*_ _CMDLET\*_
### 7\. Получение информации о системе:
Используйте PowerShell для получения данных о системе, например, уровне заряда аккумулятора:
_Add-Type -AssemblyName System.Windows.Forms_
Информация об архитектуре процессора удаленного компьютера:
Проверка прав администратора текущего пользователя:
Эти простые и полезные сценарии помогут вам эффективнее управлять вашей системой Windows.
## Bat-скрипты Windows
Bat-скрипты, или файлы пакетных команд (Batch-файлы), представляют собой текстовые файлы, содержащие команды и инструкции для выполнения в командной строке Windows. Основаны на языке пакетных команд (Batch scripting language). Расширение файла: \*.bat\* (например, \*myscript.bat\*).
Пример простого bat-скрипта:
## Фоновое выполнение команд
Определенные задачи могут требовать значительного времени на выполнение. Примеры таких задач включают установку и обновление программного обеспечения или поиск файлов в обширной директории. **Важно помнить, что во время выполнения одной команды в PowerShell нельзя вводить другие команды.**
Рассмотрим пример: предположим, нужно найти файл `powershell.exe` на всем диске **C**. Для этой цели воспользуемся командлетом `Get-ChildItem` с параметром `-Recurse`. Это позволит ему искать файл не только в текущем каталоге, но и во всех его подкаталогах.
Следует учитывать, что PowerShell может столкнуться с папками, к которым у него нет доступа. Чтобы обойти возможные ошибки, добавим параметр `-ErrorAction SilentlyContinue`. Это означает, что в случае ошибки команда не будет генерировать уведомления, а просто продолжит выполнение.
Таким образом, данная ситуация выглядит следующим образом:
Get-ChildItem -Path C:\ -Name powershell.exe -Recurse -ErrorAction SilentlyContinue

Очевидно, что во время выполнения задачи, командная строка становится недоступной. Для принудительного прерывания выполнения задачи можно воспользоваться сочетанием клавиш **Ctrl + C**. Важно убедиться, что при этом ничего не выделено, чтобы избежать возможного восприятия компьютером как команды «Копировать».
Start-Job {Get-ChildItem -Path C:\ -Name powershell.exe -Recurse -ErrorAction SilentlyContinue}

Параллельно возможно выполнение любого числа фоновых задач. В дополнение к командлету `Start-Job`, предназначенному для управления фоновыми задачами, существуют и другие командлеты:
* `Get-Job` предоставляет отчет о состоянии фоновых задач.
* `Wait-Job` блокирует консоль до завершения фоновой задачи.
* `Stop-Job` прекращает выполнение фоновой задачи.
* `Receive-Job` выводит результаты выполнения фоновой задачи и очищает их из памяти. Для сохранения результатов в памяти используйте параметр `-Keep`.
Опции `Wait-Job`, `Stop-Job` и `Receive-Job` требуют указания имени `Name` или идентификатора `Id` конкретной задачи или задач (в случае нескольких). Это можно сделать непосредственно или в связке с командлетом `Get-Job`.
Get-Job Job1

## Логические операторы
В PowerShell вы также можете выполнять арифметические операции над объектами и строками, сравнивать их друг с другом, используя логические операторы.
* `+` — сложение;
* `-` — вычитание;
* `*` — умножение;
* `/` — деление;
* `%` — деление по модулю;
* `(` и `)` — скобки для группировки операций.
**Операторы сравнения** оформляются так же, как параметры командлетов, и их названия произошли от английских выражений, указанных в скобках:
* `-eq` — равно (от «**eq**ual»);
* `-ne` — не равно (от «**n**ot **e**qual»);
* `-gt` — больше (от «**g**reater **t**han»);
* `-ge` — больше либо равно (от «**g**reater than or **e**qual»);
* `-lt` — меньше (от «**l**ess **t**han»);
* `-le` — меньше либо равно (от «**l**ess than or **e**qual»).
## Работа с файлами
PowerShell предоставляет удобные средства для работы с файлами. Вот некоторые ключевые методы:
Для **создания файла** используйте командлет `New-Item` с указанием пути к файлу:
New-Item -Path "C:\путь\к\файлу\новыйфайл.txt" -ItemType File
Чтобы **записать данные в файл**, используйте `Out-File` или `Set-Content`:
"Содержимое файла" | Out-File -FilePath "C:\путь\к\файлу\новыйфайл.txt"
Set-Content -Path "C:\путь\к\файлу\новыйфайл.txt" -Value "Новое содержимое файла"
Для **чтения содержимого файла** в массив используйте `Get-Content`:
$содержимое = Get-Content -Path "C:\путь\к\файлу\новыйфайл.txt"
Для **получения информации о файле** (размер, дата создания и др.) используйте `Get-Item`:
$информацияОФайле = Get-Item -Path "C:\путь\к\файлу\новыйфайл.txt"
Для **копирования файла** в другое место используйте `Copy-Item`:
Copy-Item -Path "C:\путь\к\файлу\новыйфайл.txt" -Destination "C:\путь\к\копия\новыйфайл.txt"
Для **удаления файла** воспользуйтесь командлетом `Remove-Item`:
Remove-Item -Path "C:\путь\к\файлу\новыйфайл.txt" -Force
Помните, что операции удаления файлов необратимы, поэтому будьте осторожны при их использовании.
## Циклы
В PowerShell существует несколько видов циклов:
* Цикл с предусловием `while`:
$counter = 0
while ($counter -lt 5) { Write-Host "Counter is $($counter)" $counter++
}
* Цикл с постусловием истинным `do while`:
$counter = 0
do { Write-Host "Counter is $($counter)" $counter++
} while ($counter -lt 5)
* Цикл с постусловием ложным `do until`:
$counter = 0
do { Write-Host "Counter is $($counter)" $counter++
} until ($counter -ge 5)
* Цикл с известным числом итераций `for`:
for ($i = 0; $i -lt 5; $i++) { Write-Host "Iteration is $i"
}
* Цикл с перебором элементов коллекции `foreach`:
$numbers = 1..5
foreach ($num in $numbers) { Write-Host "Number is $num"
}
Во всех случаях синтаксис похож на синтаксис условных операторов: в круглых скобках указывается условие или параметры, а в фигурных скобках — код, который выполняется внутри цикла.
## Как разрешить выполнение неподписанного скрипта PowerShell?
* В оболочке PowerShell перед запуском скрипта выполните следующую команду для разрешения выполнения неподписанных скриптов в текущем сеансе оболочки:
_Set-ExecutionPolicy RemoteSigned -Scope Process_
* При запуске из стандартного командного интерфейса используйте параметр -executionpolicy, например:
_PowerShell -executionpolicy RemoteSigned -file <имя_ _\_скрипта_ _\>_
Оба способа устанавливают политику только для текущего сеанса, при этом политика безопасности выполнения скриптов PowerShell, установленная в реестре, остается неизменной. Если вы хотите изменить политику безопасности выполнения скриптов «навсегда», используйте следующий способ:
* Разрешить выполнение навсегда: запустите оболочку PowerShell от имени «Администратора» и выполните команду:
Однако рекомендуется избегать этого способа, чтобы не подвергать ваш компьютер возможным угрозам, поскольку это разрешает выполнение всех скриптов всегда.
_Примечание: Если скрипт был загружен из интернета, чтобы избежать запроса на подтверждение выполнения, используйте параметр Bypass вместо RemoteSigned — это полное отключение любых запросов и предупреждений._

## Как сделать и запустить скрипт PowerShell
Создать скрипт PowerShell довольно просто. Вот шаги, которые вы можете выполнить, чтобы создать свой первый скрипт:
### 1\. Откройте редактор PowerShell ISE:
PowerShell ISE (Integrated Scripting Environment) предоставляет удобную среду для написания и отладки скриптов. Вы можете его найти в меню «Пуск» (Start) под разделом «Стандартные» (Standard) или выполнить команду \`PowerShell\_ise\` в командной строке.
### 2\. Напишите свой скрипт:
В окне редактора PowerShell ISE напишите свой скрипт. Ниже приведен пример простого скрипта, который выводит «Hello, World!» в консоль:
_Write-Host «Hello, World!»_
### 3\. Сохраните скрипт:
* Нажмите \`Ctrl + S\` или выберите «Файл» (File) -> «Сохранить» (Save).
* Укажите имя файла и добавьте расширение \`.ps1\` (например, \`MyScript.ps1\`).
### 4\. Запустите скрипт:
* Выберите весь текст скрипта.
* Нажмите \`F5\` или выберите «Запустить сценарий» (Run Script) в PowerShell ISE.
Примеры более сложных скриптов:
_#Скрипт, создающий новую папку:_
_$_ _folderPath = «_ _C:\\_ _Path\\_ _To\\_ _NewFolder»_
_New-Item -ItemType Directory -Path $folderPath_
_#Скрипт, удаляющий все файлы старше 7 дней в папке:_
_$folderPath = «C:\\Path\\To\\Folder»_
_$limitDate = (Get-Date).AddDays(-7)_
_#Скрипт, проверяющий статус службы:_
_Write-Host «The status of service $serviceName is: $($serviceStatus.Status)»_
Ваши скрипты могут включать более сложные команды, использовать условия, циклы и вызывать функции. Как только вы освоите основы, вы сможете создавать более мощные и гибкие скрипты PowerShell.

Скрипты для Windows — не просто строки кода, а волшебные ключи, открывающие дверь в мир автоматизации. В руках умелого пользователя они становятся инструментом, способным не только сэкономить время, но и превратить рутинные задачи в захватывающее путешествие по потокам байтов и командам.
## Как открыть PowerShell в Windows
Как правило, PowerShell уже установлен на вашем компьютере по умолчанию. Однако, если по какой-то причине его нет, вы можете воспользоваться инструкциями, предоставленными Microsoft. В дополнение, в официальной документации имеются подробные руководства по установке на macOS и Linux.
PowerShell является независимым от версии операционной системы инструментом и работает одинаково стабильно как на Windows 10, так и на Windows Server.
Существует два основных метода для запуска PowerShell или PowerShell ISE в системе Windows: через меню «**Пуск**» и с помощью приложения «**Выполнить**».
* Для того чтобы открыть PowerShell **через меню «Пуск»**, пройдите к папке Windows PowerShell, откройте её и выберите необходимое приложение. В этой директории доступны как 32-разрядные версии (отмечены как x86 в скобках), так и 64-разрядные версии терминала и ISE.

* Чтобы запустить PowerShell **через приложение «Выполнить»**, используйте комбинацию клавиш **Win + R**. Когда появится окно, введите `powershell` или `powershell ise` (в зависимости от того, какое приложение вам нужно) и нажмите кнопку **ОК**.

## Объекты и конвейеры (пайплайны) в PowerShell
Когда вы работаете с командлетами в PowerShell, они возвращают не просто строки, а объекты — структуры данных, содержащие набор свойств и методов.
То, что отображается в терминале после выполнения команды в виде строки, на самом деле является визуальным представлением объекта. Программа PowerShell отображает определенные свойства объектов в виде таблицы, но далеко не все свойства могут быть отображены таким образом.
Аналогично тому, как командлеты могут возвращать объекты, они также могут принимать и обрабатывать их. Вы можете создать команду, которая возвращает объект, передать этот объект другому командлету, получить объект из него и так далее — этот процесс и называется **конвейерами** или **пайплайнами**.
### Пример работы конвейера в PowerShell
Команда `Get-Process` возвращает список запущенных процессов на компьютере. При передаче ей имени процесса (или шаблона, созданного с помощью регулярных выражений), команда выведет только соответствующие элементы списка.
Рассмотрим пример, где вызываем запущенный процесс `PowerShell`:
Get-Process powershell

Мы получаем объект и таблицу, отображающую некоторые его свойства. Чтобы узнать все свойства и методы, давайте передадим этот объект командлету `Get-Member`. Для этого используется конвейер:
Get-Process powershell | Get-Member

Команда `Get-Member` получает объект от команды `Get-Process` и выводит таблицу со всеми его свойствами и методами. Результат работы `Get-Member` также представляет собой объект (точнее, список объектов), который можно передать по конвейеру дальше.
Допустим, нужно вывести только те строки, в которых `MemberType` равно `Property`. Для этого используем команду `Where-Object`:
Get-Process powershell | Get-Member | Where-Object {$_.MemberType -eq 'Property'}

Команда `Where-Object` последовательно обходит каждый объект, полученный от команды `Get-Member`. Выражение в фигурных скобках — логическое:
* `$_` ссылается на текущий объект (то есть на отдельную строку в таблице);
* `.MemberType` обращается к значению свойства `MemberType` в этом объекте;
* `-eq` выполняет сравнение между выражением слева и выражением справа от него;
* `'Property'` представляет значение, которое ожидаем увидеть у свойства `MemberType`.
Более подробно о логических выражениях рассказано ниже.
### Форматирование таблиц с помощью конвейеров
Командлет `Format-Table` в PowerShell предоставляет возможность настроить вывод таблицы в терминале: выбирать нужные свойства и методы, устанавливать ширину столбцов, группировать данные по нескольким таблицам и т. д.
Форматируем таблицу, полученную с помощью командлета `Get-Member`. Следует использовать следующий синтаксис:
Get-Process powershell | Get-Member | Format-Table -AutoSize -Wrap -GroupBy MemberType -Property Name, Definition

Разберем параметры командлета `Format-Table`:
* `-AutoSize` выравнивает ширину столбцов в соответствии с размерами их содержимого. Это позволяет оптимально использовать ширину экрана.
* `-Wrap` переносит содержимое ячейки на новую строку, если оно не помещается в текущих размерах экрана. По умолчанию, если текст не помещается, он обрезается.
* `-GroupBy` позволяет разделить одну таблицу на несколько, сгруппированных по значению определенного свойства. В данном случае, для каждого значения `MemberType` будет создана отдельная таблица.
* `-Property` определяет, какие свойства объекта будут отображены в таблице в качестве столбцов. В данном примере, мы указали свойства `Name` и `Definition`.
Эти параметры позволяют настраивать внешний вид таблицы, сделать вывод более читабельным и структурированным.
### Сортировка таблиц с помощью конвейеров
Командлет `Sort-Object` в PowerShell позволяет сортировать список объектов (таблицу) по значениям их свойств (столбцов). Давайте отсортируем результат, полученный с помощью командлета `Get-Member`, по столбцу `Name` в алфавитном порядке. Для этого воспользуемся параметром `-Property`, который действует аналогично параметру у командлета `Format-Table`:
Get-Process powershell | Get-Member | Sort-Object -Property Name

Командлет Sort-Object в PowerShell имеет также другие полезные параметры:
* `-Descending` сортирует объекты в порядке убывания. Например:
Get-Process powershell | Get-Member | Sort-Object -Property Name -Descending
* `-Unique` удаляет дубликаты и возвращает только уникальные объекты. Например:
Get-Process powershell | Get-Member | Sort-Object -Property Name -Unique
* Параметр `-Top` получает число N и отображает первые N объектов в таблице. Например:
Get-Process | Sort-Object -Property CPU -Top 10
* Параметр `-Bottom` получает число N и отображает последние N объектов в таблице. Например:
Get-Process | Sort-Object -Property Memory -Descending -Bottom 5
Эти параметры позволяют более гибко настраивать сортировку и отображение объектов в выводе.
## Как запустить скрипт через PowerShell с параметрами?
Запуск осуществляется аналогично запуску обычной программы или bat-файла с параметрами. Например, чтобы запустить скрипт с параметрами из командной строки, используйте следующую команду:
_PowerShell -executionpolicy RemoteSigned -file <имя_ _\_скрипта_ _\> param1 param2 «еще_ _один_ _текстовый_ _параметр_ _«_
В самом скрипте параметры могут быть получены так:
_param ($var1, $var2, $var3)_
В интегрированной среде PowerShell ISE скрипт с параметрами можно запустить аналогично, используя область команд.

## Для чего нужен PowerShell
PowerShell — это мощный инструмент для автоматизации задач, управления операционной системой и взаимодействия с различными приложениями и сервисами. Он широко используется администраторами систем, разработчиками, а также специалистами в области IT для решения разнообразных задач. Вот некоторые из основных применений PowerShell:
1. **Автоматизация задач**: PowerShell позволяет создавать сценарии (скрипты) для автоматизации повторяющихся и рутинных задач, таких как установка программ, настройка системных параметров, копирование файлов и многие другие операции.
2. **Управление системой**: PowerShell предоставляет доступ к широкому спектру системных функций, позволяя администраторам управлять пользователями, группами, службами, процессами, реестром и другими системными ресурсами.
3. **Конфигурация и развертывание**: С помощью PowerShell можно создавать и применять конфигурации для развертывания и управления серверами и компьютерами, что делает процесс управления парком устройств более эффективным.
4. **Мониторинг и анализ**: PowerShell позволяет анализировать системные данные, собирать статистику, мониторить производительность и события, что помогает администраторам быстро реагировать на проблемы.
5. **Взаимодействие с внешними приложениями и службами**: PowerShell может взаимодействовать с другими приложениями и службами, используя API, веб-службы, REST API и другие протоколы, что позволяет автоматизировать процессы, связанные с сторонними приложениями.
6. **Разработка и тестирование**: Разработчики используют PowerShell для создания сценариев тестирования, сборки проектов, управления версиями и других задач, связанных с разработкой ПО.
7. **Обработка данных**: PowerShell предоставляет мощные инструменты для обработки и анализа данных, таких как текстовые файлы, CSV, XML и другие форматы данных.
8. **Безопасность**: PowerShell может использоваться для управления политиками безопасности, мониторинга событий безопасности, а также для проведения аудитов безопасности системы.
## Командные скрипты Windows
Это общий термин, который включает в себя различные типы скриптов и командных файлов, используемых в операционной системе Windows для автоматизации задач. Включают в себя как скрипты на языке командной строки (например, скрипты CMD), так и на более современных языках, таких как PowerShell. Например, Bat-скрипты (\*.bat), PowerShell-скрипты (\*.ps1), а также другие сценарии, созданные для автоматизации определенных задач.
## Как запустить скрипт PowerShell в фоновом режиме?
Для этого используйте параметр -WindowStyle, который может принимать значения: Normal, Minimized, Maximized и Hidden. Чтобы запустить неподписанный скрипт в фоновом режиме, выполните команду:
_PowerShell -executionpolicy RemoteSigned -WindowStyle Hidden -file <имя_ _\_скрипта_ _\>_
Также при желании вы можете добавить -NonInteractive, чтобы скрипт не задавал никаких вопросов. Таким образом, скрипт выполнится незаметно для пользователя. Однако будьте внимательны, используя этот способ.

## Работа в PowerShell ISE
Командная оболочка PowerShell представляет собой удобный инструмент для выполнения малых, кратких однострочных задач. Однако для создания и сохранения более сложных сценариев существует интегрированная среда разработки скриптов **PowerShell ISE**.

PowerShell ISE представляет собой инструмент, состоящий из трех основных панелей:
* Область скриптов в верхней части экрана, предназначенная для написания сценариев.
* Консольная область в нижней части экрана, которая функционирует как обычный терминал, позволяя вводить команды в интерактивном режиме.
* Панель команд в правой части экрана, предоставляющая полное руководство по командам PowerShell. В ней также есть конструктор, который помогает задать значения нужных параметров.
### Комментарии в коде
Вот пример PowerShell скрипта с комментариями:
# Это комментарий в одну строку, начинается с символа '#' и продолжается до конца строки.
# Пример переменной
$имя = "John"
$возраст = 30
# Вывод информации
Write-Host "Привет, $имя! Тебе $возраст лет."
# Это многострочный комментарий, который начинается с '<#' и заканчивается '#>'.
<#
Этот блок комментария может быть многострочным и располагаться
на нескольких строках, чтобы объяснить более сложные участки кода.
#>
# Функция для сложения двух чисел
function Сложить-Числа { param( [int]$число1, [int]$число2 ) $результат = $число1 + $число2 return $результат
}
# Вызов функции и вывод результата
$результатСложения = Сложить-Числа -число1 5 -число2 7
Write-Host "Результат сложения: $результатСложения"
**Хорошая практика — комментировать код** таким образом, чтобы другие разработчики (или вы в будущем) могли легко понять, как работает код и какие цели преследовались при его написании.
### Советы по написанию хорошего кода:
* **Применяйте нотацию PascalCase** для названий командлетов, функций, параметров, свойств, методов, переменных и классов. Разработчики Powershell выпустили для этого гайд. **Не рекомендуется:** `get-service`, `Get-service`, `GET-SERVICE`. **Рекомендуется:** `Get-Service`.
* **Используйте полные названия командлетов.** Алиасы удобны для интерактивного режима, но в скриптах они могут затруднить понимание. **Не рекомендуется:** `dir`, `gci`, `ls`. **Рекомендуется:** `Get-ChildItem`.
* **Применяйте стиль One True Brace для форматирования вложенных блоков кода.** Если вы используете фигурные скобки, внутренний код отделяется табуляцией (четыре пробела), а фигурные скобки размещаются следующим образом:
if ($var1 -eq $var2) {
# Код внутри условия
} else {
# Код внутри else
# Еще код внутри else
}
Исключение: когда код внутри фигурных скобок небольшой, его можно записать в одну строку:
Get-ChildItem | Where-Object { $_.Length -gt 10mb }
### Запуск скриптов
В PowerShell ISE имеется возможность выполнять код как целиком, так и частично, а также предоставляются инструменты для отладки. Скрипты сохраняются в файлах с расширением `**.ps1**`. Однако запустить скрипт, просто дважды щелкнув по нему, не получится. Вместо этого вы можете нажать правую кнопку мыши и выбрать опцию `**Выполнить с помощью PowerShell**`.
Также существует возможность запуска скрипта из оболочки. Например, предположим, у вас есть файл скрипта **test\_script.ps1** в каталоге `**C:\Scripts**`. Вы можете выполнить его двумя способами:
1. Используя команду `PowerShell -File C:\Scripts\test_script.ps1` из любого места. Это позволяет запустить скрипт, указав полный путь к файлу.
2. Используя команду `.\test_script.ps1`, если вы находитесь в каталоге `**C:\Scripts**`. Это запустит скрипт, находясь в том же каталоге, что и файл скрипта.
Такие методы позволяют управлять выполнением PowerShell скриптов из разных мест и с разных уровней оболочки.
### Политика выполнения. Как разрешить выполнения скриптов
По умолчанию запрещено выполнение файлов с PowerShell-скриптами, и это сделано с целью обеспечения безопасности. Вы можете узнать текущую политику выполнения с помощью командлета `Get-ExecutionPolicy`. Вот какие варианты политики выполнения могут быть доступны:
* **Restricted** (Установлена по умолчанию) — запрещено выполнение любых скриптов. Это означает, что нельзя будет запустить ни один скрипт.
* **AllSigned** — разрешено выполнение только тех скриптов, которые были подписаны доверенным разработчиком. Это обеспечивает повышенный уровень безопасности, так как только подписанные и проверенные скрипты могут быть выполнены.
* **RemoteSigned** — разрешено выполнение подписанных доверенным разработчиком скриптов, а также собственных скриптов. Это предоставляет баланс между безопасностью и удобством, позволяя запускать свои скрипты.
* **Unrestricted** — разрешено выполнение любых скриптов без каких-либо ограничений. Это предоставляет наивысший уровень гибкости, но может повысить риск безопасности.
Чтобы ваши файлы с расширением **.ps1** запускались, вам следует изменить политику выполнения на **RemoteSigned**. Для этого выполните следующие шаги:
* Откройте PowerShell от имени администратора. Для этого щелкните правой кнопкой мыши по значку PowerShell на панели задач или в меню «Пуск» и выберите «**Запуск от имени администратора**».
* В открывшемся окне PowerShell введите следующую команду и нажмите **Enter**:
Set-ExecutionPolicy RemoteSigned
* Подтвердите изменение политики выполнения, нажав клавишу **`Y`** (Yes).
Теперь вы сможете запускать свои файлы .ps1 без ограничений. Однако, имейте в виду, что изменение политики выполнения может повлиять на безопасность системы, поэтому будьте осторожны и убедитесь, что вы запускаете только те скрипты, которые вы знаете и доверяете.
## Условия
Условные операторы в PowerShell создаются с использованием ключевых слов **`if`**, **`elseif`** и **`else`**. В круглых скобках указывается само условие, а в фигурных скобках содержится код, который выполняется при выполнении условия. Например:
$Number = 123
if ($Number -gt 0) {
Write-Host 'Число больше нуля'
} elseif ($Number -lt 0) {
Write-Host 'Число меньше нуля'
} else {
Write-Host 'Число равно нулю'
}
Результат выполнения кода: Число больше нуля
Кроме того, условия также можно задавать с помощью ключевого слова **`switch`**. Например:
$Day = 5
switch ($Day) {
1 { Write-Host 'Понедельник' }
2 { Write-Host 'Вторник' }
3 { Write-Host 'Среда' }
4 { Write-Host 'Четверг' }
5 { Write-Host 'Пятница' }
6 { Write-Host 'Суббота' }
7 { Write-Host 'Воскресенье' }
}
Результат выполнения кода: Пятница
## Чем PowerShell отличается от cmd
Рассмотрим сравнение двух основных инструментов командной строки в операционной системе Windows: PowerShell и командной строки (cmd). Оба инструмента позволяют взаимодействовать с операционной системой через команды и сценарии, однако они существенно различаются по своим характеристикам и функциональности.
| Аспект | PowerShell | Командная строка (cmd) |
| ------------------- | -------------------------------------------------- | ---------------------------------------- |
| Язык сценариев | Мощный язык на основе .NET Framework | Ограниченный язык для выполнения команд |
| Объектная модель | Работа с объектами и конвейерная обработка | Работа с текстовыми строками и потоками |
| Управление системой | Обширный набор командлетов для управления | Ограниченный набор команд для управления |
| Синтаксис | Современный и читаемый синтаксис | Простой синтаксис команд и аргументов |
| Поддержка модулей | Поддержка модулей для организации функциональности | Отсутствие концепции модулей |
Таблица сравнения PowerShell и cmd.
## Как запустить скрипт PowerShell с помощью ярлыка?
Это можно сделать двумя способами:
1. Создать файл _bat/cmd_, в котором прописать команду для запуска скрипта (с параметрами, как описано выше).
2. Создать ярлык на PowerShell, который находится в папке _c:\\Windows\\System32\\WindowsPowerShell\\v<версия>\\_. В свойствах ярлыка в поле «Объект» добавьте необходимые параметры.
Таким образом, например, чтобы запустить скрипт PowerShell при входе пользователя, просто создайте ярлык, как описано во втором пункте, и поместите его в автозагрузку. Также создание ярлыка с использованием одного из вышеописанных методов позволяет легко запускать скрипт от имени администратора или от имени любого другого пользователя, как обычную программу.
Скриптовый язык PowerShell — мощный инструмент для решения различных задач. Однако следует использовать его с осторожностью, поскольку он может быть использован не только для полезных, но и для вредоносных целей. Будьте внимательны при работе с ним.

## Работа со строками в PowerShell
PowerShell — мощный инструмент для автоматизации задач на платформе Windows. Работа со строками играет важную роль при обработке текстовых данных. Вот некоторые ключевые аспекты:
1. **Объединение строк:** Чтобы объединить строки, используйте оператор `+` или метод `.Concat()`. Пример:
$firstString = "Привет, "
$secondString = "мир!"
$combinedString = $firstString + $secondString
1. **Форматирование строк:** Используйте оператор `-f` или метод `.Format()` для вставки значений в строку. Пример:
$name = "Alice"
$age = 30
$formattedString = "Привет, меня зовут {0} и мне {1} лет." -f $name, $age
1. **Интерполяция строк:** С помощью символа `$` и фигурных скобок `{}` можно вставлять значения переменных в строки. Пример:
$city = "Москва"
$interpolatedString = "Я живу в городе $($city)."
1. **Разделение строк:** Метод `.Split()` используется для разделения строки на подстроки. Пример:
$text = "яблоко,груша,банан"
$fruits = $text.Split(",")
1. **Замена подстрок:** С помощью метода `.Replace()` можно заменить подстроку в строке. Пример:
$text = "Привет, мир!"
$modifiedText = $text.Replace("мир", "вселенная")
1. **Обрезка строк:** Методы `.Trim()`, `.TrimStart()` и `.TrimEnd()` удаляют пробелы и другие символы в начале и конце строки.
Примеры использования методов для обрезки строк в PowerShell:
# Обрезка пробелов в начале и конце строки
$rawString = " Пример строки с пробелами "
$trimmedString = $rawString.Trim()
Write-Host "Исходная строка: '$rawString'"
Write-Host "Обрезанная строка: '$trimmedString'"
# Обрезка только в начале строки
$leftTrimmedString = $rawString.TrimStart()
Write-Host "Строка после обрезки в начале: '$leftTrimmedString'"
# Обрезка только в конце строки
$rightTrimmedString = $rawString.TrimEnd()
Write-Host "Строка после обрезки в конце: '$rightTrimmedString'"
При выполнении этого кода в консоли PowerShell вы увидите следующий вывод:Исходная строка: ‘ Пример строки с пробелами ‘
Обрезанная строка: ‘Пример строки с пробелами’
Строка после обрезки в начале: ‘Пример строки с пробелами ‘
Строка после обрезки в конце: ‘ Пример строки с пробелами’
В данном примере видно, как методы `.Trim()`, `.TrimStart()` и `.TrimEnd()` удаляют пробелы в начале и конце строки, соответственно.
## Переменные
Для сохранения данных и обращения к ним в будущем в PowerShell используются переменные. **Перед названием переменной ставится символ доллара `$`, и переменные могут содержать латинские буквы (как заглавные, так и строчные), цифры и символ нижнего подчеркивания.**
Переменные в могут хранить данные различных типов, и значения в них можно изменять (перезаписывать).

Создадим переменную со строкой `2023` и преобразуем её в число. Для того чтобы узнать тип данных, воспользуемся методом `.GetType()`:
$stringValue = "2023"
$intValue = [int]$stringValue
$intValue.GetType()

Для **удаления переменной** используется метод `.Clear()`.
Переменные можно **вставлять в строки**, если строки оформлены двойными кавычками. В случае одинарных кавычек, PowerShell воспринимает символы в строке буквально. Давайте сравним два примера:
$number = 42
Write-Host "The number is $number" # Вывод: The number is 42
Write-Host 'The number is $number' # Вывод: The number is $number
В первом случае, используя двойные кавычки, значение переменной `$number` подставляется в строку. Во втором случае, с использованием одинарных кавычек, строка остается буквальной, и `$number` не интерпретируется как переменная.
Кроме пользовательских переменных, существуют и **системные переменные**. Например, `$PSVersionTable` содержит информацию о версии PowerShell.

## Как запустить скрипт в PowerShell?
Существует несколько способов запуска скрипта, вот основные из них:
1. Запустить оболочку PowerShell и выполнить в ней скрипт, указав путь к файлу и его имя (например, C:\\Scripts\\test.ps1) или перейдя в каталог скрипта командой cd C:\\Scripts и выполнить его с помощью команды .\\test.ps1.
2. Оболочку можно найти и запустить разными способами. Один из них — через меню «Пуск». Для Windows 7 пройдите по следующему пути: «Все программы» — «Стандартные» — «Windows PowerShell» и запустите оболочку «Windows PowerShell». Для Windows 10 найдите группу по букве «W» и в ней выберите «Windows PowerShell».
3. Запустить «Интегрированную среду сценариев Windows PowerShell ISE», которая представляет собой среду разработки, позволяющую редактировать и отлаживать скрипты PowerShell. Откройте программу, выберите «Открыть» или в меню Файл выберите «Открыть» и укажите нужный скрипт, затем нажмите F5 или кнопку «Выполнить скрипт». Поиск Windows PowerShell ISE можно осуществить так же, как и оболочки PowerShell, через меню «Пуск».
4. Запустить стандартный командный интерфейс и ввести следующую команду:
_PowerShell -file <имя_ _\_скрипта_ _\> (например_ _: PowerShell -file myscript.ps1)_
Если вы ранее не запускали скрипты PowerShell, возможно, вы получите сообщение о том, что файл <имя\_скрипта> не может быть загружен, так как выполнение скриптов запрещено для данной системы. В этом случае введите «get-help about\_signing» для получения дополнительной информации. Это связано с безопасностью и предотвращением случайного выполнения вредоносного кода, поэтому все скрипты должны быть подписаны цифровой подписью.
## Итоги
Windows PowerShell представляет собой программу и язык программирования, который применяется для управления операционными системами и автоматизации операций. Этот инструмент поддерживает концепции объектно-ориентированного программирования и обеспечивает возможность взаимодействия в интерактивном режиме, а также создания, сохранения и выполнения разнообразных скриптов.
* PowerShell изначально **интегрирован в операционную систему Windows версий 7, 8, 10, 11 и Server**, но также доступен для скачивания на платформах macOS и Linux. В дополнение к этому, для более старых версий языка (5.1 и ранее) имеется инструмент под названием PowerShell ISE — интегрированная среда сценариев.
* Центральной концепцией PowerShell является работа с **объектами**, а не с простыми строками. Взаимодействие с объектами осуществляется через **командлеты**, построенные в соответствии с принципом «Глагол-Существительное».
* Сила PowerShell заключается в возможности передачи результатов выполнения одного командлета в качестве входных данных для другого, используя **конвейер**. Этот подход способствует более эффективной и гибкой обработке данных.
* Помимо этого, PowerShell предоставляет функциональность для выполнения задач в **фоновом режиме**, что позволяет параллельно выполнять несколько операций.
* PowerShell является высокоуровневым языком программирования, который обеспечивает возможность работы с переменными, логическими операторами, условиями, циклами, массивами, хеш-таблицами, функциями и классами.
_Видео-туториал по Windows Powershell_


