PowerShell на мой взгляд это идеальный инструмент для автоматизации абсолютно любых задач.
Его можно изучать бесконечно и находить в нем все новые и новые возможности.
Почти все продукты MS начиная с 2007 года поддерживают управление настройку и администрирование через PowerShell, что дает практически нереальные возможности в их администрировании и управлении.
Это пост создан с целью иметь под рукой самые полезные скрипты и команды.
Для тех кто совсем не знаком с этим чудесным инструментом рекомендую видео .
С чего же начинается PowerShell ?
Чтобы начать пользоваться скриптами локально необходимо установить политику выполнения сценариев в RemoteSigned
Для этого достаточно выполнить команду Set-ExecutionPolicy RemoteSigned
После этого можно спокойно пользоваться скриптами созданными локально
Пару слов о том как устроен PowerShell
1.Каждая команда состоит из 2х частей
ГЛАГОЛ (Get , Set, Add, Remove, Invoke , Start , Stop и тд полный список Get-Verb)+ СУЩЕСТВИТЕЛЬНОЕ (Command , Service, Process , PSDrive , ExecutionPolicy ) = Get-Command
Более полную информацию о любом командлете (встроенная команда PowerShell ) можно получить
Get-Help -name Get-Command
Или
Get-Alias -?
Полный список команд можно получить командой
Get-Command -type cmdlet
2.Псевдонимы команд (алиасы)
Дают возможность пользоваться сокращенными привычными названиями команд ls, dir, kill , del , copy, cls
Полный список алиасов
Get-Alias
2.Переменные
Переменные начинаются со знака $ , переменные создаются в момент присваивания им значения, тип определяется автоматически
Полезное видео.
$text = "Sample Text"
$text.GetType()
Типизированные переменные , можно указать конкретный тип для тех кто привык к языкам программирования чтобы избежать ошибок в коде.
[int]$i=10
Переменные оболочки PowerShell
$$ Содержит последнее слово (или знак) последней полученной оболочкой строки
$? Показывает, успешно ли завершилась последняя операция
$^ Первое слово (или знак) последней полученной оболочной строки
$_ При использовании в блоках сценариев, фильтрах и инструкции Where содержит текущий объект конвейера
$PSHome Показывает имя каталога, в который установлен Windows PowerShell
$Host Содержит сведения о текущем узле
$Args Содержит массив параметров, передаваемых в функцию
$Error Содержит объекты, для которых возникла ошибка при обработке в командлете
$ForEach Обращается к итератору в цикле ForEach
$Home Указывает домашний каталог пользователя
Системные переменные среды Windows
Dir env:
$env:OS #получить значение конкретной переменной
Результат любого командлета можно сохранить в переменной
$d =Get-PSDrive
$d[3]
3.Конвейер |
Полезная штука, позволяет передавать результаты одной команды на вход другой, формируя цепочку команд, достаточно соединить команды символом |
Get-Service | where {$_.Name -like "*sql*"}
4.Горячие клавиши, комментарии
TAB – самая часто используемая, авто дополнение команд
Начните писать команду и нажмите TAB PowerShell сам предложит вам возможные варианты команд
F7 - список введенных команд
Up Сканирование назад по истории команд.
Down Сканирование вперед по истории команд.
Pg Up Доступ первая команда в истории команд.
Pg Dn Доступ последнюю команду в истории команд.
Тут полный список клавиш
Комментарии помечаются символом #
#закомментировать строку
<#
Блочный комментарий
Описание
Автор
Дата
#>
Сменить цвет текста в консоли
write-host "Sample text" -foreground "magenta"
Форматирование чисел, дат и тд -f
"{0:N4}" -f (3.14159265359)
$t =(get-date)
"{0:dd.MM.yy}" -f $t
5.Оснастки (PSSnapin)
Если вкратце это сборки .NET в виде DLL библиотек, могут использоваться для управления чем угодно от настроек компьютера до прикладных программ Sharepoint, Exchange, Sql Server и тд. Подробное видео тут
Получить список встроенных оснасток
Get-PSSnapin
Получить список всех команд в оснастке
Get-Command –module Microsoft.PowerShell.Diagnostics
Как добавить оснастку в консоль (можно добавить только там где установлен сам Sharepoint)
Add-PSSnapin Microsoft.SharePoint.PowerShell
6.Модули
Модуль это набор команд Powershell , появились начиная с версии 2.0 представляют собой замену оснасток, более просты в управлении, нет необходимости в регистрации библиотек, можно легко переносить между разными компьютерами. Подробное видео тут
Видео о модулях
Получить список доступных модулей
Get-Module –ListAvailable
Получить список всех команд в модуле
Get-Command -Module sqlps
Как добавить модуль в консоль
Import-Module sqlps
Import-Module ActiveDirectory
Import-Module PSFTP
7.Базовые конструкции, символы %, $_ и New-Object
Условия
If (($someAttribute -eq $false) -or ($someAttribute -eq $Null))
{
}
Else
{
}
-eq Равно (=)
-ne не равно (<>)
-gt Больше (>)
-ge Больше или равно (>=)
-lt Меньше (<)
-le Меньше или равно (<=)
-like Сравнение с учётом символа подстановки
-notlike Сравнение с учётом не соответствия символа подстановки
-contains Содержит ли значение слева значение справа
-notcontains Если значение слева не содержит значение справа, получим истину
-match Использование регулярных выражений для поиска соответствия образцу
-notmatch Использование регулярных выражений для поиска несоответствия образцу
-replace Заменяет часть или все значение слева от оператора
-and Логическое и
-or Логическое или
-not Логическое не
Циклы
foreach ($item in Get-PSDrive)
{
$item.Name
}
for ($i = 0; $i -lt 10; $i++)
{
Write-Host $i
}
Сокращенный аналог ForEach, символ %
$_ текущий элемент конвейера
dir c:\temp2 | % {$str = "temp_" + $_.Name; $str }
Создать новый объект COM или .NET
$ie = New-Object -COMObject InternetExplorer.Application
$ie.Navigate2("www.microsoft.com")
$ie.Visible = $True
$ie.Navigate2("www.microsoft.com")
$ie.Visible = $True
Выбор, фильтрация и сортировка
Get-WmiObject win32_service | select Name, Status, State, PathName| Where-Object -FilterScript {$_.Name -like 'a*'}| Sort-Object -Property State
Группировка результатов
dir c:\temp | sort-object -property extension | group-object -property extension
Посмотреть все свойства объекта
Get-Service -name wuauserv | Select-Object -Property *
Вычисляемые поля @{}
Get-Service -name wuauserv | Select-Object -Property Name, Status , @{name='Desc';expression={$_.displayname}}
7.Полезные команды
Полный список команд с примерами смотреть тут
Как разобраться с новой командой смотрим помощь
Get-PSProvider -?
Затем смотрим примеры
get-help Get-PSProvider -examples
Все дочерние элементы dir или Get-Children
$a = dir c:\temp
$a| Where {$_.PSIsContainer -eq $false}| select Name, @{name='Size_MB';e={$_.length/1MB}}
Экспорт в csv
Get-PSDrive | export-csv c:\temp\drives.csv -encoding utf8
Экспорт данных из SQL
$SqlConnection = new-object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=server;Database=database;Integrated Security=True"
$SqlCommand = $SqlConnection.CreateCommand()
$SqlCommand.CommandText = "Select * from tmp_test"
$DataAdapter = new-object System.Data.SqlClient.SqlDataAdapter $SqlCommand
$dataset = new-object System.Data.Dataset
$tblData = $dataset.Tables[0]
$tblData | export-csv c:\temp\table.csv -encoding utf8
Использование объектов .net
$reader = [System.IO.File]::OpenText("c:\test\Import.txt")
Скачать файл
$arg1 = "https://cs1-41v4.vk-cdn.net/p7/407880aed25a77.mp3?extra=ZGdmt6lQkZ_APrCSiVS…dXexkP8RojEaEtgIWVJmsnnG0qOfJQnoe3khUMSg2D_ejsYUXwsp4h0x21yhzno5vAf3BYMfOY"
$arg2 = "C:\temp\SampleAudio.mp3"
$p = New-Object System.Net.WebClient
$p.DownloadFile($arg1,$arg2)
Работа с реестром
Set-Location -Path hklm:\SOFTWARE\Microsoft\Windows\CurrentVersion
Get-ItemProperty -Path . | out-file c:\temp\odbc.txt -width 200
Отправка писем
$objMailClient = new-object Net.Mail.SmtpClient -arg "mailserver.example.com"
$objMessage = new-object Net.Mail.MailMessage("me@example.com","you@example.com", "Subject", "Here is some email")
$objAttach = new-object Net.Mail.Attachment("c:\\demo.txt")
$objMessage.Attachments.Add($objAttach)
$objMailClient.Send($objMessage)
Парсинг XML файлов и подготовка запросов SQL
$folderPath= "C:\Shared\BR_Playlist\1\"
$HouseIds= @()
foreach ($item in dir $folderPath)
{
$xmlFilePath = $folderPath + $item.Name
[xml] $xmlContent = [xml] (Get-Content -Path $xmlFilePath)
#Write-Host $item.Name
foreach( $event in $xmlContent.playlist.program.event )
{
#Write-Host $event.housenumber
$HouseIds+=$event.housenumber
}
}
#{$_}
$HouseIds | sort-object | Get-Unique | Select-Object @{Name="Comnd";Expression={"Select '"+$_+"' as evnt UNION ALL" }}
Импорт собственной DLL
Очень много скриптов powershell тут
Парсинг XML файлов и подготовка запросов SQL
$folderPath= "C:\Shared\BR_Playlist\1\"
$HouseIds= @()
foreach ($item in dir $folderPath)
{
$xmlFilePath = $folderPath + $item.Name
[xml] $xmlContent = [xml] (Get-Content -Path $xmlFilePath)
#Write-Host $item.Name
foreach( $event in $xmlContent.playlist.program.event )
{
#Write-Host $event.housenumber
$HouseIds+=$event.housenumber
}
}
#{$_}
$HouseIds | sort-object | Get-Unique | Select-Object @{Name="Comnd";Expression={"Select '"+$_+"' as evnt UNION ALL" }}
Импорт собственной DLL
$assembly = [Reflection.Assembly]::LoadFile("c:\path\file.dll")
$instance = New-Object Class.Of.Assembly
$instance.Property1 = $variable1
$result = $instance.function()
Очень много скриптов powershell тут