Windows PowerShell: Курс выживания при создании сценариев. Powershell язык


Язык программирования Windows PowerShell » Отличник RU

Язык программирования Windows PowerShell 1.00/5, 1 голос.

В этой главе дается описание PowerShell как языка программирования. Будут последовательно, поэлементно, от общего к частному рассмотрены почти все особенности языка. Я полагаю, что и для новичка и для опытного программиста такой подход станет более полезным введением, чем фрагментированные справочные файлы или не менее фрагментированные справочники и учебники, основанные на веб-технологиях и найденные где-нибудь в недрах Интернета. Я рекомендую вам бегло просмотреть материал этой главы, чтобы получить представление о всех особенностях программирования в среде PowerShell, а затем вернуться к данной информации и внимательно прочитать те ее части, в которых нужно разобраться более подробно. После этого вы будете лучше подготовлены к изучению интерактивных справочных страниц PowerShell для получения более подробной информации об отдельных элементах языка. Нужно будет просто набрать в окне командной строки PowerShell help или help Название_темы (см. главу 14, раздел «Получение справки»). Возможно, вам будет проще просматривать такие же страницы справки в интерактивном режиме на веб-сайте technet. microsoft. com. Выберите на главной странице пункт меню Library, затем слева раскройте пункты меню Windows PowerShell является средой командной строки и, как и старая оболочка командной строки, на самом основном уровне позволяет построчно вводить команды. Эта среда выполняет каждую команду и выводит результаты. В предыдущей главе было рассмотрено, как она выполняет командлеты и команды Windows и как передавать выходные данные через канал и перенаправлять вывод. Теперь мы рассмотрим PowerShell как язык программирования и создания сценариев. Как вы увидите, PowerShell — это новый язык. Если используемый в Windows Script Host (WSH) язык VBScript основан на Visual Basic for Applications, с которым многие знакомы как с языком макроопределений и сценариев, используемым в Microsoft Office, то PowerShell был создан с нуля. В этом есть как хорошие, так и плохие стороны. Хорошие связаны с тем, что создатели PowerShell могли совершенно свободно включить в язык ряд интересных новых идей, в результате чего появилась возможность выполнять довольно сложные операции. Но для этого был придуман довольно замысловатый синтаксис, который порой напоминает командную оболочку Unix 1970-х годов, а не язык программирования 2000-х. Наверное, мягче всего о нем можно было бы выразиться так: его красота явно не бросается в глаза.

otlithnik.ru

Введение в PowerShell - Get-PowerShell

PS C:\Users\pnck> Get-Command -Name *DNS*

 

CommandType     Name                                               ModuleName

-----------     ----                                               ----------

Alias           dnsn -> Disconnect-PSSession

Alias           Export-DnsServerTrustAnchor                        DnsServer

Function        Add-DnsClientNrptRule                              DnsClient

Function        Add-DnsServerConditionalForwarderZone              DnsServer

Function        Add-DnsServerDirectoryPartition                    DnsServer

Function        Add-DnsServerForwarder                             DnsServer

Function        Add-DnsServerPrimaryZone                           DnsServer

Function        Add-DnsServerResourceRecord                        DnsServer

Function        Add-DnsServerResourceRecordA                       DnsServer

Function        Add-DnsServerResourceRecordAAAA                    DnsServer

Function        Add-DnsServerResourceRecordCName                   DnsServer

Function        Add-DnsServerResourceRecordDnsKey                  DnsServer

Function        Add-DnsServerResourceRecordDS                      DnsServer

Function        Add-DnsServerResourceRecordMX                      DnsServer

Function        Add-DnsServerResourceRecordPtr                     DnsServer

Function        Add-DnsServerRootHint                              DnsServer

Function        Add-DnsServerSecondaryZone                         DnsServer

Function        Add-DnsServerSigningKey                            DnsServer

Function        Add-DnsServerStubZone                              DnsServer

Function        Add-DnsServerTrustAnchor                           DnsServer

Function        Add-DnsServerZoneDelegation                        DnsServer

Function        Add-VpnConnectionTriggerDnsConfiguration           VpnClient

Function        Clear-DnsClientCache                               DnsClient

Function        Clear-DnsServerCache                               DnsServer

Function        Clear-DnsServerStatistics                          DnsServer

Function        ConvertTo-DnsServerPrimaryZone                     DnsServer

Function        ConvertTo-DnsServerSecondaryZone                   DnsServer

Function        Disable-DnsServerSigningKeyRollover                DnsServer

Function        Disable-NetDnsTransitionConfiguration              NetworkTransition

Function        Enable-DnsServerSigningKeyRollover                 DnsServer

Function        Enable-NetDnsTransitionConfiguration               NetworkTransition

Function        Export-DnsServerDnsSecPublicKey                    DnsServer

Function        Export-DnsServerZone                               DnsServer

Function        Get-DhcpServerDnsCredential                        DhcpServer

Function        Get-DhcpServerv4DnsSetting                         DhcpServer

Function        Get-DhcpServerv6DnsSetting                         DhcpServer

Function        Get-DnsClient                                      DnsClient

Function        Get-DnsClientCache                                 DnsClient

Function        Get-DnsClientGlobalSetting                         DnsClient

Function        Get-DnsClientNrptGlobal                            DnsClient

Function        Get-DnsClientNrptPolicy                            DnsClient

Function        Get-DnsClientNrptRule                              DnsClient

Function        Get-DnsClientServerAddress                         DnsClient

Function        Get-DnsServer                                      DnsServer

Function        Get-DnsServerCache                                 DnsServer

Function        Get-DnsServerDiagnostics                           DnsServer

Function        Get-DnsServerDirectoryPartition                    DnsServer

Function        Get-DnsServerDnsSecZoneSetting                     DnsServer

Function        Get-DnsServerDsSetting                             DnsServer

Function        Get-DnsServerEDns                                  DnsServer

Function        Get-DnsServerForwarder                             DnsServer

Function        Get-DnsServerGlobalNameZone                        DnsServer

Function        Get-DnsServerGlobalQueryBlockList                  DnsServer

Function        Get-DnsServerRecursion                             DnsServer

Function        Get-DnsServerResourceRecord                        DnsServer

Function        Get-DnsServerRootHint                              DnsServer

Function        Get-DnsServerScavenging                            DnsServer

Function        Get-DnsServerSetting                               DnsServer

Function        Get-DnsServerSigningKey                            DnsServer

Function        Get-DnsServerStatistics                            DnsServer

Function        Get-DnsServerTrustAnchor                           DnsServer

Function        Get-DnsServerTrustPoint                            DnsServer

Function        Get-DnsServerZone                                  DnsServer

Function        Get-DnsServerZoneAging                             DnsServer

Function        Get-DnsServerZoneDelegation                        DnsServer

Function        Get-NetDnsTransitionConfiguration                  NetworkTransition

Function        Get-NetDnsTransitionMonitoring                     NetworkTransition

Function        Get-UalDns                                         UserAccessLogging

Function        Import-DnsServerResourceRecordDS                   DnsServer

Function        Import-DnsServerRootHint                           DnsServer

Function        Import-DnsServerTrustAnchor                        DnsServer

Function        Invoke-DnsServerSigningKeyRollover                 DnsServer

Function        Invoke-DnsServerZoneSign                           DnsServer

Function        Invoke-DnsServerZoneUnsign                         DnsServer

Function        Register-DnsClient                                 DnsClient

Function        Register-DnsServerDirectoryPartition               DnsServer

Function        Remove-DhcpServerDnsCredential                     DhcpServer

Function        Remove-DnsClientNrptRule                           DnsClient

Function        Remove-DnsServerDirectoryPartition                 DnsServer

Function        Remove-DnsServerForwarder                          DnsServer

Function        Remove-DnsServerResourceRecord                     DnsServer

Function        Remove-DnsServerRootHint                           DnsServer

Function        Remove-DnsServerSigningKey                         DnsServer

Function        Remove-DnsServerTrustAnchor                        DnsServer

Function        Remove-DnsServerZone                               DnsServer

Function        Remove-DnsServerZoneDelegation                     DnsServer

Function        Remove-VpnConnectionTriggerDnsConfiguration        VpnClient

Function        Reset-DnsServerZoneKeyMasterRole                   DnsServer

Function        Reset-NetDnsTransitionConfiguration                NetworkTransition

Function        Restore-DnsServerPrimaryZone                       DnsServer

Function        Restore-DnsServerSecondaryZone                     DnsServer

Function        Resume-DnsServerZone                               DnsServer

Function        Set-DhcpServerDnsCredential                        DhcpServer

Function        Set-DhcpServerv4DnsSetting                         DhcpServer

Function        Set-DhcpServerv6DnsSetting                         DhcpServer

Function        Set-DnsClient                                      DnsClient

Function        Set-DnsClientGlobalSetting                         DnsClient

Function        Set-DnsClientNrptGlobal                            DnsClient

Function        Set-DnsClientNrptRule                              DnsClient

Function        Set-DnsClientServerAddress                         DnsClient

Function        Set-DnsServer                                      DnsServer

Function        Set-DnsServerCache                                 DnsServer

Function        Set-DnsServerConditionalForwarderZone              DnsServer

Function        Set-DnsServerDiagnostics                           DnsServer

Function        Set-DnsServerDnsSecZoneSetting                     DnsServer

Function        Set-DnsServerDsSetting                             DnsServer

Function        Set-DnsServerEDns                                  DnsServer

Function        Set-DnsServerForwarder                             DnsServer

Function        Set-DnsServerGlobalNameZone                        DnsServer

Function        Set-DnsServerGlobalQueryBlockList                  DnsServer

Function        Set-DnsServerPrimaryZone                           DnsServer

Function        Set-DnsServerRecursion                             DnsServer

Function        Set-DnsServerResourceRecord                        DnsServer

Function        Set-DnsServerResourceRecordAging                   DnsServer

Function        Set-DnsServerRootHint                              DnsServer

Function        Set-DnsServerScavenging                            DnsServer

Function        Set-DnsServerSecondaryZone                         DnsServer

Function        Set-DnsServerSetting                               DnsServer

Function        Set-DnsServerSigningKey                            DnsServer

Function        Set-DnsServerStubZone                              DnsServer

Function        Set-DnsServerZoneAging                             DnsServer

Function        Set-DnsServerZoneDelegation                        DnsServer

Function        Set-NetDnsTransitionConfiguration                  NetworkTransition

Function        Set-VpnConnectionTriggerDnsConfiguration           VpnClient

Function        Show-DnsServerCache                                DnsServer

Function        Show-DnsServerKeyStorageProvider                   DnsServer

Function        Start-DnsServerScavenging                          DnsServer

Function        Start-DnsServerZoneTransfer                        DnsServer

Function        Step-DnsServerSigningKeyRollover                   DnsServer

Function        Suspend-DnsServerZone                              DnsServer

Function        Sync-DnsServerZone                                 DnsServer

Function        Test-DnsServer                                     DnsServer

Function        Test-DnsServerDnsSecZoneSetting                    DnsServer

Function        Unregister-DnsServerDirectoryPartition             DnsServer

Function        Update-DnsServerTrustPoint                         DnsServer

Cmdlet          Get-AzureDns                                       Azure

Cmdlet          New-AzureDns                                       Azure

Cmdlet          Resolve-DnsName                                    DnsClient

