Статьи

Скажи привет PowerShell

PowerShell находится в разработке более десяти лет. Microsoft продолжает инвестировать в ее разработку и внедрение. Эти инвестиции изменили простоту и надежность, с которой разработчики и администраторы могут автоматизировать задачи Windows.


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 и выражается в виде пары глагол-существительное, помогая сделать их информативными. Например:

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 поддерживает подстановочные знаки. Допустим, я хочу увидеть все командлеты с глаголом 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 |

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

Нарезка и нарезка текстовых форматов — это лучшее место для 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.

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 |

Теперь, допустим, я не дал вам исходный код — только скомпилированную 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 +? Дайте нам знать ниже!