Содержание
Powershell
Docker
docker run -it --rm -e POWERSHELL_TELEMETRY_OPTOUT=1 mcr.microsoft.com/powershell
docker run -it --rm -e POWERSHELL_TELEMETRY_OPTOUT=1 mcr.microsoft.com/azure-powershell
Политики запуска
- Restricted (Ограниченный) - Значение по умолчанию. Блокируется выполнение любых скриптов и разрешается работа интерактивных команд.
- AllSigned (Все подписанные) - Разрешено выполнение скриптов, имеющих цифровую подпись.
- RemoteSigned (Удаленные подписанные) - Локальные скрипты работают без подписи. Все скачанные скрипты должны иметь цифровую подпись.
- Unrestricted (Неограниченный) - Разрешено выполнение любых скриптов. При запуске не подписанного скрипта, который был загружен из Интернета, программа может потребовать подтверждение.
- Bypass (Обходной) - Ничего не блокируется, никакие предупреждения и запросы не появляются.
Показать текущую политику:
Get-ExecutionPolicy
Установить политику RemoteSigned:
Set-ExecutionPolicy RemoteSigned
Переменные
- $? - Успешный ли выход последней команды
- $LASTEXITCODE - Последний код выхода
Использование системной переменной окружения:
$env:windir
https://windowsnotes.ru/powershell-2/ispolzovanie-peremennyx-v-powershell/
Установить системную переменную окружения:
[Environment]::SetEnvironmentVariable("VarName","VarValue","Machine")
Удалить системную переменную окружения:
Remove-ItemProperty –Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" -Name "VarName"
Назначить переменную:
Set-Variable -Name VARIABLE -Value var #или $VARIABLE="var" $env:VAR="var"
Удалить переменную оболочки:
Remove-Variable VARIABLE $env:VAR=""
Кавычки и экранирование
Операторы сравнения
| Оператор | Значение |
|---|---|
| -eq | равно |
| -ne | не равно |
| -lt | меньше |
| -le | меньше или равно |
| -gt | больше |
| -ge | больше или равно |
| -like | сравнение строки |
| -clike | регистронезависимое сравнение строки |
| -notlike | сравнение на несовпадение строки |
| -contains | содержит |
| -notcontains | не содержит |
| -match | сравнение с регулярным выражением |
| -cmatch | регистронезависимое сравнение с регулярным выражением |
Для регистрозависимого сравнения до бавляем c, например -сeq, -сlike
Операторы сравнения могут быть соединены с помощью логических операторов:
| Оператор | Значение |
|---|---|
| -and | И |
| -or | ИЛИ |
| -not | НЕ |
| ! | НЕ |
Работа с файлами
Move-Item - Перемещение файлов
Copy-Item - Копирование файлов
Показать список расширений файлов в директории рекурсивно:
Get-ChildItem 'F:\DatasetScans' -File -Recurse | Select Extension | Sort-Object -Unique
Управление реестром
Список доступных дисков:
get-psdrive
Перейти к ветке реестра и показать содержимое:
Set-Location -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching Get-ChildItem
или одной командой:
Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching
Пересоздать раздел:
New-Item –Path HKCU: –Name Test1\Test2 -Force
Перезаписать значение ветки:
Set-ItemProperty -Path "HKCU:\Test1\Test2" -Name "NameTest" -Value 0 -PropertyType "dword" -Force
Удалить значение ветки:
Remove-ItemProperty –Path HKCU:\Test1\Test2 –Name NameTest
Удалить все ветки в разделе:
Remove-Item –Path HKCU:\Test1\* –Recurse
Удалить ветку в разделе:
Remove-Item –Path HKCU:\Test1 –Recurse
http://winitpro.ru/index.php/2017/02/07/rabotaem-s-reestrom-windows-cherez-powershell/
Тест подключения
Проверить подключение на 443 порту хоста ya.ru
Test-NetConnection -ComputerName ya.ru -Port 443
Ошибки
+ CategoryInfo : SecurityError: (:) [], PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
Выполняем скрипт с повышенными привилегиями:
powershell.exe -executionpolicy remotesigned .\example.ps1
+ CategoryInfo : NotSpecified: (:) [Get-WindowsFeature], KeyNotFoundException
+ FullyQualifiedErrorId : System.Collections.Generic.KeyNotFoundException,Microsoft.Windows.ServerManager.Commands
или
The given key was not present in the dictionary
Проблема с кэшем. Удаляем ключ реестра с повышенными привилегиями:
reg delete HKLM\SOFTWARE\Microsoft\ServerManager\ServicingStorage\ServerComponentCache
https://www.saqwel.ru/articles/windows/the-given-key-was-not-present-in-the-dictionary/
PackageManagement\Install-Package : No match was found for the specified search criteria and module name
Не зарегистрирован репозиторий. Зарегистрировать:
$parameters = @{ Name = "PSGallery" SourceLocation = "https://www.powershellgallery.com/api/v2" PublishLocation = "https://www.powershellgallery.com/api/v2/package/" ScriptSourceLocation = "https://www.powershellgallery.com/api/v2/items/psscript" ScriptPublishLocation = "https://www.powershellgallery.com/api/v2/package/" InstallationPolicy = 'Untrusted' } Register-PSRepository @parameters
Exception calling «SqlRestore» with «1» argument(s): «Restore failed for Server 'SERVER'.»
Проблема с таймаутом, по умолчанию 600 сек. Увеличить таймаут до 30мин:
$serverInstance = New-Object ('Microsoft.SqlServer.Management.Smo.Server') "$INSTANCE" $serverInstance.ConnectionContext.StatementTimeout = 1800
Примеры
Посмотреть все свойства объекта: … | Select-Object -ExpandProperty properties | Select Name,Value | Sort -Property Name
| Powershell | Bash | Описание |
|---|---|---|
| >$null | >/dev/null | Перенаправление вывода |
| (Get-Location).Path (Get-Item . -Force).FullName | pwd | Текущая директория |
| Get-ChildItem -Path ${DIRECTORY} -Force | %{ $_.FullName } | find ${DIRECTORY} -maxdepth 1 | Список файлов в директории |
Однострочник
| powershell | winbatch |
|---|---|
echo "Hello!" ; if ($?) { echo "World!" } | echo "Hello!" && echo "World!" |
echo "Hello!" ; if (-not $?) { echo "Bye!" } | echo "Hello!" || echo "Bye!" |
Отображение команд
| powershell | bash |
|---|---|
Set-PSDebug -Trace 1; ls; Set-PSDebug -Trace 0 | set -x; ls; set +x |
Сравнение
| powershell | bash |
|---|---|
Compare-Object -ReferenceObject (Get-Content -Path 1.txt) -DifferenceObject (Get-Content -Path2.txt) | diff 1.txt 2.txt |
Назначение переменных
Пример назначения переменных с использованием других переменных:
for ($i=1; $i -le 5; $i++) { New-Variable -Name "var$i" -Value $i Get-Variable -Name "var$i" -ValueOnly }
Создание файла
"Строка1`r`nСтрока2`r`nСтрока3" > file.txt
@" Строка1 Строка2 Строка3 "@ > file.txt
$multistring = @" First string Second String "@ $multistring | out-file file.txt
В кодировке utf8:
"First string " | out-file file.txt -encoding utf8 "Second string" | out-file file.txt -append -encoding utf8
Вывести на экран файл
Get-Content file.txt
Вывести без комментариев
Добавить:
| Select-String "^\s*#|^\s*$" -NotMatch | % { $_.Line }
Param
https://fixmypc.ru/post/kak-ispolzovat-param-v-powershell-pri-sozdanii-funktsii/
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_functions_advanced_parameters
AD
Получить список групп пользователя:
- Get-ADPrincipalGroupMembership - список основных групп
- Get-ADAccountAuthorizationGroup - список всех групп
https://sergeyvasin.net/2017/09/18/primary-group/
Получить список пользователей группы (пример группы ofdrole с выводом только логина, без заголовков):
Get-ADGroupMember 'ofdrole' | select samaccountname | ft -hide
Скопировать пользователей из одной группы в другую:
Add-ADGroupMember -Identity '${NEWGROUP}' -Members (Get-ADGroupMember -Identity '${OLDGROUP}')
ФС
Вывести размер директорий:
gci -force 'C:\Users'-ErrorAction SilentlyContinue | ? { $_ -is [io.directoryinfo] } | % { $len = 0 gci -recurse -force $_.fullname -ErrorAction SilentlyContinue | % { $len += $_.length } $_.fullname, '{0:N2} GB' -f ($len / 1Gb) }
Proccess
Вывести список процессов «OCR.Worker.JustICR», с используемой ими памятью (более 500MB) и pid:
Get-Process | Where-Object {$_.ProcessName -match "OCR.Worker.JustICR" -and $_.WS -gt 524288000 } | Select-Object ProcessName,WS,Id
Остановить процессы «OCR.Worker.JustICR» занимающее более 500MB памяти:
Get-Process | Where-Object {$_.ProcessName -match "OCR.Worker.JustICR" -and $_.WS -gt 524288000 } | Stop-Process -Force
Показать UserName и использование памяти процессов w3wp:
Get-Process -IncludeUserName -Name w3wp | Select-Object UserName,WS
Certificates
Показать список сертификатов:
dir Cert:\LocalMachine\my
Zip
Форматирование текста
Показать пример с управляющими символами:
$psstyle
Пример жирного, подчёркнутого, мигающего красного текста:
Write-Host "`e[1;4;5;91mhello world`e[0m" #или Write-Host "$($psstyle.Bold)$($psstyle.Underline)$($psstyle.Blink)$($psstyle.Foreground.Red)hello world$($psstyle.Reset)"
Модули
Install-Module -Name <Name> #Установить модуль Uninstall-Module -Name <Name> #Удалить модуль Get-Module -ListAvailable -Name <Name> #Показать установленный модуль Get-Command -Module <Name> #Показать доступные команды установленного модуля
SqlServer
Параметр -AutoRelocateFile для Restore-SqlDatabase доступен с версии 21.1.18102
https://www.powershellgallery.com/packages/SqlServer
https://stackoverflow.com/questions/26377356/problems-with-relocatefile-property-in-the-restore-sqldatabase-cmdlet
ScheduledTasks / Планировщик
===== Информация о системе =====
<hidden><code powershell>
[System.Net.Dns]::GetHostByName($env:computerName).HostName #Сетевое имя системы
(Get-ComputerInfo).WindowsProductName #ОС
</code></hidden>
====== Проблемы ======
Не вводятся/печатаются буквы
Решение:
- <code powershell>Remove-Module PSReadLine</code>
- Закрыть powershell
- Удалить C:\Program Files\WindowsPowerShell\Modules\PSReadLine
- <code powershell>Install-Module PSReadLine</code>
https://danshin.ms/PSReadLine-problem/