Application     dns.exe

Application     dnscacheugc.exe

Application     dnscmd.exe

Application     dnsmgmt.msc

get-powershell.ru

Горячие идеи: PowerShell, инструкции програмисту

Краткое описание:Microsoft Windows PowerShell — это бесплатная оболочка командной строки и язык написания сценариев для операционных систем Windows. На данный момент доступна полная версия с подробным справочным руководством на русском языке. Отличительной чертой новой командной оболочки является ее ориентированность на среду Microsoft .NET Framework.

Установочный пакет локализованной версии Windows PowerShell 1.0 для ОС Windows XP

Скачать

Установочный пакет для Windows Vista

Скачать

Начнем, значит что из себя представляет PowerShell

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

Очевидно, что PowerShell должен поддерживать самые модные и современные технологии Microsoft, такие как .Net Framework, и конечно же Windows Server 2008

Естественно они не забыли о домашних меньших братьях как Windows XP, его младшенькая сестричка Vista.

Теперь суть:1. Подержать полностью все стандартные методы, которые возможны в консоле (командной строке)2. Возможность программирования используя .Net Framework3. И написать максимально простой язык, который будет понятен, не только программистам, а еще и системным администраторам, он должен включать в себя максимальную гибкость и быстроту работы с этим языком.

Основные структуры языка и синтаксис:Cmdlet - называются команды PowerShell, которые можно использовать у них есть уже готовая функциональность, это функции, которые можно вызвать и исполнить.Cmdlet можно так же написать и самому, используя шаблон Cmdlet и откомпилировав его в assambly и зарегистрировать эту assambly в GAC, и все ваш Cmdlet готов к использованию.

Синтаксис языка:

Для создание комментариев используется - ##$str="Hello world"

Оглавление переменныхДля создания переменной используется $, хотя его можно и не использовать, но для удобства желательно это делатьВот пример:$str="Hello world"

Массивы, синтаксис очень похож на синтаксис C$strArray="Hi, ", "how ", "are, ", "you"$strArray[1]И выводиться how

Логические сравнение: больше, меньше или равно-eq Равно-ne Не равно-gt –ge Больше или больше и равно-lt –le Меньше или меньше и равно

Логические оператор - Еслиif (условие){.....}elseif (условние){.....}else{.....}

Циклы, аналогичны Cwhile (1){..... }

for ($i = 0; $i –lt 5; $i++) {.....}

foreach ($z in $i){.....}

Типы:Четки типы здесь можно не использовать, хотя при желаннее все возможно[string]$st = "Hi"[int]$intType = 1И уже при не совпадении типов, вылетает ошибка

Функции и процедуры:Так же можно использовать отдельные функции и процедуры с параметрами и без, с возвратом значения и без.

без параметров и возврата значенияfunction MyFunction{.....}

с параметрами и возвратом значенияfunction MyFunction($firstParam, [string]$secondOnlyStringParam){$ret_value="Hello".....return $ret_value}

Это все может прочитать в руководстве, которое постановляет с дистрибутивом вместе с PowerShell, в документе Quick Reference

Аналогии, программирование с использованием .Net Framework:

Работы с COM-обьектами и .Net аssembly вы можите без проблем создавать обьекты классов либо использовать статические методы

Вот простенькие пример для работы с COM-обьектом Internet Explorer

$ie = New-Object -ComObject InternetExplorer.Application$ie.Visible = $true$ie.Navigate("http://jthotblog.blogspot.com/")$ie.Quit()Remove-Variable ie

Для работы с классами .Net сборок все аналогичноИспользование статической функции

[System.Console]::WriteLine("Hello")

Создание нового обьекта класса и использование его метода

$sqlcmd = New-Object -TypeName System.Data.SqlClient.SqlCommand$sqlcmd.CommandText="SELECT * FROM TABLE1"

Могут возникнуть проблемы с использованием стандартных сборок и своих так же, по этому их нужно подгрузить перед использованием

Для стандартных[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Build.Framework")

Для своих[Reflection.Assembly]::LoadFile("c:\temp\MyAssembly.dll")

Запуск из .bat файлаСтандартный файл для хранения PowerShell скриптов это .ps1 файл

Для запуска файла с командной строки, можно указать полный путь к файлу либо запускать с текущей папки, там где лежит .bat файл.

powershell c:\myScript.ps1

или для текущей папки

powershell .\myScript.ps1

Но могут возникнуть проблемы с загрузкой таким методом, это проблема называться отстуствие цифровой подписи, для этого перед строкой в .bat файле, нужно написать еще 1 строку, которая разрешала бы запускать скрипты без цифровых подписей, либо если у вас есть сертификат, то вы можете подписать скрипт.

Для запуска скрипта без подписи можно использовать, вот такой Cmdlet

powershell Set-ExecutionPolicy RemoteSigned

Если вы собираетесь долго и много программировать на PowerShell, вы конечно можите использовать блокнот, но я бы вам советовал использовать бесплатную тулзовину, для написания скриптов и удобного управления ими, в этой тулзовене есть редактор скриптов, а в нем есть IntelliSense и в нем можно посмотреть полный список стандартных Cmdlet. А так же можно с помощью этой тулзовины можно удобно администрировать с используя PowerShell, это тулзовина называться PowerGUIPowerGUI

jthotblog.blogspot.com

Windows PowerShell: что это за программа

После перехода на операционную систему Windows 10 многие пользователи заметили в интерфейсе Проводника кнопку «Запустить PowerShell». В связи с этим в сети появилось много вопросов, пользователей интересовало, что это за программа Windows PowerShell и для чего она нужна. Если вас также интересует этот вопрос, то данный материал должен вам помочь.

Что такое Windows PowerShell

Windows PowerShell – это скриптовый язык и программа с интерфейсом командной строки для выполнения этих скриптов. Данный язык был выпущен в 2006 году в составе второго сервис-пака для Windows XP и с тех пор PowerShell является частью всех операционных систем от Microsoft. В 2008 году появилась вторая версия данного языка, и начиная с Windows 7 используется именно она. Файлы со скриптами Windows PowerShell имеют расширение PS1 и могут запускаться как привычные всем BAT и CMD файлы.

Windows PowerShell – это скриптовый язык, который разрабатывался в первую очередь для бизнес-клиентов Microsoft, которым нужно мощные инструменты для автоматизации задач по управлению серверами и компьютерами на базе Windows. В качестве основы для данного языка была использована платформа .NET, разрабатываемая компанией Microsoft с 2002 года.

Windows PowerShell позволяет автоматизировать массу разнообразных задач. С его помощью можно управлять файлами, службами, процессами, аккаунтами и настройками. Язык PowerShell понимает многие команды из обычной Командной строки Windows (CMD), но он имеет и свой собственный язык, состоящий из собственных команд, которые здесь называются командлетами.

Командлеты (на английском cmdlets) формируются по правилу Глагол-Существительное, например, Get-Help. Ознакомиться с основами Windows PowerShell можно с помощью справки (командлет «Get-Help»). Для получения общей информации просто введите команду «Get-Help», для получения справки о конкретном командлете введите «Get-Help Имя-командлета». Например, если ввести команду «Get-Help Get-Process», то мы получим справку о командлете Get-Process.

Как запустить программу Windows PowerShell

Программу Windows PowerShell можно запустить разными способами. Самый простой вариант, это просто воспользоваться поиском в меню «Пуск». Для этого откройте меню «Пуск», введите поисковый запрос «Windows PowerShell», после чего откройте найденную программу.

Также можно открыть меню «Выполнить» с помощью комбинации клавиш Windows-R и ввести команду «powershell».

В Windows 10 программу PowerShell можно запустить из любой папки. Для этого нужно нажать на кнопку «Файл» в верхнем левом углу Проводника и выбрать «Запустить Windows PowerShell».

Как пользоваться программой Windows PowerShell

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

Очистка корзины. Для очистки корзины существует специальный командлет, который называется «Clear-RecycleBin». Данный командлет пригодится при написании скриптов для обслуживания компьютеров. При выполнении командлета нужно указать диск, на котором нужно очистить корзину. Пример:

Clear-RecycleBin c:

На скриншоте внизу видно, как выполняется данный командлет. После введения команды «Clear-RecycleBin c:» появляется запрос на подтверждение. Для того чтобы продолжить выполнение командлета нужно ввести букву «Y» и нажать Enter.

Если к командлету «Clear-RecycleBin c:» добавить «-Force», то очистка корзины выполнится без запроса на подтверждение. Скриншот внизу.

Архивация файлов. Для архивации и распаковки файлов предусмотрены командлеты «Compress-Archive» и «Expand-Archive«. Например, для того чтобы архивировать папку «C:\test\» в архив «C:\archive\test2.zip» нужно выполнить следующий командлет:

Compress-Archive -LiteralPath C:\test\ -DestinationPath C:\archive\test2.zip

В результате выполнения показанной выше команды, в папке «C:\archive\» появится файл «test2.zip», в котором будет заархивировано содержимое папки «C:\test\».

Список командлетов для Windows PowerShell

Для Windows PowerShell существует огромное количество разных командлетов и описать их все в одной статье не получится. Поэтому предлагаем ознакомиться с самыми востребованными из них:

  • Get-Help – получение справки;
  • Update-Help – обновление справки;
  • Get-Command – поиск командлетов;
  • Get-Alias – поиск псевдонимов для командлетов;
  • Get-PSDrive – просмотр подключенных дисков;
  • Get-Member – просмотр свойств и методов, которые есть у объекта;
  • Get-WindowsFeature – просмотр сведений о доступных ролях и компонентах сервера;
  • Install-WindowsFeature (аналог Add-WindowsFeature) — устанавливает роли или компоненты на нужный сервер;
  • Uninstall-WindowsFeature (аналог Remove-WindowsFeature) – удаляет роли или компонента сервера;
  • Get-History – просмотр истории команд, которые вводились в этой сессии;
  • Get-Variable – просмотр списка переменных и их значений;
  • New-Variable – создание новой переменной;
  • Set-Variable – установка значения переменной;
  • Clear-Variable – удаление значения переменной;
  • Remove-Variable – удаление переменной и ее значения;
  • Format-List – просмотр результата команды в виде списка свойств, где в каждой строке отдельное свойство;
  • Format-Table — просмотр результата команды в формате таблицы;
  • Format-Wide — просмотр результата команды в виде широкой таблицы, в которой показывается только одно свойство для каждого объекта;
  • Format-Custom – просмотр результата команды с использованием пользовательского представления;
  • Export-Csv – экспорт данных в формат CSV;
  • Import-Csv – импорт данных из CSV файла;
  • Export-Clixml — экспорт данных в формат XML;

Полный список командлетов для Windows PowerShell вы можете получить, выполнив командлет «Get-Command -CommandType cmdlet».

comp-security.net

powershell - Есть ли справочное руководство по языку для PowerShell?

Внутренние функции

Не работает функция. Собственные команды PowerShell называются командлетами - они являются классами .NET, имеют общую систему параметров/аргументов и хорошо работают с конвейером. Теперь вы можете сделать то же самое с расширенными функциями непосредственно на языке PowerShell.

Существует множество встроенных командлетов для ввода-вывода файлов, управления процессом, доступа WMI и материалов, относящихся к оболочке, таких как управление переменными, псевдонимами, модулями и с.

Кроме того, в вашем распоряжении полная платформа .NET, где вы можете найти различные математические функции, например, и все остальное, что нелегко сделать с помощью PowerShell.

Основные функции проверки/ветвления/цикла и управления потоком

Обычные С-подобные утверждения: if, switch, for, while, do, foreach. Обратите внимание, что фигурные скобки разделяют блоки, и все эти утверждения ожидают блоки (не блоки или один оператор, как на многих других языках). Детали можно найти с помощью Get-Help about_If (и about_Switch, about_for, about_while, about_do, about_foreach). Особенно switch безумно силен, позволяя регулярное сопоставление выражений и другие тонкости, которые часто могут служить простым импровизированным парсером.

Внутренние типы переменных (логические, целые, с плавающей запятой, строка)

Assign $true or $false to a variable and it is a boolean, assign an integer to a variable and it becomes Int32, Int64, Decimal or Double, depending on how large it is. You won't surprisingly land at −231 because of overflow. Floating point numbers and strings can be similarly constructed with the usual notation. You can always declare an explicit type if you don't like the default choice:

PS> [long]$a = 5 # 5 would usually result in [int], not [long]

Внутренние структуры данных (скаляр, список, ассоциативный массив, объект)

Вы можете легко иметь скаляры:

PS> $a = "foo"

или списки (ну, они представляют собой массивы внизу):

PS> $b = 5, 2, "bar"

или хэш-таблицы (ассоциативные массивы):

PS> $c = @{ 'a' = 5; 7 = 'foo' }

Оба массива и хэш-таблицы по умолчанию основаны на Object. Чтобы получить более сильные ограничения типа здесь, вам нужно перепрыгнуть через несколько обручей.

Операторы и приоритет оператора

Операторы можно найти в Get-Help about_Operators.

Арифметика (см. about_arithmetic_operators)

+ - * / % ++ --

Назначение (см. about_assignment operators)

= += -= *= /= %=

Логический (см. about_logical_operators)

-and -or -xor -not !

Довольно просто; ! - это просто другое имя для -not, которое может помочь тем, кто внедрен в C-подобные языки.

побитовое

-band -bor -bxor -bnot

Операторы сравнения

Так как PowerShell является оболочкой, они не могут просто использовать > и <, которые зарезервированы для перенаправления, следовательно, несколько более громоздкие варианты:

-lt -le -eq -ge -gt -ne

Другие

Есть также два варианта операторов сопоставления строк: -match для соответствия регулярных выражений и -like для сопоставления подстановочных знаков; их отрицательные варианты: -notmatch, -notlike; и их явно чувствительные к регистру и нечувствительные к регистру двоюродные братья (по умолчанию не чувствительны к регистру): -cmatch, -imatch, -cnotmatch, -inotmatch, -clike, -ilike, -cnotlike, -inotlike, См. about_comparison_operators)

