Основы PowerShell

Set-ExecutionPolicy Unrestricted -Force

Подробнее про политики выполнения скриптов в PowerShell вы можете прочитать здесь

Рассмотрим конкретный пример:

Вы пробуете выполнить ваш скрипт

./your_script.ps1

И получаете

.\your_script.ps1 : File C:\Users\Andrei\your_script.ps1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170. At line:1 char:1 + .\your_script.ps1 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : SecurityError: (:) [], PSSecurityException + FullyQualifiedErrorId : UnauthorizedAccess

Нужно зайти в PowerShell в режиме администратора и выполнить

Set-ExecutionPolicy Unrestricted -Force

И выполните ещё раз

./your_script.ps1

Если Вы не можете запустить PowerShell в режиме администратора. Например, если Вы пользуетесь терминалом в Visual Studio Code

Выполните

Set-ExecutionPolicy -Scope CurrentUser Unrestricted -Force

Переключить PowerShell в режим Администратора прямо из обычной консоли PowerShell можно командой

start-process powershell -verb runas

Проверка версии

$PSVersionTable

Name Value ---- ----- PSVersion 5.1.19041.2364 PSEdition Desktop PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...} BuildVersion 10.0.19041.2364 CLRVersion 4.0.30319.42000 WSManStackVersion 3.0 PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1

Установка PowerShell

Может пригодиться для обновления до более свежей версии.

С помощью winget. Сперва рекомендуется проверить доступные версии

winget search Microsoft.PowerShell

The `msstore` source requires that you view the following agreements before using. Terms of Transaction: https://aka.ms/microsoft-store-terms-of-transaction The source requires the current machine's 2-letter geographic region to be sent to the backend service to function properly (ex. "US"). Do you agree to all the source agreements terms? [Y] Yes [N] No: Y Name Id Version Source ------------------------------------------------------- PowerShell Microsoft.PowerShell 7.3.3.0 winget PowerShell Microsoft.PowerShell.Preview 7.4.1.0 winget

Непосредственно установка

winget install --id Microsoft.Powershell --source winget

Found PowerShell [Microsoft.PowerShell] Version 7.3.3.0 This application is licensed to you by its owner. Microsoft is not responsible for, nor does it grant any licenses to, third-party packages. Downloading https://github.com/PowerShell/PowerShell/releases/download/v7.3.3/PowerShell-7.3.3-win-x64.msi ██████████████████████████████ 101 MB / 101 MB Successfully verified installer hash Starting package install... Successfully installed

PowerShell 7 установится не на замену обычному Windows PowerShell, а как дополнительный софт.

Чтобы зайти в него нужно ввести в поиск PowerShell 7

Проверка версии, обычно не нужна, так как версия показана перед первым приглашением командной строки. Тем не менее можно выполнить стандартную команду

$PSVersionTable

Name Value ---- ----- PSVersion 7.3.3 PSEdition Core GitCommitId 7.3.3 OS Microsoft Windows 10.0.19045 Platform Win32NT PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…} PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1 WSManStackVersion 3.0

Узнать имя компьютера

$env:computername

DESKTOP-OP12345

Перезагрузить компьютер

Допустим, что имя компьютера, который вы хотите перезагрузить DESKTOP-OP12345

Restart-Computer -ComputerName DESKTOP-OP12345

Поиск по истории команд

Найти нужную команду в истории можно с помощью Select-String .

Например, мне нужно найти команду подключения к моему хостингу Beget по SSH

Select-String 'beget' (Get-PSReadlineOption).HistorySavePath

AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt:2764:ssh user@user.beget.tech AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt:3164:Select-String 'beget' (Get-PSReadlineOption).HistorySavePath

Get-WinUserLanguageList

Get-WinUserLanguageList: Cannot marshal 'parameter #2': Invalid managed/unmanaged type combination.

Import-Module -Name International -UseWindowsPowerShell -Verbose

Get-WinUserLanguageList

LanguageTag : en-US Autonym : English (United States) EnglishName : English LocalizedName : English (United States) ScriptName : Latin InputMethodTips : {0409:00000409} Spellchecking : True Handwriting : False LanguageTag : ru Autonym : русский EnglishName : Russian LocalizedName : Russian ScriptName : Cyrillic InputMethodTips : {0419:00000419} Spellchecking : True Handwriting : False

$LanguageList = Get-WinUserLanguageList $LanguageList.Add("qaa-latn") Set-WinUserLanguageList $LanguageList -Force

Удалить вручную из Language (Win + I) либо

$LanguageList = Get-WinUserLanguageList $Language = $LanguageList | where LanguageTag -eq "qaa-Latn" $LanguageList.Remove($Language) Set-WinUserLanguageList $LanguageList -Force

Сохранить вывод в файл

Пример сохранения вывода команды dir в файл dir.txt

dir | Out-File -FilePath "dir.txt"

Чтобы перенаправить и стандартный вывод и ошибки нужно добавить *>&1

Get-Process *>&1 | Out-File "C:\path\to\output.txt"

Если при этом нужно сохранить вывод на экран следует использовать команду tee или Tee-Object. Это аналог команды tee в Unix и Linux

Get-Process | Tee-Object -FilePath "C:\path\to\output.txt"

Get-Process *>&1 | tee -FilePath "get_process.txt"

Если вы уже запустили запись в файл с помощью Out-File а не с Tee-Object и только потом поняли, что нужно мониторить выдачу в реальном времени - можно применить к файлу команду Get-Content -Wait -Tail

Переименовать хост

Rename-Computer -NewName "NewHostName" -Force -Restart

PowerShell 2

В PowerShell 2 нет команды Rename-Computer, поэтому нужно использовать Get-WmiObject и Rename.

$computer = Get-WmiObject Win32_ComputerSystem $computer.Rename("A01") # Restart in 2 seconds shutdown.exe /r /t 2

pwd

$pwd возвращает объект PathInfo. Если из него нужно достать строку с путём, то нужно обратиться к атрибуту Path.

PowerShell способен на лету доставать атрибут Path там где нужно, но для надёжности есть смысл обращаться к нему явно.

# pwd_demo.ps1 $a = $pwd $a.GetType() Write-Host $a -ForegroundColor Green $b = $pwd.Path $b.GetType() Write-Host $b -ForegroundColor Magenta

.\pwd_demo.ps1

IsPublic IsSerial Name BaseType -------- -------- ---- -------- True False PathInfo System.Object C:\AutoTest True True String System.Object C:\AutoTest

Предотвратить автозакрытие

Чтобы консоль не закрывалась после выполнения скрипта можно добавить в конец что-то вроде

Read-Host "Press Enter to exit"

Это бывает нужно, например, для изучения вывода скрипта в случае ошибок.

Автор статьи: Андрей Олегович