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 тут





