Тогда есть еще несколько специальных операторов, таких как операторы перенаправления (см. about_redirection):

> >> 2> 2>> 2>&1

Split и Join (новый в PowerShell v2):

-split -join

Те могут разделить строку на регулярное выражение или присоединиться к массиву с указанным разделителем.

Оператор замены -replace, который также допускает регулярные выражения.

Оператор формата -f:

PS> "{0:N3} {1} {2:yyyy-MM-dd}" -f 123.456789,"foo",(Get-Date) 123,457 foo 2010-02-25

Оператор диапазона ..:

PS> 1..10 -join ", " 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Помимо множества других, таких как оператор вызова &, точечный поиск с ., подвыражениями с $( ), подвыражениями массива с @( ) и оператором построения массива ,. Однако это выходит из-под контроля, поэтому посмотрите сами.

Что касается приоритета, я сомневаюсь в том, что вам действительно нужно знать. Если есть сомнения, используйте круглые скобки. Арифметические операторы используют обычное правило (mul/div до add/sub). У меня не было особых сюрпризов с приоритетом, поэтому я не стал смотреть на него до сих пор.

Функции, специфичные для языка автоматизации задач

  • Управление процессом (exec, fork, wait, kill)

    Это оболочка, поэтому exec явно подразумевается. Вы можете напрямую запускать другие программы без проблем. fork - это не Windows, поэтому вам не повезло. Для wait существует Wait-Process, который, как я считаю, делает то же самое (если я правильно читаю manpage).

  • Мониторинг системы (ps, время безотказной работы, lsof, fuser, netstat, df)

    • ps является псевдонимом Get-Process.
    • Время безотказной работы системы может быть запрошено через WMI и при необходимости упаковано в удобной функции:

      function Get-SystemUptime { $os = Get-WmiObject Win32_OperatingSystem (Get-Date) - [Management.ManagementDateTimeConverter]::ToDateTime($os.LastBootUpTime) }

      который возвращает объект TimeSpan.

    • lsof, fuser можно каким-то образом схватить из объектов процесса; Однако этого не делал. netstat по-прежнему доступен как собственная программа, которую вы можете просто запустить.

    • df может быть эмулирован с помощью

      Get-PSDrive -PSProvider FileSystem

      Если вам это нужно больше, чем просто посмотреть на него, WMI, вероятно, более разумный путь.

  • Обработка файлов и каталогов (поиск, поиск, которые, cd, mkdir, touch, rm, rmdir)

    • find и locate обычно можно достичь с помощью Get-ChildItem и последующей фильтрации результатов с помощью Where-Object.
    • which сопоставляется с Get-Command, который с PowerShell v2 отображает команды в том порядке, в котором они рассматриваются для выполнения:

      PS Home:\> gcm where CommandType Name Definition ----------- ---- ---------- Alias where Where-Object Application where.exe C:\Windows\system32\where.exe
    • cd является псевдонимом для Set-Location. Возможные местоположения включают не только файловую систему, но и реестр, переменные, псевдонимы, хранилище сертификатов и т.д.

    • mkdir - это функция, которая в конечном итоге сопоставляется с New-Item с соответствующими аргументами.
    • touch может быть достигнуто с помощью Set-ItemProperty:

      Set-ItemProperty foo.txt LastWriteTime (Get-Date)

      Вы можете поместить это в функцию с именем touch, если хотите.

    • rm и rmdir являются псевдонимами для Remove-Item.

  • I/O (трубы, cat, tee, xargs, чтение, запись, перезапись, добавление, поиск)

    • Трубопроводы используют объекты вместо байтов, которые должны быть самыми значительными по сравнению с другими оболочками. Кроме того, не слишком много сюрпризов. Многие командлеты принимают ввод конвейера.
    • cat является псевдонимом для Get-Content.
    • tee является псевдонимом для Tee-Object. Это не только позволяет записывать в файл, но вы также можете записывать его в переменную, например:

      Get-Process | Tee-Object -Variable proc | Select-Object ProcessName,CPU
    • xargs можно заменить на ForEach-Object, насколько я могу видеть.

    • Байт-ориентированный ввод/вывод файлов, вероятно, лучше выполняется с обычными объектами .NET и вызовами методов. Достаточно легко получить полный файл в виде строки с Get-Content, но помимо этого это немного громоздко.
  • Функции обработки текста (awk, sed, grep, split, join, cut, fmt, string)

    Большинство функций обработки текста не так отчаянно необходимы, как в UNIX-системах, поскольку вам не нужны они, например, для анализа вывода команды, по крайней мере, когда вы имеете дело с командлетами, которые возвращают объекты, которые позволяют намного проще доступ к их свойствам.

    Помимо этого существуют различные инструменты для обработки текста. В зависимости от того, что вам нужно сделать switch -regex и -match, -replace и -split операторы могут компенсировать большинство применений sed, awk, cut, split, join Я видел.

    Нет strings или fmt.

Является ли PowerShell строго типизированным (char, строка, int, long, float, double) или слабо типизированный (вариант)?

PowerShell использует систему типа .NET. Переменные неявно строго напечатаны, но не объявлены. Тем не менее, они могут иметь явный тип.

Доступны ли общие структуры данных (скалярные, список, ассоциативный массив) и являются ли они первоклассными элементами?

Таким образом, вы можете использовать любую структуру данных .NET из пространства имен System.Collections. Общие коллекции немного болезненны для настройки, но это можно сделать. Как упоминалось ранее, списки элементов и хэш-таблиц также являются языковыми элементами.

Есть ли библиотека или система модулей?

В PowerShell v2 есть модули, которые являются наборами командлетов связанной функциональности. Подробнее см. Get-Help about_Modules.

Если да, то что находится в стандартной библиотеке?

Больше, чем было бы разумно описать здесь. Вы можете позвонить Get-Command, чтобы узнать, что доступно. Get-Help, как обычно, помогает выяснить, что делает какая-либо данная вещь.

Есть ли сторонние библиотеки, которые я могу использовать, если я не найду то, что мне нужно?

Вы можете динамически загружать любую сборку .Net, используя

[System.Reflection.Assembly]::LoadFrom(...)

или (в PowerShell v2) с помощью Add-Type:

Add-Type -AssemblyName ...

Является ли это процедурным, функциональным или объектно-ориентированным языком или в какой степени каждый?

Wikipedia говорит, что Multi-парадигма: императив, конвейер, объектно-ориентированный, функциональный, отражающий. Аспект контура объекта - прекрасный способ добиться элегантных решений для некоторых проблемных областей.

