PowerShell находится в разработке более десяти лет. Microsoft продолжает инвестировать в ее разработку и внедрение. Эти инвестиции изменили простоту и надежность, с которой разработчики и администраторы могут автоматизировать задачи Windows.
Что такое PowerShell?
PowerShell решает проблемы администрирования и адаптивности за счет полной интеграции .NET Framework.
PowerShell — это среда автоматизации задач Microsoft, состоящая из оболочки командной строки, интегрированной среды сценариев (ISE), языка сценариев, построенного на .NET Framework, API, позволяющего размещать PowerShell в ваших приложениях .NET, и она является распределенной. платформа автоматизации. PowerShell обеспечивает полный доступ к COM и WMI, позволяя выполнять задачи как в локальной, так и в удаленной системах Windows.
PowerShell — это платформа нового поколения для автоматизации, которая решает проблемы администрирования и адаптивности за счет полной интеграции .NET Framework. Это хорошо для разработчиков, администраторов, тестировщиков и многого другого. Основанный на .NET, инструмент снижает затраты, предоставляя разработчикам и администраторам простой и готовый к работе способ автоматизации, измерения и улучшения всех своих процессов.
Следуйте по
В этом вступлении я расскажу о глубине и широте, которую PowerShell предлагает. Такие вещи, как конвейер изменения игровых объектов, REPL (чтение, eval, цикл печати), интеграция .NET и многое другое.
Если вы используете Windows 7 или 8, PowerShell уже установлен. Загрузите PowerShell v3 для Windows 7 здесь. Вам необходим Windows 7 SP1, и загрузка также работает для Windows 2008 R2 SP1 и Windows 2008 SP2. Если вы используете Vista, XP или Windows 2003, вам нужно выбрать PowerShell v2 здесь .
Для чего это? Абсолютно все!
От развертывания нескольких ресурсов в Azure до обработки сборок программного обеспечения для непрерывной интеграции, доступа к веб-службам или конечным точкам REST. PowerShell покрывает вас и предоставляет гораздо больше.
- Слайс и игральные кости, XML, CSV и JSON с легкостью
- Встраивайте PowerShell, чтобы предоставить возможности сценариев для ваших приложений C #
- Создание приложений с графическим интерфейсом в пять-десять раз быстрее с меньшим количеством кода
- Используйте возможности PowerShell для работы с Интернетом.
- Взаимодействуйте с DLL и создавайте объекты, автоматически отображайте свойства и вызывайте методы в интерактивных сеансах.
- Создание предметно-ориентированных языков (DSL) и словарей для более четкого выражения решений
- Работа с Microsoft Office через объектную модель компонентов (COM)
- Возможности PowerShell v3
Начальная загрузка PowerShell
Что такое командлет? Командлет является основным строительным блоком в PowerShell и выражается в виде пары глагол-существительное, помогая сделать их информативными. Например:
1
2
3
|
PS C:\> Get-Date
Sunday, May 26, 2013 8:46:16 AM
|
PowerShell включает в себя сотни основных командлетов, и вы можете написать свой собственный.
Запомните два командлета
PowerShell делает обнаружение простым. Всякий раз, когда вы подходите к синему экрану PowerShell и не знаете, что делать, используйте Get-Command
.
Командлет
Get-Command
получает все команды, установленные на компьютере, включая командлеты, псевдонимы, функции, рабочие процессы, фильтры, сценарии и приложения.
По сути, Get-Command
показывает вам все, что вы можете сделать в текущем сеансе PowerShell.
Get-Command
Get-Command
поддерживает подстановочные знаки. Допустим, я хочу увидеть все командлеты с глаголом Invoke
?
1
|
Get-Command Invoke*
|
Вот что я получаю после нажатия enter
.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
CommandType Name ModuleName
———— —- ———-
Function Invoke-AsWorkflow PSWorkflowUtility
Function Invoke-Background ShowUI
Function Invoke-BrowserControl AutoBrowse
Function Invoke-Line isepack
Function Invoke-Line PowerShellPack
Function Invoke-Office365 Pipeworks
Function Invoke-Pester Pester
Function Invoke-WebCommand Pipeworks
Cmdlet Invoke-CimMethod CimCmdlets
Cmdlet Invoke-Command Microsoft.PowerShell.Core
Cmdlet Invoke-Expression Microsoft.PowerShell.Utility
Cmdlet Invoke-History Microsoft.PowerShell.Core
Cmdlet Invoke-Item Microsoft.PowerShell.Management
Cmdlet Invoke-RestMethod Microsoft.PowerShell.Utility
Cmdlet Invoke-TroubleshootingPack TroubleshootingPack
Cmdlet Invoke-WebRequest Microsoft.PowerShell.Utility
Cmdlet Invoke-WmiMethod Microsoft.PowerShell.Management
Cmdlet Invoke-WSManAction Microsoft.WSMan.Management
|
Какие командлеты оканчиваются на существительное Item?
1
|
Get-Command *-Item
|
Обратите внимание, что вы начинаете видеть другие глаголы, такие как Очистить, Новый, Удалить и Установить.
01
02
03
04
05
06
07
08
09
10
11
|
CommandType Name ModuleName
———— —- ———-
Cmdlet Clear-Item Microsoft.PowerShell.Management
Cmdlet Copy-Item Microsoft.PowerShell.Management
Cmdlet Get-Item Microsoft.PowerShell.Management
Cmdlet Invoke-Item Microsoft.PowerShell.Management
Cmdlet Move-Item Microsoft.PowerShell.Management
Cmdlet New-Item Microsoft.PowerShell.Management
Cmdlet Remove-Item Microsoft.PowerShell.Management
Cmdlet Rename-Item Microsoft.PowerShell.Management
Cmdlet Set-Item Microsoft.PowerShell.Management
|
Далее я буду использовать несколько командлетов для суммирования того, что доступно в моем сеансе, на одном из моих блоков при запуске консоли PowerShell.
1
|
Get-Command |
|
Я вызываю Get-Command
, группирую и сортирую. Здесь я вижу, что у меня есть более 1000 командлетов для работы. Я использую PowerShell v3 с установленными дополнительными модулями, поэтому ваш пробег может отличаться.
1
2
3
4
5
6
|
Count Name
—— —-
2487 Function
1184 Cmdlet
38 Alias
1 Filter
|
Из каких модулей поступают эти командлеты? Мы можем ответить на этот вопрос следующим образом:
1
|
Get-Command -CommandType Cmdlet |
|
С PowerShell я могу многого добиться.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
Count Name
—— —-
379 ShowUI
164 Hyper-V
157 Azure
92 Microsoft.PowerShell.Utility
82 Microsoft.PowerShell.Management
78 WebAdministration
55 Microsoft.PowerShell.Core
22 Dism
18 International
17 PKI
16 PSScheduledJob
13 Microsoft.WSMan.Management
12 CimCmdlets
10 Microsoft.PowerShell.Security
9 TrustedPlatformModule
8 BitsTransfer
8 MsDtc
6 Pipeworks
6 Kds
5 AppLocker
5 SecureBoot
5 Microsoft.PowerShell.Diagnostics
4 NetSecurity
4 Appx
3 WindowsErrorReporting
2 Microsoft.PowerShell.Host
2 TroubleshootingPack
1 PSWorkflow
1 DnsClient
|
Получить помощь
Get-Help
делает именно это, она отображает справку по командлету, о котором вы должны знать больше. Не только легко получить помощь, но и легко создать / включить справку для командлетов / расширенных функций, которые вы разрабатываете, — это тема для другой статьи. Помощь под рукой — это огромная экономия времени.
1
|
Get-Help Invoke-Command
|
Вот сокращенная версия вывода.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
NAME
Get-Process
SYNOPSIS
Gets the processes that are running on the local computer or a remote computer.
SYNTAX
Get-Process [[-Name] <String[]>] [-ComputerName <String[]>] [-FileVersionInfo [<SwitchParameter>]] [-Module
[<SwitchParameter>]] [<CommonParameters>]
Get-Process [-ComputerName <String[]>] [-FileVersionInfo [<SwitchParameter>]] [-Module [<SwitchParameter>]] -Id
<Int32[]> [<CommonParameters>]
Get-Process [-ComputerName <String[]>] [-FileVersionInfo [<SwitchParameter>]] [-Module [<SwitchParameter>]]
-InputObject <Process[]> [<CommonParameters>]
DESCRIPTION
The Get-Process cmdlet gets the processes on a local or remote computer.
.
.
.
.
|
Еще проще; для этого в командлете Get-Help есть переключатель.
1
|
Get-Help Get-Process -Online
|
Хотите просто посмотреть примеры использования командлета? Используйте переключатель -Examples
. Кроме того, вы можете скопировать и вставить пример прямо в консоль и запустить его.
1
|
Get-Help Get-Process -Examples
|
Это так просто и быстро.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
NAME
Get-Process
SYNOPSIS
Gets the processes that are running on the local computer or a remote computer.
————————— EXAMPLE 1 —————————
PS C:\> Get-Process
This command gets a list of all of the running processes running on the local computer.
————————— EXAMPLE 2 —————————
PS C:\> Get-Process winword, explorer |
|
PowerShell легко работает с веб-сервисами
W3C определяет «веб-сервис» как:
[…] программная система, разработанная для поддержки взаимодействия компьютеров между машинами по сети. У этого есть интерфейс, описанный в машинно-обрабатываемом формате (особенно WSDL ). Другие системы взаимодействуют с веб-службой способом, предписанным ее описанием, с использованием сообщений SOAP, обычно передаваемых с использованием HTTP с сериализацией XML в сочетании с другими стандартами, связанными с веб.
PowerShell ускоряет работу веб-сервисов с помощью командлета New-WebServiceProxy
. Измените $zipcode
, запустите его и получите последнюю информацию о погоде.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
$zipCode = «96826»
$svc = New-WebServiceProxy http://wsf.cdyne.com/WeatherWS/Weather.asmx
$result = $svc.GetCityForecastByZIP($zipCode)
# Transform the results
$result.ForecastResult |
ForEach {
[PSCustomObject]@{
City = $result.City
State = $result.State
Date = $_.Date.ToString(«d»)
Description = $_.Desciption
DaytimeHigh = $_.Temperatures.DaytimeHigh
}
}
|
Результат
Я сохраняю прокси-объект в $svc
а затем GetCityForecastByZIP
метод GetCityForecastByZIP
, GetCityForecastByZIP
результаты в $result
. Перебирая массив ForecastResult, я преобразую запись в данные. Обратите внимание, что City и DaytimeHigh находятся на разных уровнях в иерархии.
Я использую технику создания пар ключ / значение для хеш-таблицы. @{}
— это синтаксис PowerShell для новой хеш-таблицы. Использование [PSCustomObject]
является ускорителем PowerShell, который позволяет мне, с одной стороны, создавать пользовательский объект из хеш-таблицы.
Веб-сервис Weather.asmx
вернул иерархический XML. В нескольких командах PowerShell я изменил данные и отформатировал их (дату) по своему вкусу. Для этого примера я решил позволить PowerShell распечатать его. Получив данные в моем сеансе PowerShell, я теперь подключен к экосистеме PowerShell и могу легко передать этот массив пользовательских объектов в другие командлеты, чтобы передать его в другой веб-сервис, сгенерировать HTML, сохранить его в файл, создать CSV файл или экспортировать его в базу данных SQL.
1
2
3
4
5
6
7
8
9
|
City State Date Description DaytimeHigh
—- —— —- ———— ————
Honolulu HI 5/22/2013 Showers 76
Honolulu HI 5/23/2013 Partly Cloudy 76
Honolulu HI 5/24/2013 Partly Cloudy 77
Honolulu HI 5/25/2013 Partly Cloudy 77
Honolulu HI 5/26/2013 Partly Cloudy 77
Honolulu HI 5/27/2013 Partly Cloudy 77
Honolulu HI 5/28/2013 Partly Cloudy 77
|
Работа с CSV, JSON и XML
Нарезка и нарезка текстовых форматов — это лучшее место для PowerShell. Здесь я преобразую три распространенных формата в объект PowerShell. Для CSV и JSON я буду использовать правильные командлеты ConvertFrom-*
, а для XML я буду использовать ускоритель, который принимает XML и создает XMLDocument.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
# Use CSV
$csv = «Name,Age`r`nJohn,10» |
$csv
Name Age
—- —
John 10
# Use JSON
$json = «{Name:’Tom’, Age:20}» |
$json
Name Age
—- —
Tom 20
# Use XML
$xml = ([xml][/xml]»<data><record><Name>Harry</Name><Age>30</Age></record></data>»).data.record
$xml
Name Age
—- —
Harry 30
# Combine all three
$csv,$json,$xml
Name Age
—- —
John 10
Tom 20
Harry 30
# Add up the ages
$csv,$json,$xml |
60
|
Итак, мы взяли три гетерогенных формата и в конце выполнили агрегирование по одному из полей. Я мог бы получить каждый из этих потоков данных из разных мест, CSV из общего сетевого ресурса, JSON для запроса REST и XML из веб-службы. Как я уже сказал, это сладкое место PowerShell.
Поиск в Твиттере
Давайте воспользуемся поисковым API REST в командной строке. Я создаю URL, который вы можете использовать в своем браузере, а затем использую командлет PowerShell Invoke-RestMethod
. Он отправляет запрос в службу REST и определяет, является ли ответ XML или JSON. Здесь я запрашиваю ответ JSON, поэтому Invoke-RestMethod
преобразует результаты в массив объектов PowerShell. Я передаю их в командлет Select
(псевдоним глагола- Select-Object
), выбирая только три поля. Думайте об этом как о проекции, похожей на LINQ или SQL.
1
2
3
4
5
|
$query = «PowerShell»
$url = «http://search.twitter.com/search.json?q=$query»
(Invoke-RestMethod $url).results |
Select created_at, from_user_name, text
|
Результат
Это так просто. Посмотрите видео, которое я сделал для версии 2: «PowerShell, ShowUI и Twitter API» . Мини-приложение Twitter для WPF в PowerShell.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
created_at from_user_name text
———- ————— —-
Sat, 25 May 2013 vitor pombeiro @brunomlopes a falar sobre Powershell «Ã minha maneira»
Sat, 25 May 2013 Jeffery Hicks Did you know the #PowerShell ISE has startup options?
Sat, 25 May 2013 Pat Richard @mwjcomputing Yeah — had always used $MyInvocation.MyCom
Sat, 25 May 2013 Rob Fairman «#PowerShell Script for Clearing #Windows Event Logs» ht
Sat, 25 May 2013 Jim Priestley Automating SharePoint Deployments in Windows #Azure usin
Sat, 25 May 2013 VT Technology RT @jangwoo_park: “@VTTechnology: Export Multiple Virtua
Sat, 25 May 2013 Aryan Nava Using PowerShell to view Site created on the previous da
Sat, 25 May 2013 Aryan Nava PowerShell Tips for SQL Server http://t.co/lVW2AY5BYZ
Sat, 25 May 2013 Private Cloud Tech The Journey to the Private Cloud Part 3 – The Infrastruc
Sat, 25 May 2013 Dr Tom Shinder The Journey to the Private Cloud Part 3 – The Infrastruc
Sat, 25 May 2013 Jacob Daniels RT @tech_faq: Windows Server Manager is based on Windows
Sat, 25 May 2013 CodeCruiser 10 Tips for the SQL Server PowerShell Scripter http://t.
|
Компиляция C # на лету в PowerShell
PowerShell — это интерпретируемый язык. Итак, будет штраф. Это не главная проблема, но иногда вам нужна скорость скомпилированного языка. PowerShell позволяет компилировать C # на лету в памяти в сеансе PowerShell, используя параметр -TypeDefinition
в командлете Add-Type
. Обратите внимание на here-string
обозначенную @" "@
. Они супер полезны при цитировании текста. Я призываю вас узнать больше о правилах цитирования Add-Type
и PowerShell.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
Add-Type -TypeDefinition @»
public class TestInline
{
public long Fibonacci(long n)
{
long a = 0;
long b = 1;
for (long idx = 0; idx < n; idx+=1)
{
long temp = a;
a = b;
b = temp + b;
}
return a;
}
}
«@
$obj = New-Object TestInline
1..10 |
|
Взаимодействие с DLLS
Теперь, допустим, я не дал вам исходный код — только скомпилированную DLL. Нет проблем: Add-Type
имеет параметр -Path
.
1
2
3
4
|
Add-Type -Path .\FibLib.dll
$obj = New-Object TestInline
1..10 |
|
Обратите особое внимание на это. Используя Add-Type
таким способом, вы можете легко обернуть любую .NET DLL от кого угодно, если они еще не предоставили интерфейс PowerShell. Это верно, является ли DLL от Microsoft, DELL, Citrix или другого разработчика.
В заключение
Так что это делает это сейчас. Хотели бы вы видеть больше контента для PowerShell на Nettuts +? Дайте нам знать ниже!