Биты и байты.

Биты и байты.

четверг, 31 марта 2016 г.

Могучий Шелл. Шпаргалка по PowerShell. Часть 1.

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, dirkill , 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

Выбор, фильтрация и сортировка
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


$assembly = [Reflection.Assembly]::LoadFile("c:\path\file.dll")
$instance = New-Object Class.Of.Assembly
$instance.Property1 = $variable1
$result = $instance.function()

Очень много скриптов powershell тут

About