Он объектно-ориентированный в том смысле, что вы в основном используете объекты для достижения своей цели, вы редко моделируете что-то с объектами в PowerShell. Вы не можете создавать собственные классы (не считая Add-Type, который позволяет вам писать, компилировать и импортировать код С# или VB на лету), поэтому с точки зрения абстракции для собственной работы на языке PowerShell вы, вероятно, будете больше на процедурный уровень.

Каковы соглашения о кодировании? (Perl Best Practices)

Язык еще очень молод, так что еще нет такой вещи (по крайней мере, я не знаю об этом). Однако при попытке кодирования кода PowerShell Code-Golf стало очевидным, что трудно создавать совершенно нечитаемые беспорядки. Обычные правила для языков курчавого языка работают достаточно хорошо, и для более длинных конвейеров, разбивающих их на несколько строк, часто помогает читаемость.

Есть ли ожидания форматирования - линейная или свободная форма?

Не уверен, как ответить на это: в основном строки, ориентированные на команды, но с помощью команд с каналами, могут быть лучше прочитаны с каждой командой в одной строке.

Если вы вызываете встроенный, вы можете использовать `(серьезный акцент) как знак продолжения строки.

Значит ли это пробел или регистр?

Нет. За исключением разрывов строк, которые обычно завершают команду, если только предшествующий символ эвакуации или когда они происходят внутри блоков или других окружающих структур.

Есть ли ограничение набора символов?

Нет.

Является ли язык "8-битным чистым"?

Да. Мы больше не находимся в возрасте Ye Olde 70-х. Вы также можете легко назвать переменные, функции, которые вы хотите, без ограничений. Например, я назвал функцию ♦ (U + 0004), которая позволяет мне нажать Ctrl + D, Enter, чтобы закрыть сеанс.

Поддерживает ли он UTF-8, Unicode и т.д.?

Поскольку PowerShell использует .Net, у вас есть полная поддержка Unicode. Потоки ввода и вывода могут быть настроены на различные кодировки.

qaru.site

FAQ POWERSHELL НА РУССКОМ ЯЗЫКЕ

Концепция : Наиболее часто задаваемые вопросы по PowerShell.

Вы можете использовать этот список для того, чтобы :

  • Скопировать/вставить команды в скрипт
  • Ознакомиться с синтаксисом определённой команды
  • Улучшить свои технические знания
  • Узнать о новых командах
  • Подготовиться к собеседованию

System

Как определить мою версию PowerShell?

# via Powershell $PSVersionTable.PSVersion.Major # via Registry (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine').PowerShellVersion # Versions 1 and 2 (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine').PowerShellVersion # Versions 3 and 4 # via Remote Invoke-Command -ComputerName $computer -ScriptBlock { $PSVersionTable.PSVersion.Major }

# via Powershell

$PSVersionTable.PSVersion.Major

 

# via Registry

(Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine').PowerShellVersion # Versions 1 and 2

(Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine').PowerShellVersion # Versions 3 and 4

 

# via Remote

Invoke-Command -ComputerName $computer -ScriptBlock { $PSVersionTable.PSVersion.Major }

Как запустить другую версию Powershell в режиме обратной совместимости?powershell.exe -Version 2.0

Как установить принудительное использование определённой версии PowerShell (3,0 и выше) в скрипте с помощью PowerShell?#Requires -Version 3.0

Как предоставить скрипту права администратора с помощью PowerShell?

# Solution 1 #Requires -RunAsAdministrator # Solution 2 [bool]((whoami.exe /all) -match 'S-1-16-12288')

# Solution 1

#Requires -RunAsAdministrator

 

# Solution 2

[bool]((whoami.exe /all) -match 'S-1-16-12288')

Как проверить параметры скрипта с помощью PowerShell?help -Name .\Get-ExchangeEnvironmentReport.ps1 -Full

Как получить информацию о текущем пользователе с помощью PowerShell?[Security.Principal.WindowsIdentity]::GetCurrent()

Как создать, отредактировать и перезагрузить профиль с помощью PowerShell?

# Check if a profile exists Test-Path -Path $PROFILE # Current User,Current Host Test-Path -Path $PROFILE.CurrentUserCurrentHost # Current User,Current Host Test-Path -Path $PROFILE.CurrentUserAllHosts # Current User,All Hosts Test-Path -Path $PROFILE.AllUsersCurrentHost # All Users, Current Host Test-Path -Path $PROFILE.AllUsersAllHosts # All Users, All Hosts # Create a new profile for current user New-Item -ItemType File -Force $PROFILE # CurrentUserCurrentHost New-Item -ItemType File -Force $PROFILE.CurrentUserCurrentHost New-Item -ItemType File -Force $PROFILE.CurrentUserAllHosts # Edit psEdit $PROFILE (only for ISE) ise $PROFILE (only for ISE) notepad.exe $PROFILE # Reload (without restarting Powershell) & $PROFILE .$PROFILE # List profiles $PROFILE | Format-List * -Force

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

# Check if a profile exists

Test-Path -Path $PROFILE                           # Current User,Current Host  

Test-Path -Path $PROFILE.CurrentUserCurrentHost    # Current User,Current Host  

Test-Path -Path $PROFILE.CurrentUserAllHosts       # Current User,All Hosts    

Test-Path -Path $PROFILE.AllUsersCurrentHost       # All Users, Current Host    

Test-Path -Path $PROFILE.AllUsersAllHosts          # All Users, All Hosts      

# Create a new profile for current user

New-Item -ItemType File -Force $PROFILE # CurrentUserCurrentHost

New-Item -ItemType File -Force $PROFILE.CurrentUserCurrentHost

New-Item -ItemType File -Force $PROFILE.CurrentUserAllHosts

# Edit

psEdit $PROFILE (only for ISE)

ise $PROFILE (only for ISE)

notepad.exe $PROFILE

# Reload (without restarting Powershell)

& $PROFILE

.$PROFILE

# List profiles

$PROFILE | Format-List * -Force

Как установить паузу на 5 секунд/минут в скрипте с помощью PowerShell?Start-Sleep -Seconds 5Start-Sleep -Seconds 300 # 5 minutes

Как узнать время последней загрузки с помощью PowerShell?(Get-CimInstance -ClassName win32_operatingsystem).LastBootUpTime

Как получить ускорители типов с помощью PowerShell?

[PSObject].Assembly.GetType('System.Management.Automation.TypeAccelerators')::Get.GetEnumerator() | Select-Object -Property @{Name='Key'; Expression={$_.Key}},@{name='Value'; Expression={$_.Value}} | Sort-Object -Property Key | Format-Table -AutoSize

[PSObject].Assembly.GetType('System.Management.Automation.TypeAccelerators')::Get.GetEnumerator() |  Select-Object -Property @{Name='Key'; Expression={$_.Key}},@{name='Value'; Expression={$_.Value}} | Sort-Object -Property Key | Format-Table -AutoSize

Как вывести список программ автозагрузки с помощью PowerShell?

Get-WmiObject -Class Win32_StartupCommand | Sort-Object -Property Caption | Format-Table -Property Caption, Command, User -AutoSize

Get-WmiObject -Class Win32_StartupCommand | Sort-Object -Property Caption | Format-Table -Property Caption, Command, User -AutoSize

Как удалить приложение с помощью PowerShell?

$application = Get-WmiObject -Query "SELECT * FROM Win32_Product WHERE Name LIKE 'HP Recovery Manager'" $application.Uninstall()

$application = Get-WmiObject -Query "SELECT * FROM Win32_Product WHERE Name LIKE 'HP Recovery Manager'"

$application.Uninstall()

Как сделать скриншот рабочего стола или активного окна с помощью PowerShell?Take-ScreenShot -Screen -File 'C:\scripts\screenshot.png' -Imagetype JPEGRepository : Take-ScreenShot

Как узнать количество сообщений для очередей MSMQ с помощью PowerShell?

Get-WmiObject -Class Win32_PerfRawData_MSMQ_MSMQQueue -ComputerName $computer | Format-Table -Property Name, MessagesInQueue -AutoSize

Get-WmiObject -Class Win32_PerfRawData_MSMQ_MSMQQueue -ComputerName $computer | Format-Table -Property Name, MessagesInQueue -AutoSize

Как установить исполнительную политику с помощью PowerShell?

# Restricted - No scripts can be run. Windows PowerShell can be used only in interactive mode. Set-ExecutionPolicy -ExecutionPolicy Restricted # AllSigned - Only scripts signed by a trusted publisher can be run. Set-ExecutionPolicy -ExecutionPolicy AllSigned # RemoteSigned - Downloaded scripts must be signed by a trusted publisher before they can be run. Set-ExecutionPolicy -ExecutionPolicy RemoteSigned # Unrestricted - No restrictions - All Windows PowerShell scripts can be run. Set-ExecutionPolicy -ExecutionPolicy Unrestricted

# Restricted - No scripts can be run. Windows PowerShell can be used only in interactive mode.

Set-ExecutionPolicy -ExecutionPolicy Restricted

 

# AllSigned - Only scripts signed by a trusted publisher can be run.

Set-ExecutionPolicy -ExecutionPolicy AllSigned

 

# RemoteSigned - Downloaded scripts must be signed by a trusted publisher before they can be run.

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

 

# Unrestricted - No restrictions - All Windows PowerShell scripts can be run.

Set-ExecutionPolicy -ExecutionPolicy Unrestricted

Как создать ярлык с помощью PowerShell?

$shell = New-Object -ComObject WScript.Shell $shortcut = $shell.Createshortcut("$HOME\Desktop\Procexp.lnk") $shortcut.TargetPath = 'C:\SysinternalsSuite\procexp.exe' $shortcut.Save()

$shell = New-Object -ComObject WScript.Shell

$shortcut = $shell.Createshortcut("$HOME\Desktop\Procexp.lnk")

$shortcut.TargetPath = 'C:\SysinternalsSuite\procexp.exe'

$shortcut.Save()

Как прикрепить или открепить программу в панели задач с помощью PowerShell?

$shell = New-Object -ComObject shell.application $program = $shell.Namespace($env:windir).Parsename('notepad.exe') $program.Invokeverb('TaskbarPin') $program.Invokeverb('TaskbarUnpin')

$shell = New-Object -ComObject shell.application

$program = $shell.Namespace($env:windir).Parsename('notepad.exe')

$program.Invokeverb('TaskbarPin')

$program.Invokeverb('TaskbarUnpin')

Как открыть Windows Explorer с помощью PowerShell?[Diagnostics.Process]::Start('explorer.exe')Invoke-Item -Path C:\Windows\explorer.exe

Как вывести список драйверов устройств с помощью PowerShell?Get-WmiObject -Class Win32_PnPSignedDriverGet-WindowsDriver -Online -Alldriverquery.exe

Как создать GUID с помощью PowerShell?

# Empty GUID [GUID]::Empty 00000000-0000-0000-0000-000000000000 # New GUID (lower case by default) [GUID]::NewGuid() 7049b4a9-e4bc-4008-a683-067934bd39cf # New GUID (upper case) $guid = ([GUID]::NewGuid()).ToString().ToUpper() DD7F5A7B-F46B-49D0-B8A1-D8D1360D2E27 # New GUID with a specific value [GUID]('bc4ad3d3-d704-4bd0-843f-d607fbbc4cd7') bc4ad3d3-d704-4bd0-843f-d607fbbc4cd7 # New GUID (Powershell v5) New-Guid cdcaa4d9-c85f-40d7-afd9-32f003afa130

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

# Empty GUID

[GUID]::Empty

00000000-0000-0000-0000-000000000000

# New GUID (lower case by default)

[GUID]::NewGuid()

7049b4a9-e4bc-4008-a683-067934bd39cf

 

# New GUID (upper case)

$guid = ([GUID]::NewGuid()).ToString().ToUpper()

DD7F5A7B-F46B-49D0-B8A1-D8D1360D2E27

# New GUID with a specific value

[GUID]('bc4ad3d3-d704-4bd0-843f-d607fbbc4cd7')

bc4ad3d3-d704-4bd0-843f-d607fbbc4cd7

 

# New GUID (Powershell v5)

New-Guid

cdcaa4d9-c85f-40d7-afd9-32f003afa130

Как узнать расположение временного каталога текущего пользователя с помощью PowerShell?[System.IO.Path]::GetTempPath()

Как объединить общий и дочерний путь с помощью PowerShell?Join-Path -Path C:\ -ChildPath \windows

Как вывести список всех команд “Get-*” с помощью PowerShell?Get-Command -Verb Get

Как вывести список специальных системных папок с помощью PowerShell?

[System.Enum]::GetNames([System.Environment+SpecialFolder]) | ForEach-Object -Process { $_ + " [System.Environment]::GetFolderPath($_)" }

[System.Enum]::GetNames([System.Environment+SpecialFolder]) | ForEach-Object -Process { $_ + " [System.Environment]::GetFolderPath($_)" }

Как cмонтировать ISO/VHD файл с помощью PowerShell?Mount-DiskImage 'D:\ISO\file.iso' # ISOMount-DiskImage 'D:\VHD\file.vhd' # VHD

Как узнать текущую версию .NET Framework с помощью PowerShell?

Get-ChildItem -Path 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name Version -EA 0 | Where-Object -FilterScript { $_.PSChildName -match '^(?!S)\p{L}' } | Select-Object -Property PSChildName, Version

Get-ChildItem -Path 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name Version -EA 0 | Where-Object -FilterScript { $_.PSChildName -match '^(?!S)\p{L}' } | Select-Object -Property PSChildName, Version

Как проверить, установлена ли версия 4.5 .NET Framework, с помощью PowerShell?(Get-ItemProperty -Path 'HKLM:\Software\Microsoft\NET Framework Setup\NDP\v4\Full' -EA 0).Version -like '4.5*'

Как начать и остановить расшифровку (для создания записи сессии Windows PowerShell) с помощью PowerShell?Start-Transcript -Path 'C:\scripts\transcript.txtStop-Transcript

Как изменить текущий каталог на заданный с помощью PowerShell?Set-Location -Path 'C:\scripts'

Как очистить экран с помощью PowerShell?Clear-Hostcls # Alias

Как изменить разрешение экрана с помощью PowerShell?Set-DisplayResolution -Width 1280 -Height 1024 -Force # Windows 2012

Как установить полноэкранный режим с помощью PowerShell?mode.com 300

Как узнать размеры (ширина и высота) изображения с помощью PowerShell?

$picture = New-Object -ComObject Wia.ImageFile $picture.LoadFile('C:\screenshot.jpg') [PSCustomObject] @{ Width = $picture.Width Height = $picture.Height }

$picture = New-Object -ComObject Wia.ImageFile

$picture.LoadFile('C:\screenshot.jpg')

 

[PSCustomObject] @{

    Width  = $picture.Width

    Height = $picture.Height

}

Как посмотреть ключ продукта Windows с помощью PowerShell?

function Get-WindowsKey { ## function to retrieve the Windows Product Key from any PC ## by Jakob Bindslet ([email protected]) param ($targets = '.') $hklm = 2147483650 $regPath = 'Software\Microsoft\Windows NT\CurrentVersion' $regValue = 'DigitalProductId' Foreach ($target in $targets) { $productKey = $null $win32os = $null $wmi = [WMIClass]"\\$target\root\default:stdRegProv" $data = $wmi.GetBinaryValue($hklm,$regPath,$regValue) $binArray = ($data.uValue)[52..66] $charsArray = 'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'M', 'P', 'Q', 'R', 'T', 'V', 'W', 'X', 'Y', '2', '3', '4', '6', '7', '8', '9' ## decrypt base24 encoded binary data For ($i = 24; $i -ge 0; $i--) { $k = 0 For ($j = 14; $j -ge 0; $j--) { $k = $k * 256 -bxor $binArray[$j] $binArray[$j] = [math]::truncate($k / 24) $k = $k % 24 } $productKey = $charsArray[$k] + $productKey If (($i % 5 -eq 0) -and ($i -ne 0)) { $productKey = '-' + $productKey } } $win32os = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $target $obj = New-Object -TypeName Object $obj | Add-Member -MemberType Noteproperty -Name Computer -Value $target $obj | Add-Member -MemberType Noteproperty -Name Caption -Value $win32os.Caption $obj | Add-Member -MemberType Noteproperty -Name CSDVersion -Value $win32os.CSDVersion $obj | Add-Member -MemberType Noteproperty -Name OSArch -Value $win32os.OSArchitecture $obj | Add-Member -MemberType Noteproperty -Name BuildNumber -Value $win32os.BuildNumber $obj | Add-Member -MemberType Noteproperty -Name RegisteredTo -Value $win32os.RegisteredUser $obj | Add-Member -MemberType Noteproperty -Name ProductID -Value $win32os.SerialNumber $obj | Add-Member -MemberType Noteproperty -Name ProductKey -Value $productKey $obj } }

1

2

3

4

5

6

7

8

9

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

38

39

40

41

42

43

44

45

function Get-WindowsKey

{

    ## function to retrieve the Windows Product Key from any PC

    ## by Jakob Bindslet ([email protected])

    param ($targets = '.')

    $hklm = 2147483650

    $regPath = 'Software\Microsoft\Windows NT\CurrentVersion'

    $regValue = 'DigitalProductId'

    Foreach ($target in $targets)

    {

        $productKey = $null

        $win32os = $null

        $wmi = [WMIClass]"\\$target\root\default:stdRegProv"

        $data = $wmi.GetBinaryValue($hklm,$regPath,$regValue)

        $binArray = ($data.uValue)[52..66]

        $charsArray = 'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'M', 'P', 'Q', 'R', 'T', 'V', 'W', 'X', 'Y', '2', '3', '4', '6', '7', '8', '9'

        ## decrypt base24 encoded binary data

        For ($i = 24; $i -ge 0; $i--)

        {

            $k = 0

            For ($j = 14; $j -ge 0; $j--)

            {

                $k = $k * 256 -bxor $binArray[$j]

                $binArray[$j] = [math]::truncate($k / 24)

                $k = $k % 24

            }

            $productKey = $charsArray[$k] + $productKey

            If (($i % 5 -eq 0) -and ($i -ne 0))

            {

                $productKey = '-' + $productKey

            }

        }

        $win32os = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $target

        $obj = New-Object -TypeName Object

        $obj | Add-Member -MemberType Noteproperty -Name Computer -Value $target

        $obj | Add-Member -MemberType Noteproperty -Name Caption -Value $win32os.Caption

        $obj | Add-Member -MemberType Noteproperty -Name CSDVersion -Value $win32os.CSDVersion

        $obj | Add-Member -MemberType Noteproperty -Name OSArch -Value $win32os.OSArchitecture

        $obj | Add-Member -MemberType Noteproperty -Name BuildNumber -Value $win32os.BuildNumber

        $obj | Add-Member -MemberType Noteproperty -Name RegisteredTo -Value $win32os.RegisteredUser

        $obj | Add-Member -MemberType Noteproperty -Name ProductID -Value $win32os.SerialNumber

        $obj | Add-Member -MemberType Noteproperty -Name ProductKey -Value $productKey

        $obj

    }

}

Perfmon

Как получить текущий “% Processor Time” (усредненное значение) в течение последних 5 секунд (10 раз) с помощью PowerShell?(Get-Counter '\Processor(_total)\% Processor Time' -SampleInterval 5 -MaxSamples 10).CounterSamples.CookedValue

Assemblies

Как загружать сборки библиотек с помощью PowerShell?

Add-Type -AssemblyName 'System.Windows.Forms' Add-Type -Path 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll' # Deprecated [System.Reflection.Assembly]::LoadFrom('C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll')

Add-Type -AssemblyName 'System.Windows.Forms'

 

Add-Type -Path 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll'

 

# Deprecated

[System.Reflection.Assembly]::LoadFrom('C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll')

Как проверить текущие сборки библиотек .NET, загруженные с помощью PowerShell?

# Check All [System.AppDomain]::CurrentDomain.GetAssemblies() # Check specific one [System.AppDomain]::CurrentDomain.GetAssemblies() | Where-Object -FilterScript { $_.FullName -like '*forms*' }

# Check All

[System.AppDomain]::CurrentDomain.GetAssemblies()

 

# Check specific one

[System.AppDomain]::CurrentDomain.GetAssemblies() | Where-Object -FilterScript { $_.FullName -like '*forms*' }

Как узнать расположение GAC (Global Assembly Cache) с помощью PowerShell?

(New-Object -TypeName Regex -ArgumentList '(?<=file:///)(.*)(?=\/GAC)', 'IgnoreCase').Match(([PSObject].Assembly.Evidence | Where-Object -FilterScript { $_.Value -ne $null }).Value).Value -replace '/', '\'

(New-Object -TypeName Regex -ArgumentList '(?<=file:///)(.*)(?=\/GAC)', 'IgnoreCase').Match(([PSObject].Assembly.Evidence | Where-Object -FilterScript { $_.Value -ne $null }).Value).Value -replace '/', '\'

Clipboard

Как скопировать результаты в буфер обмена с помощью PowerShell?

Как получить содержимое буфера обмена с помощью PowerShell?Add-Type -AssemblyName PresentationCore[Windows.Clipboard]::GetText()

Hotfixes

Как получить установленные обновления с помощью PowerShell?Get-HotFix -ComputerName $computer

Как узнать, какие обновления были установлены до определенной даты, а какие после неё, с помощью PowerShell?Get-HotFix | Where-Object -FilterScript { $_.InstalledOn -lt ([DateTime]'01/01/2015') } # Before 01/01/2015Get-HotFix | Where-Object -FilterScript {$_.InstalledOn -gt ([DateTime]'01/01/2015')} # After 01/01/2015

Как проверить, установлено ли обновление, с помощью PowerShell?Get-HotFix -Id KB2965142

Как узнать, какие обновления были установлены на удаленном компьютере, с помощью PowerShell?Get-HotFix -ComputerName $computer

Pagefile

Как получить информацию о файле подкачки с помощью PowerShell?Get-WmiObject -Class Win32_PageFileusage | Select-Object -Property Name, CurrentUsage, AllocatedBaseSize, PeakUsage, InstallDate

Как узнать рекомендуемый размер (МБ) для файла подкачки с помощью PowerShell?[Math]::Truncate(((Get-WmiObject -Class Win32_ComputerSystem).TotalPhysicalMemory) / 1MB) * 1.5

Как создать файл подкачки (4096 MB) на диске D: с помощью PowerShell?

Set-WmiInstance -Class Win32_PageFileSetting -Arguments @{ Name = 'D:\pagefile.sys' InitialSize = 4096 MaximumSize = 4096 }

Set-WmiInstance -Class Win32_PageFileSetting -Arguments @{

    Name        = 'D:\pagefile.sys'

    InitialSize = 4096

    MaximumSize = 4096

}

Как удалить файл подкачки на диске С: с помощью PowerShell?

$privileges = Get-WmiObject -Class Win32_computersystem -EnableAllPrivileges $privileges.AutomaticManagedPagefile = $false $privileges.Put() $pagefile = Get-WmiObject -Query "select * from Win32_PageFileSetting where name='c:\\pagefile.sys'" $pagefile.Delete() # Reboot required

$privileges = Get-WmiObject -Class Win32_computersystem -EnableAllPrivileges

$privileges.AutomaticManagedPagefile = $false

$privileges.Put()

$pagefile = Get-WmiObject -Query "select * from Win32_PageFileSetting where name='c:\\pagefile.sys'"

$pagefile.Delete() # Reboot required

Maintenance

Как проверить фрагментацию диска с помощью PowerShell?

$drive = Get-WmiObject -Class Win32_Volume -Filter "DriveLetter = 'c:'" $defragReport = $drive.DefragAnalysis() $defragReport.DefragAnalysis

$drive = Get-WmiObject -Class Win32_Volume -Filter "DriveLetter = 'c:'" $defragReport = $drive.DefragAnalysis() $defragReport.DefragAnalysis

Как проверить свободное дисковое пространство с помощью PowerShell?

Get-WmiObject -Class Win32_logicaldisk | Format-Table -Property @{ Name = 'Drive' Expression = {$_.DeviceID} }, @{ Name = 'Total size (GB)' Expression = {[decimal]('{0:N0}' -f($_.Size/1gb))} }, @{ Name = 'Free space(GB)' Expression = {[decimal]('{0:N0}'-f($_.Freespace/1gb))} }, @{ Name = 'Free (%)' Expression = {'{0,6:P0}' -f(($_.Freespace/1gb) / ($_.size/1gb))} } -AutoSize

Get-WmiObject -Class Win32_logicaldisk | Format-Table -Property @{

    Name       = 'Drive'

    Expression = {$_.DeviceID}

}, @{

    Name       = 'Total size (GB)'

    Expression = {[decimal]('{0:N0}' -f($_.Size/1gb))}

}, @{

    Name       = 'Free space(GB)'

    Expression = {[decimal]('{0:N0}'-f($_.Freespace/1gb))}

}, @{

    Name       = 'Free (%)'

    Expression = {'{0,6:P0}' -f(($_.Freespace/1gb) / ($_.size/1gb))}

} -AutoSize

Up

Files

Как открыть файл с помощью PowerShell?Invoke-Item -Path 'C:\scripts\file.txt'.'C:\scripts\file.txt'

Как прочитать файл с помощью PowerShell?Get-Content -Path 'C:\scripts\file.txt'gc "C:\scripts\file.txt" # Alias

Как перенаправить вывод в файл с помощью PowerShell?

'Line1', 'Line2', 'Line3' | Out-File -FilePath 'C:\scripts\file.txt' -Encoding ascii 'Line1', 'Line2', 'Line3' | Add-Content -Path file.txt 'Line1', 'Line2', 'Line3' > file.txt

'Line1', 'Line2', 'Line3' | Out-File -FilePath 'C:\scripts\file.txt' -Encoding ascii

'Line1', 'Line2', 'Line3' | Add-Content -Path file.txt

'Line1', 'Line2', 'Line3' > file.txt

Как узнать полное имя текущего файла скрипта с помощью PowerShell?$MyInvocation.MyCommand.Path

Как запаковать/zip файлы с помощью PowerShell?

### COMPRESS ONE FILE ### # Powershell v5 Compress-Archive -Path $fileSource -DestinationPath $fileDestination ### COMPRESS ONE FOLDER ### # Compress the folder 'R:\temp\zip\FolderToCompress' and created the file compressedFile.zip Add-Type -AssemblyName 'System.IO.Compression.Filesystem' [System.IO.Compression.ZipFile]::CreateFromDirectory($folderSource,$fileDestination) # Powershell v5 Compress-Archive -Path $folderSource -DestinationPath $fileDestination

### COMPRESS ONE FILE ###

 

# Powershell v5

Compress-Archive -Path $fileSource -DestinationPath $fileDestination

### COMPRESS ONE FOLDER ###

# Compress the folder 'R:\temp\zip\FolderToCompress' and created the file compressedFile.zip

Add-Type -AssemblyName 'System.IO.Compression.Filesystem'

[System.IO.Compression.ZipFile]::CreateFromDirectory($folderSource,$fileDestination)

# Powershell v5

Compress-Archive -Path $folderSource -DestinationPath $fileDestination

Как распаковать/unzip файлы с помощью PowerShell?

### UNCOMPRESS ONE FILE ### # Powershell v5 Expand-Archive -Path $fileSource -DestinationPath $folderDestination ### UNCOMPRESS ONE FOLDER ### # Compress the folder 'R:\temp\zip\FolderToCompress' and created the file compressedFile.zip Add-Type -AssemblyName 'System.IO.Compression.Filesystem' [System.IO.Compression.ZipFile]::ExtractToDirectory($fileSource, $folderDestination)

### UNCOMPRESS ONE FILE ###

 

# Powershell v5

Expand-Archive -Path $fileSource -DestinationPath $folderDestination

### UNCOMPRESS ONE FOLDER ###

# Compress the folder 'R:\temp\zip\FolderToCompress' and created the file compressedFile.zip

Add-Type -AssemblyName 'System.IO.Compression.Filesystem'

[System.IO.Compression.ZipFile]::ExtractToDirectory($fileSource, $folderDestination)

Как посмотреть файлы, упакованные в ZIP архив, с помощью PowerShell?Add-Type -AssemblyName 'System.IO.Compression.Filesystem'[System.IO.Compression.ZipFile]::OpenRead($fileZIP)

Как отобразить размер файла в КБ с помощью PowerShell?(Get-ChildItem -Path .\winsrv.dll).Length /1KB(Get-ChildItem -Path .\winsrv.dll).Length /1MB(Get-ChildItem -Path .\winsrv.dll).Length /1GB

Как найти файлы больше или меньше 1 ГБ с помощью PowerShell?

# Larger than 1 GB Get-ChildItem -Path C:\ -Recurse -ErrorVariable $errorsSearch | Where-Object -FilterScript {$_.Length -gt 1GB} # Less than 1 GB Get-ChildItem -Path C:\ -Recurse -ErrorVariable $errorsSearch | Where-Object -FilterScript {$_.Length -lt 1GB}

# Larger than 1 GB

Get-ChildItem -Path C:\ -Recurse -ErrorVariable $errorsSearch | Where-Object -FilterScript {$_.Length -gt 1GB}

 

# Less than 1 GB

Get-ChildItem -Path C:\ -Recurse -ErrorVariable $errorsSearch | Where-Object -FilterScript {$_.Length -lt 1GB}

Как отобразить имя файла без расширения с помощью PowerShell?[System.IO.Path]::GetFileNameWithoutExtension('C:\Windows\system32\calc.exe') # Return calc

Как отобразить расширение файла с помощью PowerShell?[System.IO.Path]::GetExtension('C:\scripts\file.txt') # Return .txt

Как узнать версию файла с помощью PowerShell?

(Get-Item -Path C:\Windows\System32\calc.exe).VersionInfo.FileVersion [System.Diagnostics.FileVersionInfo]::GetVersionInfo('C:\Windows\system32\calc.exe').FileVersion

(Get-Item -Path C:\Windows\System32\calc.exe).VersionInfo.FileVersion

[System.Diagnostics.FileVersionInfo]::GetVersionInfo('C:\Windows\system32\calc.exe').FileVersion

Как получить хэш файла с помощью PowerShell?(Get-FileHash $file).Hash

Как узнать контрольную сумму MD5/SHA1 файла с помощью PowerShell?Get-FileHash $file -Algorithm MD5Get-FileHash $file -Algorithm SHA1

Как отобразить скрытые файлы с помощью PowerShell?

# Display only hidden files Get-ChildItem -Hidden -File # Display all files (including hidden files) Get-ChildItem -Force -File

# Display only hidden files

Get-ChildItem -Hidden -File

 

# Display all files (including hidden files)

Get-ChildItem -Force -File

Как проверить, имеет ли файл расширение, с помощью PowerShell?

[System.IO.Path]::HasExtension('C:\hiberfil.sys')

[System.IO.Path]::HasExtension('C:\hiberfil.sys')

Как установить свойство файла “Только чтение” с помощью PowerShell?Set-ItemProperty -Path .\file.txt -Name IsReadOnly -Value $true

Как изменить значение атрибута “Изменен” на “На прошлой неделе” с помощью PowerShell?Set-ItemProperty -Path .\file.txt -Name LastWriteTime -Value ((Get-Date).AddDays(-7))If not working, use Nirsoft tool: BulkFileChanger.

Как создать новый файл с помощью PowerShell?New-Item -ItemType File -Path 'C:\scripts\file.txt' -Value 'FirstLine'

Как переименовать файл с помощью PowerShell?Rename-Item -Path 'C:\scripts\file.txt' -NewName 'C:\scripts\powershellguru2.txt'

Как использовать пакетное переименование нескольких файлов с помощью PowerShell?

powershell-guru.com

Windows PowerShell: Курс выживания при создании сценариев

Эта расширенная посвященная Windows PowerShell рубрика даст новый толчок к изучению данной мощной технологии.

Дон Джонс

Все больше людей привыкают к работе с Windows PowerShell и начинают осознавать преимущества этой технологии. В связи с этим этот выпуск рубрики будет длинным. Мы очень коротко пробежимся по базовым элементам Windows PowerShell, в том числе узнаем, как создавать параметризованные сценарии. В последующих выпусках я сосредоточусь на конкретных темах, базирующихся на материале, изложенном в сегодняшней статье.

Если вы не привыкли к выполнению команд Windows PowerShell в консоли, потому что это кажется вам слишком сложным, пусть это и тяжело, все равно попытайтесь освоить их. Надо иметь хорошее представление о функциях безопасности Windows PowerShell. Вы должны знать о политике выполнения и о том какие параметры вы используете. Если вы еще не знаете разницу между RemoteSigned и AllSigned, а также почему одна из этих политик может быть лучше другой, скорее всего вы не готовы к чтению нижеследующего материала.

Вы также должны знать, как выполнять сценарии в оболочке, а также помнить, что при выполнении сценария всегда нужно указывать путь и имя файла. Наконец, вы должны понимать, в чем разница при выполнении в среде ISE (Integrated Scripting Environment) и в консоли. В ISE сценарии выполняются в глобальном контексте. В обычной оболочке консоли у сценариев обычно собственный контекст. Я расскажу о контексте, но вы уже должны хотя бы примерно понимать, что он означает и что делает.

Если вам кажется, что вы недостаточно подготовлены, могу посоветовать почитать мою книгу «Learn Windows PowerShell in a Month of Lunches» (Manning Publications, 2011) и веб-сайт по теме, — возможно эти ресурсы помогут вам усвоить больше базовой информации.

Можете пользоваться этими ресурсами в процессе чтения статьи. Попытайтесь выполнить примеры. Если ввести (или скопировать) примеры сценариев в среду Windows PowerShell ISE, начиная со строки, тогда номера строк будут совпадать с номерами строк в описаниях.

Файлы сценариев Windows PowerShell

Файл сценария Windows PowerShell представляет собой простой текстовый файл с расширением .PS1. Единица указывает на версию не Windows PowerShell, а скорее версию обработчика языка. В Windows PowerShell версий 1 и 2 используется обработчик языка версии 1. Поэтому обе версии оболочки устанавливаются в подпапку v1.0 папки \Windows\System32\WindowsPowerShell.

Сценарий Windows PowerShell не совсем похож на командный файл для командной строки, кроме того выполнение сценария не совсем то же самое, что вводить вручную те же команды в той же последовательности. Например, откройте окно консоли и выполните следующее, нажимая Enter после каждой строки:

А теперь введите точно такие же команды в файл сценария или в панель редактирования сценариев в ISE и выполните сценарий. Результаты будут отличаться. При каждом нажатии Enter в Windows PowerShell вы запускаете новый конвейер. Все вводимые вами команды выполняются в одном конвейере. В конце существования конвейера Windows PowerShell преобразует его содержимое в текст на экране. При выполнении этих двух команд в обычной консоли это происходит в двух разных конвейерах.

Windows PowerShell смогла создать уникальные результаты работы для каждого набора выходных данных. С другой стороны, при запуске в составе сценария обе команды выполняются в одном конвейере. Система форматирования Windows PowerShell не настолько изощренна, чтобы создавать отдельные наборы выходных данных для двух результатов. Попытайтесь выполнить это в консоли:

Результаты будут такими же, как и при выполнении сценария с этими двумя командами. В данном случае обе команды выполняются в одном конвейере. Именно это происходит при выполнении сценария.

Практический вывод из всего может заключаться в том, что сценарий должен возвращать выходные данные только одного вида. Это плохая идея по причине ограничений системы форматирования. Есть также другие соображения. Не нужно, чтобы сценарий одновременно сбрасывал в конвейер разнородные данные.

Надо помнить об этом правиле на протяжении всего времени чтения этой статьи. Сценарий должен создавать один и только один тип выходных данных. Единственное исключение — когда сценарий используется как репозиторий нескольких функций. В этом случае каждая функция должна генерировать один и только один тип выходных данных.

Переменные

Переменные следует считать чем-то вроде ящика, в который можно положить одну или несколько вещей, даже разнородных. У ящика есть имя, и в Windows PowerShell это имя может содержать практически любые символы. Именем переменной может быть как «Var», так и «{my variable}». Во втором примере имя переменной заключено в фигурные скобки, потому что оно содержит пробелы; выглядит это не очень красиво. Рекомендую все-таки использовать в именах переменных только буквы, цифры и подчеркивания.

При использовании имени переменной ссылаются на сам «ящик». Если нужно сослаться на содержимое ящика, используйте знак доллара, например, так: $var. В Windows PowerShell вам часто будут встречаться переменные со знаком доллара, так как весь смысл в его использовании заключается в получении содержимого переменных. Вместе с тем, надо помнить, что знак доллара не является частью имени переменной. Это всего лишь подсказка для Windows PowerShell, что вам требуется содержимое, а не сам ящик. Вот несколько примеров:

$var = 'hello' $number = 1 $numbers = 1,2,3,4,5,6,7,8,9

В примерах показано, как назначать переменным значения с использованием оператора присвоения (=). В последнем примере создается массив, потому что Windows PowerShell интерпертирует разделенные запятыми списки как массивы, или наборы элементов. В первом примере присваивается объект, представляющий собой строку, а вся строка заключается в кавычки.

Есть одна особенность Windows PowerShell, которая может вводить в заблуждение новичков. Windows PowerShell не «понимает», какой смысл связывается с именем переменной. Имя $computername не «говорит» оболочке, что в переменной хранится имя компьютера.

Аналогично имя $numbers не говорит оболочке, что переменная будет содержать более одного числа. Оболочке также все равно, какое число вы используете, — единственное или множественное. Для оболочки следующее выражение:

…правильное и ничем не отличается от такого:

Вместе с тем, если переменная содержит несколько значений, для получения одного из них можно задействовать специальный синтаксис. Чтобы получить первый элемент, нужно использовать выражение $numbers[0], второй — $numbers[1], а последний элемент изображается так: $numbers[-1], предпоследний — $numbers[-2] и так далее.

Кавычки

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

Во-первых, это делают, когда нужно вставить содержимое переменной в строку. Только при наличии двойных кавычек Windows PowerShell будет искать знак «$» и предполагать, что все, что следует после этого знака и до первого символа, который не может быть частью имени переменной, является именем переменной. Вместо знака доллара с именем переменной будет вставлено ее содержимое.

$name = 'Don' $prompt = "My name is $name"

Переменная $prompt содержит строку «My name is Don», потому что $name заменяется содержимым этой переменной. Это замечательный прием — соединение строк вместо их конкатенации.

Также в тексте, ограниченном двойными кавычками, Windows PowerShell будет искать управляющий символ, или обратную одинарную кавычку, и действовать соответствующим образом. Вот несколько примеров:

$debug = "`$computer contains $computer" $head = "Column`tColumn`tColumn"

В первом примере первый знак доллара $ отменяется. Обратная кавычка отменяет его значение как аксессора переменной. Если переменная $computer содержит строку «SERVER», тогда в $debug будет содержаться такая строка: «$computer contains SERVER».

Во втором примере «`t» представляет собой символ табуляции, поэтому Windows PowerShell разместит между словами Column знаки табуляции. Подробнее об управляющих символах см. веб-страницу.

Наконец, двойные кавычки используются, когда строка должна содержать одинарные кавычки:

$filter1 = "name='BITS'" $computer = 'BITS' $filter2 = "name='$computer'"

В этом примере создается строка «name='BITS'». Все необходимое заключается в двойные кавычки. В $filter1 и $filter2 содержится одно и то же, но в $filter2 значение задается с использованием уловкой с заменой переменной в двойных кавычках. Заметьте, что значение имеет только самая «внешняя» пара кавычек. Одинарные кавычки оболочку Windows PowerShell не интересуют. Эти одинарные кавычки представляют собой простые литеральные символы. Windows PowerShell их не интерпретирует.

Члены и переменные объектов

В Windows PowerShell все состоит из объектов. Даже простая строка, такая как «name», является объектом типа System.String. Чтобы узнать тип объекта (то есть, что представляет собой объект), а также его членов, к которым относятся его свойства и методы, достаточно передать объект в Get-Member по конвейеру:

$var = 'Hello' $var | Get-Member

Используйте точку после имени переменной, чтобы сказать оболочке: «Мне не нужен доступ ко всему объекту в переменной, а только к одному из его свойств или методов». После точки укажите нужное свойство или имя метода.

После имен методов всегда следует пара скобок. Некоторые методы принимают аргументы, которые указываются в скобках, отделенные запятыми. Другим методам аргументы не нужны, поэтому скобки пустые, но они обязательно должны быть:

$svc = Get-Service $svc[0].name $name = $svc[1].name $name.length $name.ToUpper()

Обратите внимание на вторую строчку. Она начинается с обращения к первому элементу переменной $svc. Точка означает, что нам не нужен весь объект, а только его свойство или метод. В данном случае нужно свойство name. В пятой строке показано, как обращаться к методу, указывая его имя после точки, а также пару скобок.

Обычно точка в именах переменных не используется, так как она отделяет свойство или метод.  Это означает, что вторая строка в следующем примере будет делать не то, что ожидалось:

$service = 'bits' $name = "Service is $service.ToUpper()" $upper = $name.ToUpper() $name = "Service is $upper"

На второй строке $name содержит«Service is BITS.ToUpper()», а в четвертой строке — «Service is BITS».

Скобки

Помимо указания на методы объектов, скобки также служат в Windows PowerShell маркерами, определяющими порядок выполнения, — как в обычных алгебраических выражениях. Иначе говоря, скобки указывают оболочке, что нужно выполнять в первую очередь. Выражение в скобках заменяется тем, что получается в результате вычисления этого выражения. Вот несколько задачек на сообразительность:

$name = (Get-Service)[0].name Get-Service -computerName (Get-Content names.txt)

В первой строке $name содержит имя первой службы в системе. Чтобы понять этот пример, придется немного напрячь мозги. Начнем с выражения в скобках. Windows PowerShell начнет анализ именно с этого места. Get-Service разрешается в набор, или массив, служб. Выражение [0] позволяет получить первый элемент массива, которым будет первая служба. Так как за этим следует точка, мы знаем, что идет обращение к свойству или методу этой службы, а не ко всему объекту. Наконец мы извлекаем только имя службы.

Во второй строке выражение в скобках читает содержимое текстового файла. Если файл содержит имена компьютеров — по одному в строке, Get-Content вернет массив имен компьютеров. Они передаются в параметр –computerName командлета Get-Service. В данном случае оболочка передаст результат любого выражения в скобках, возвращающего массив строк, в параметр –computerName, потому что последний создан принимать массивы строк.

Область действия

Область действия — это понятие в программировании, служащее в качестве системы «контейнеризации». Такие вещи как переменные, псевдонимы, диски и другие элементы Windows PowerShell, все хранятся в области действия. Оболочка поддерживает иерархию областей действия и определяет ряд правил, определяющих порядок взаимодействия и обмена информацией между областями действия.

Сама оболочка является одной областью действия, которая называется глобальной областью действия. При выполнении сценария он создает новую область действия и выполняется в ней. Все созданное сценарием, например новые переменные, размещаются в области действия сценария. Он недоступен из оболочки верхнего уровня.

По окончании работы сценария его область действия отбрасывается, а все созданное в ней исчезает. Например, создайте следующий сценарий и выполните его в окне консоли:

New-PSDrive -PSProvider FileSystem -Root C:\ -Name Sys Dir SYS:

После выполнения сценария вручную выполните команду Dir SYS:. Вы получите ошибку. Причина в том, что диск SYS: был создан в сценарии. По окончании работы сценария все им созданное было уничтожено. Диск SYS: больше не существует. Не все в оболочке работает в собственном диапазоне. Такие элементы, как модули всегда обрабатываются глобально. Модуль, загруженный сценарием, остается таковым по окончании работы сценария.

Если в области действия предпринимается попытка обратиться к чему-то, что не было создано в ней, Windows PowerShell обращается к следующей области действия более высокого уровня («родительской»). Вот почему псевдоним Dir сработал в созданном вами сценарии. Хотя Dir не существовал в области действия сценария, он существовал в области действия более высокого уровня — в глобальной области действия. В области действия можно создавать элементы с именами, которые существуют в области более высокого уровня. Вот еще один сценарий для выполнения:

Dir New-Alias Dir Get-Alias Dir

Это кажется странным, но при первом выполнении Dir каталог не существовал в области действия сценария. Был использован псевдоним Dir более высокого уровня. Этот псевдоним указывает на Get-ChildItem, поэтому было показано знакомое содержимое каталога.

Затем сценарий создал новый псевдоним по имени Dir, который уже указывает на Get-Alias. Именно эта команда выполнялась во втором случае. Все это никак не повлияло на псевдоним Dir верхнего уровня. Попытайтесь выполнить Dir в оболочке после запуска предыдущего сценария и вы снова получите список содержимого каталога.

В областях действия особенно легко запутаться, когда речь идет о переменных. Как правило, из определенной области действия никогда не следует обращаться к элементам за ее пределами, особенно к переменным. Есть синтаксис для выполнения таких операций, например можно использовать $global:var для принудительного обращения к переменной $var глобальной области действия, но это очень плохой способ, применение которого допустимо только в очень специфических обстоятельствах.

Язык сценариев Windows PowerShell

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

Несмотря на свою простоту, язык Windows PowerShell более чем эффективен для своих задач. Сейчас я расскажу об основных сценарных конструкциях, но вы всегда можете получить более подробные сведения, обратившись к соответствующей about-статье в оболочке. Например, help about_switch содержит информацию о конструкции Switch, а help about_if —о конструкции If. Чтобы получить список всех about-статей, выполните команду help about*.

Конструкция If

Это основная конструкция Windows PowerShell для принятия решений. Полная ее форма выглядит так:

If ($this -eq $that) { # commands } elseif ($those -ne $them) { # commands } elseif ($we -gt $they) { # commands } else { # commands }

Ключевое слово «If» является обязательной частью конструкции. Результат вычисления следующего за ним выражения должен быть True или False. Windows PowerShell всегда интерпретирует ноль как False, а любое ненулевое значение как True.

Windows PowerShell также различает встроенные переменные $True и $False, которые представляют указанные булевы значения. Если выражение в скобках равно True, тогда выполняются команды в следующих далее фигурных скобках. Если выражение равно False, эти команды не выполняются. Это минимально необходимый состав конструкции If.

Можно пойти чуть дальше, задав один или больше разделов ElseIf. Они работают так же, как и конструкция If. У них есть собственное выражение в скобках. Если оно равно True, выполняются команды в следующих за выражением фигурных скобках. В противном случае команды не выполняются.

Завершить конструкцию можно блоком Else, который выполняется, если не выполнился ни один из предыдущих блоков команд.  Выполнится только первый блок команд, для которого выражение в скобках равно True. Например, если $this не равно $that, а $those не равно $them, тогда будут выполнены только команды в четвертой строке. Windows PowerShell даже не станет вычислять выражение для elseif в пятой строке.

Символ «решетка» (#) служит для выделения комментариев, то есть Windows PowerShell игнорирует весь текст от этого символа до следующего возврата каретки. Также обратите внимание на аккуратное форматирование описанных конструкций. Некоторые форматируют текст так:

if ($those -eq $these) { #commands }

Неважно, где разместить фигурные скобки. Но важно при этом придерживаться одного стиля форматирования, чтобы сценарии было легко читать. Также важно делать отступы до нужного уровня каждую строку в фигурных скобках.

В среде Windows PowerShell ISE для этой цели можно использовать клавишу Tab, при нажатии которой по умолчанию делается отступ размеров в четыре пробела. Отступы в коде — это базовое требование к написанию кода. Если этого не делать, в объемных сценариях будет очень сложно не ошибиться при расстановке фигурных скобок. Ну и не стоить говорить, что даже новички Windows PowerShell будут насмехаться над вашим текстом без отступов. Посмотрите на этот плохо форматированный сценарий:

function mine { if ($this -eq $that){ get-service }}

Его намного сложнее читать, отлаживать, устранять неполадки и поддерживать. Хотя пробелы после закрывающей скобки не нужны, они делают сценарий проще для чтения. Отступы в коде не являются необходимыми, но при их наличии код намного легче понимать. Посмотрите на тот же код в другом виде:

function mine { if ($this -eq $that){ get-service } }

Оболочка не требует, чтобы закрывающие фигурные скобки размещались на отдельных строках, но для восприятия человеком такой формат намного удобнее. Аккуратно соблюдая форматирование, вы избавитесь от многих проблем при работе со сценариями.

Конструкция Do While

Это конструкция цикла в Windows PowerShell. Она служит для многократного выполнения блока команд, пока условие равно True или не станет True. Вот самый простой случай:

Do { # commands } While ($this -eq $that)

В этом варианте конструкции команды в фигурных скобках выполнятся по крайней мере один раз. Условие While вычисляется не ранее, чем первый раз выполнится блок команд. Можно перенести While — тогда команды будут выполнены, только если с самого начала условие равно True:

While (Test-Path $path) { # commands }

Заметьте, что во втором примере не используется оператор сравнения, например -eq. Причина в том, что командлет Test-Path по определению возвращает True или False, поэтому для нормальной работы выражения эти значения не нужно ни с чем сравнивать.

Выражение в скобках в этой конструкции вырождается до простого значения True или False. Именно это происходит, когда вы используете команду, которая всегда возвращает True или False, например Test-Path. Как всегда, есть соответствующая about-статья, где можно найти другие примеры использования этой конструкции.

Конструкция ForEach

Работа этой конструкции похожа на поведение командлета ForEach-Object. Различия только в синтаксисе. Задача ForEach — принять массив (или набор, что в Windows PowerShell равносильно массиву) и выполнить его перечисление, чтобы можно было каждый раз работать с одним объектом:

$services = Get-Service ForEach ($service in $services) { $service.Stop() }

Новички могут очень легко запутаться с этой конструкцией. Помните, что множественное число слова «services» в английском для Windows PowerShell ничего не значит. Переменная называется именно так, чтобы напоминать, что содержит одни или несколько служб. Если это множественное число, то это не значит, что оболочка будет как-то особо его обрабатывать.

Ключевое слово «in» во второй строке является частью синтаксиса ForEach. Имя $service — это просто произвольное имя переменной. С таким же успехом в этом месте могло быть им $fred или $coffee.

Windows PowerShell будет повторно выполнять команды в фигурных скобках по отношению к каждому очередному объекту во второй переменной ($services). Каждый раз оболочка будет принимать один объект из второй переменной ($services) и помещать его в первую переменную ($service).

В конструкции первую переменную ($service) нужно использовать как содержащую единичный объект. В третьей строке точка означает, что нужен не весь объект, а только один из его членов — метод Stop.

Иногда бывает так, что использование ForEach желательно и даже неизбежно. Однако если у вас уже есть опыт программирования, вы можете прибегать к ForEach, когда этого лучше не делать. В предыдущем примере лучше не использовать ForEach. Разве не проще сделать так:

Get-Service | Stop-Service

Вся суть в том, чтобы продумать, нужна ли вообще конструкция ForEach. Надо быть уверенным, что это единственный способ выполнения задачи. Вот несколько ситуаций, в которых без ForEach скорее всего не обойтись:

  • Когда нужно выполнить метод по отношению к набору объектов и нет командлета, который бы мог выполнить эту задачу.
  • Если есть набор объектов и по отношению к каждому нужно выполнить ряд последовательных операций.
  • Когда операцию нужно выполнять только по отношению к одному объекту за раз, но в процессе выполнения сценария количество объектов — один или несколько — заранее неизвестно.

Другие конструкции

В Windows PowerShell есть ряд других конструкций, в том числе Switch, For и другие. Они описаны в about-статьях оболочки. Иногда их можно заменять уже описанными конструкциями. Например, можно заменить Switch конструкцией If с несколькими разделами ElseIf. For можно заменить ForEach или даже командлетом ForEach-Object. Вот пример цикла, который выполняется ровно десять раз:

1..10 | ForEach-Object -process { # code here will repeat 10 times # use $_ to access the current iteration # number }

Вы сами должны решать, какая конструкция лучше подойдет в той или иной ситуации. Если будете искать сценарии в Интернете, будьте готовы к любым вариантам.

Функции

Функция — это особый вид конструкции, служащий для объединения группы взаимосвязанных команд для выполнения одной четко определенной задачи. Вообще говоря, можно взять любой сценарий Windows PowerShell и «обернуть» его в функцию:

function Mine { Get-Service Get-Process } Mine

Здесь определена новая функция по имени Mine. Это, в сущности, превращает Mine в команду, так как запустить функцию можно, просто указав ее имя. Именно это и происходит в пятой строке.

Функции обычно располагают в файлах сценариев. Один сценарий может содержать несколько функций. А функции могут содержать в себе другие функции.

Однако в функциях действуют области действия. Это означает, что использовать функцию можно только в той же области действия, в которой она создана. Функция, размещенная в сценарии, доступна только в этом сценарии и только во время его выполнения. По завершении работы сценария функция (как и все остальное в области действия сценария) уничтожается. Вот пример:

function One { function Two { Dir } Two } One Two

Представьте, что вы разместили этот текст в файле сценария и выполнили его. В седьмой строке выполняется функция One, определение которой начинается на первой строке. В пятой строке выполняется функция Two, определение которой начинается на пятой строке. Поэтому в результате получим список содержимого каталога — соответствующая команда размещена на третьей строке в функции Two.

Но следующая выполняемая строка (номер восемь) приведет к ошибке. В сценарии нет функции по имени Two. Функция Two спрятана в функции One. Поэтому функция Two существует только в области действия функции One и видна только из последней. Попытка вызвать Two из любого другого места приведет к ошибке.

Параметры в сценарии

Редко сценарии создаются для выполнения в точности одной и той же задачи при каждом запуске. Чаще сценарии содержат изменяемые данные или их поведение может меняться в зависимости от входных данных. Эти вариации можно реализовать с помощью параметров.

Параметры определяются особым образом вначале сценария. Можно предварить это определение комментарием, но в любом случае это должна быть первая исполняемая строка сценария. В области определения параметров каждый из них отделяется запятой. Для удобства чтения каждый параметр рекомендуется располагать в собственной строке. Вот пример:

param ( [string]$computername, [string]$logfile, [int]$attemptcount = 5 )

Здесь определяются три параметра. В сценарии они используются как любые другие переменные. Вы наверняка заметили, что в пятой строке я присвоил параметру $attemptcount значение по умолчанию. Это значение будет заменено значением входного параметра, но если он не будет задан, сценарий будет выполняться со значением по умолчанию.

Вот несколько способов запуска сценария (предполагается, что сценарий содержится в файле Test.ps1):

./test -computername SERVER ./test -comp SERVER -log err.txt -attempt 2 ./test SERVER err.txt 2 ./test SERVER 2 ./test -log err.txt -attempt 2 -comp SERVER

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

  • В первой строке я задал только один из параметров, поэтому $logfile будет пустым, а $attemptcount будет содержать 5, значение по умолчанию.
  • Во второй строке я задал все три параметра, но при этом использовал сокращенные имена. Как и в командлетах, достаточно задать только начало имени параметра, которого достаточно для того, чтобы оболочка Windows PowerShell «поняла», о чем идет речь.
  • В третьей строке снова заданы все три параметра, но теперь они заданы по позициям, без использования имен параметров. Насколько я помню, если параметры задавать точно в том порядке, в каком они определены в сценарии, все работает нормально.
  • В четвертой строке показано, что происходит, если не соблюдать осторожность. Здесь $computername получит значение «SERVER», $logfile будет содержать 2, а $attemptcount — 5. Это не совсем то, что мне было нужно. Если не использовать имена параметров, теряется гибкость. Также посторонним людям становится сложнее понять, что вы имели в виду, а это в свою очередь усложняет устранение возможных неполадок.
  • В пятой строке приведен лучший пример. Здесь я указал параметры не в том порядке, в котором они определены, но это не страшно, потому что я указал их имена. В общем случае рекомендуется использовать имена параметров — это дает дополнительную гибкость. Вам не нужно будет помнить порядок, в котором они определены.

Более сложные сценарии

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

При этом механизм использования параметров в сценарии не меняется. Просто оболочке предоставляется чуть больше информации о параметрах. Этот прием чаще всего используется в функциях, но в сценариях этот синтаксис также допустим. Вот простой пример:

[CmdletBinding()] param ( [Parameter(Mandatory=$True)] [string]$computername, [Parameter(Mandatory=$True)] [string]$logfile, [int]$attemptcount = 5 )

Я добавил всего лишь инструкцию [CmdletBinding()] в первой исполняемой строке кода в сценарии. Перед этой строкой не разрешается ничего размещать кроме комментариев. Я также присоединил к своим двум параметрам инструкцию [Parameter()], где указал, что они обязательны. Теперь если кто-то попытается выполнить сценарий, не задав эти параметры, Windows PowerShell предложит ввести эту информацию.

Обратите внимание, что у последнего параметра нет никаких дополнительных инструкций, а все три параметра представляют собой разделенный запятыми список (то есть после первых двух параметров стоят запятые). ). Есть масса другой информации, которую можно задать для параметра и которая доступна в статье.

Это было очень быстрое введение по теме создания сценариев в Windows PowerShell. Я надеюсь, что из этой статьи вы почерпнули что-то полезное. Создание параметризованных сценариев — особенно полезная функциональность, потому что позволяет создавать сценарии, которые выглядят и ведут себя так же, как и настоящие командлеты Windows PowerShell.

Дон Джонс (Don Jones) носит звание MVP и является автором «Learn Windows PowerShell in a Month of Lunches» (Manning Publications Co., 2011),  книги, призванной помочь каждому администратору освоить Windows PowerShell. Дон читает общедоступные и интерактивные курсы по Windows PowerShell. Связаться с ним можно через его веб-сайт ConcentratedTech.com.

technet.microsoft.com