Командлеты Azure Active Directory версии 2 для управления группамиAzure Active Directory version 2 cmdlets for group management. Примеры powershell


Powershell примеры. Примеры PowerShell скриптов для Windows. Разрешение общего доступа к папке с помощью Windows Powershell

Командлеты PowerShell для вывода данных

Обычно в процессе работы PowerShell генерируются некоторые выходные данные. Для вывода этих данных существуют специальные Out-командлеты (командлеты, название которых начинается с Out-). Когда выполняемая команда PowerShell возвращает данные, они передаются по конвейеру на вход Out-командлета, который обрабатывает их и отправляет в устройство вывода (на экран, в файл, на принтер и т.п.).

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

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

Для просмотра этих командлетов выполним команду:

Get-Command -Verb Out

Out-Host

Командлет Out-Host служит для вывода данных на экран. Например:

Get-Process powershell | Out-Host

Впрочем, добавлять Out-Host в конец команды совсем необязательно. В конце конвейера по умолчанию находится командлет Out-Default, который и перенаправляет все в Out-Host. Т.е. предыдущая команда эквивалентна команде:

Тестовый опрос компьютера с помощью PowerShell

Это отличная подсказка для объединения строк без необходимости их конкатенации. Наконец, используйте двойные кавычки, когда строка должна содержать одинарные кавычки. Двойные кавычки содержат весь контент. Обратите внимание, что только самый внешний набор котировок, по сути, важен. Одиночные кавычки являются буквальными символами. Даже простая строка, такая как «имя», является объектом типа «Система». Используйте период после имени переменной, чтобы сообщить оболочке: Я не хочу получать доступ ко всему объекту внутри этой переменной.

Get-Process powershell | Out-Default

которая в свою очередь эквивалентна команде:

Get-Process powershell

На самом деле механизм вывода еще запутаннее. Как вы помните, результатом работы PowerShell являются объекты. Out-командлеты не умеют работать с любыми объектами, а только со специальным типом объектов форматирования, поэтому при получении объекта вызывают один из командлетов форматирования (Format-*). Format-командлет предоставляет Out-командлету объекты форматирования, описывающие порядок построения выходных данных, а Out-командлет отправляет их в нужное устройство. Т.е. при выполнении команды:

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

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

Get-Process powershell

в действительности отрабатывает команда:

Get-Process powershell | Format-Table | Out-Host

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

Полезные командлеты Windows PowerShell

Другими словами, скобки указывают оболочке «запускать эту первую». Все выражение в круглых скобках заменяется на все вырабатываемое из этого выражения выражение. Вот несколько примеров разума. Чтение этой статьи требует немного усилий. Начните с выражения в круглых скобках. А доступ к первому элементу массива является первой службой. Поскольку за ним следует период, мы знаем, что мы обращаемся к методу свойств или услуг, а не к объекту всей службы.

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

Get-Process | Out-Host -Paging

Командлет Out-File перенаправляет выходные данные в указанный файл, например:

Get-Process powershell | Out-File proc.txt

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

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

Когда скрипт заканчивает выполнение, его область отбрасывается и ничто не создается в

crabo.ru

Примеры PowerShell для управления группами в Azure Active Directory

  • 06/07/2018
  • Время чтения: 10 мин
  • Соавторы

В этой статье

В этой статье приведены примеры управления группами в Azure Active Directory (Azure AD) с помощью PowerShell.This article contains examples of how to use PowerShell to manage your groups in Azure Active Directory (Azure AD). Кроме того, в ней содержатся сведения о том, как выполнить настройки модуля Azure AD PowerShell.It also tells you how to get set up with the Azure AD PowerShell module. Во-первых, необходимо скачать модуль Azure AD PowerShell.First, you must download the Azure AD PowerShell module.

Установка модуля Azure AD PowerShellInstall the Azure AD PowerShell module

Чтобы установить модуль Azure AD PowerShell, выполните следующие команды:To install the Azure AD PowerShell module, use the following commands:

PS C:\Windows\system32> install-module azuread PS C:\Windows\system32> import-module azuread

Чтобы проверить, готов ли модуль к использованию, выполните следующую команду:To verify that the module is ready to use, use the following command:

PS C:\Windows\system32> get-module azuread ModuleType Version Name ExportedCommands ---------- --------- ---- ---------------- Binary 2.0.0.115 azuread {Add-AzureADAdministrati...}

Теперь можно начать использование командлетов в модуле.Now you can start using the cmdlets in the module. Полное описание командлетов в модуле Azure AD см. в электронной справочной документации по PowerShell версии 2 для Azure Active Directory.For a full description of the cmdlets in the Azure AD module, please refer to the online reference documentation for Azure Active Directory PowerShell Version 2.

Подключение к каталогуConnect to the directory

Прежде чем приступить к управлению группами с помощью командлетов Azure AD PowerShell, необходимо подключить сеанс PowerShell к каталогу, которым вы хотите управлять.Before you can start managing groups using Azure AD PowerShell cmdlets, you must connect your PowerShell session to the directory you want to manage. Используйте следующую команду:Use the following command:

PS C:\Windows\system32> Connect-AzureAD

Командлет запросит ввести учетные данные, которые вы хотите использовать для доступа к каталогу.The cmdlet prompts you for the credentials you want to use to access your directory. В этом примере для доступа к демонстрационному каталогу используется [email protected] .In this example, we are using [email protected] to access the demonstration directory. Командлет возвращает подтверждение, показывающее, что сеанс был успешно подключен к каталогу:The cmdlet returns a confirmation to show the session was connected successfully to your directory:

Account Environment Tenant ------- ----------- ------ [email protected] AzureCloud 85b5ff1e-0402-400c-9e3c-0f…

Теперь можно начать использование командлетов Azure AD для управления группами в каталоге.Now you can start using the AzureAD cmdlets to manage groups in your directory.

Получение сведений о группахRetrieve groups

Чтобы получить сведения о существующих группах из каталога, используйте командлет Get-AzureADGroups.To retrieve existing groups from your directory, use the Get-AzureADGroups cmdlet.

Чтобы получить сведения о всех группах в каталоге, используйте командлет без параметров:To retrieve all groups in the directory, use the cmdlet without parameters:

PS C:\Windows\system32> get-azureadgroup

Командлет возвращает сведения о всех группах в подключенном каталоге.The cmdlet returns all groups in the connected directory.

Для получения сведений о конкретной группе, для которой указывается идентификатор объекта, можно использовать параметр -objectID:You can use the -objectID parameter to retrieve a specific group for which you specify the group’s objectID:

PS C:\Windows\system32> get-azureadgroup -ObjectId e29bae11-4ac0-450c-bc37-6dae8f3da61b

Командлет возвращает сведения о группе, идентификатор objectID которой совпадает со значением введенного параметра:The cmdlet now returns the group whose objectID matches the value of the parameter you entered:

DeletionTimeStamp : ObjectId : e29bae11-4ac0-450c-bc37-6dae8f3da61b ObjectType : Group Description : DirSyncEnabled : DisplayName : Pacific NW Support LastDirSyncTime : Mail : MailEnabled : False MailNickName : 9bb4139b-60a1-434a-8c0d-7c1f8eee2df9 OnPremisesSecurityIdentifier : ProvisioningErrors : {} ProxyAddresses : {} SecurityEnabled : True

Для поиска конкретной группы можно использовать параметр -filter.You can search for a specific group using the -filter parameter. Этот параметр принимает предложение фильтра ODATA и возвращает сведения о всех группах, соответствующих фильтру, как показано в следующем примере:This parameter takes an ODATA filter clause and returns all groups that match the filter, as in the following example:

PS C:\Windows\system32> Get-AzureADGroup -Filter "DisplayName eq 'Intune Administrators'" DeletionTimeStamp : ObjectId : 31f1ff6c-d48c-4f8a-b2e1-abca7fd399df ObjectType : Group Description : Intune Administrators DirSyncEnabled : DisplayName : Intune Administrators LastDirSyncTime : Mail : MailEnabled : False MailNickName : 4dd067a0-6515-4f23-968a-cc2ffc2eff5c OnPremisesSecurityIdentifier : ProvisioningErrors : {} ProxyAddresses : {} SecurityEnabled : True

Примечание

Командлеты Azure AD PowerShell используют стандарт запросов OData. Дополнительные сведения см. в разделе $filter статьи OData system query options using the OData endpoint (Параметры системных запросов OData с использованием конечной точки OData).

Создание группCreate groups

Чтобы создать новую группу в каталоге, используйте командлет New-AzureADGroup.To create a new group in your directory, use the New-AzureADGroup cmdlet. Этот командлет создает новую группу безопасности с именем Marketing:This cmdlet creates a new security group called “Marketing":

PS C:\Windows\system32> New-AzureADGroup -Description "Marketing" -DisplayName "Marketing" -MailEnabled $false -SecurityEnabled $true -MailNickName "Marketing"

Обновление группUpdate groups

Чтобы обновить существующую группу, используйте командлет Set-AzureADGroup.To update an existing group, use the Set-AzureADGroup cmdlet. В этом примере изменяется свойство DisplayName группы Intune Administrators.In this example, we’re changing the DisplayName property of the group “Intune Administrators.” Сначала с помощью командлета Get-AzureADGroup мы находим группу и фильтруем, используя атрибут DisplayName:First, we’re finding the group using the Get-AzureADGroup cmdlet and filter using the DisplayName attribute:

PS C:\Windows\system32> Get-AzureADGroup -Filter "DisplayName eq 'Intune Administrators'" DeletionTimeStamp : ObjectId : 31f1ff6c-d48c-4f8a-b2e1-abca7fd399df ObjectType : Group Description : Intune Administrators DirSyncEnabled : DisplayName : Intune Administrators LastDirSyncTime : Mail : MailEnabled : False MailNickName : 4dd067a0-6515-4f23-968a-cc2ffc2eff5c OnPremisesSecurityIdentifier : ProvisioningErrors : {} ProxyAddresses : {} SecurityEnabled : True

Затем мы меняем свойство Description на новое значение — Intune Device Administrators:Next, we’re changing the Description property to the new value “Intune Device Administrators”:

PS C:\Windows\system32> Set-AzureADGroup -ObjectId 31f1ff6c-d48c-4f8a-b2e1-abca7fd399df -Description "Intune Device Administrators"

Если теперь снова выполнить поиск группы, то мы увидим, что свойство Description обновилось и отражает новое значение:Now if we find the group again, we see the Description property is updated to reflect the new value:

PS C:\Windows\system32> Get-AzureADGroup -Filter "DisplayName eq 'Intune Administrators'" DeletionTimeStamp : ObjectId : 31f1ff6c-d48c-4f8a-b2e1-abca7fd399df ObjectType : Group Description : Intune Device Administrators DirSyncEnabled : DisplayName : Intune Administrators LastDirSyncTime : Mail : MailEnabled : False MailNickName : 4dd067a0-6515-4f23-968a-cc2ffc2eff5c OnPremisesSecurityIdentifier : ProvisioningErrors : {} ProxyAddresses : {} SecurityEnabled : True

Удаление группDelete groups

Для удаления групп из каталога используйте командлет Remove-AzureADGroup, как показано ниже:To delete groups from your directory, use the Remove-AzureADGroup cmdlet as follows:

PS C:\Windows\system32> Remove-AzureADGroup -ObjectId b11ca53e-07cc-455d-9a89-1fe3ab24566b

Управление членством в группахManage group membership

Добавление членовAdd members

Чтобы добавить в группу новых членов, используйте командлет Add-AzureADGroupMember.To add new members to a group, use the Add-AzureADGroupMember cmdlet. Эта команда добавляет члена в группу Intune Administrators, которую мы использовали в предыдущем примере:This command adds a member to the Intune Administrators group we used in the previous example:

PS C:\Windows\system32> Add-AzureADGroupMember -ObjectId 31f1ff6c-d48c-4f8a-b2e1-abca7fd399df -RefObjectId 72cd4bbd-2594-40a2-935c-016f3cfeeeea

Параметр -ObjectId — это идентификатор объекта группы, в которую требуется добавить члена, а -RefObjectId — это идентификатор объекта пользователя, которого требуется добавить в качестве члена группы.The -ObjectId parameter is the ObjectID of the group to which we want to add a member, and the -RefObjectId is the ObjectID of the user we want to add as a member to the group.

Получение сведений о членахGet members

Чтобы получить сведения о существующих членах группы, используйте командлет Get-AzureADGroupMember, как показано в этом примере:To get the existing members of a group, use the Get-AzureADGroupMember cmdlet, as in this example:

PS C:\Windows\system32> Get-AzureADGroupMember -ObjectId 31f1ff6c-d48c-4f8a-b2e1-abca7fd399df DeletionTimeStamp ObjectId ObjectType ----------------- -------- ---------- 72cd4bbd-2594-40a2-935c-016f3cfeeeea User 8120cc36-64b4-4080-a9e8-23aa98e8b34f User

Удаление членовRemove members

Чтобы удалить члена, ранее добавленного в группу, используйте командлет Remove-AzureADGroupMember, как показано здесь:To remove the member we previously added to the group, use the Remove-AzureADGroupMember cmdlet, as is shown here:

PS C:\Windows\system32> Remove-AzureADGroupMember -ObjectId 31f1ff6c-d48c-4f8a-b2e1-abca7fd399df -MemberId 72cd4bbd-2594-40a2-935c-016f3cfeeeea

Проверка членстваVerify members

Чтобы проверить, является ли пользователь членом какой-либо группы, используйте командлет Select-AzureADGroupIdsUserIsMemberOf.To verify the group memberships of a user, use the Select-AzureADGroupIdsUserIsMemberOf cmdlet. В качестве параметров этот командлет принимает идентификатор объекта пользователя, для которого выполняется проверка членства в группах, и список групп, в которых проверяется членство.This cmdlet takes as its parameters the ObjectId of the user for which to check the group memberships, and a list of groups for which to check the memberships. Список групп необходимо указать в форме сложной переменной типа Microsoft.Open.AzureAD.Model.GroupIdsForMembershipCheck, поэтому сначала необходимо создать переменную с этим типом:The list of groups must be provided in the form of a complex variable of type “Microsoft.Open.AzureAD.Model.GroupIdsForMembershipCheck”, so we first must create a variable with that type:

PS C:\Windows\system32> $g = new-object Microsoft.Open.AzureAD.Model.GroupIdsForMembershipCheck

Затем необходимо указать значения идентификаторов группы для регистрации атрибута GroupIds этой сложной переменной:Next, we provide values for the groupIds to check in the attribute “GroupIds” of this complex variable:

PS C:\Windows\system32> $g.GroupIds = "b11ca53e-07cc-455d-9a89-1fe3ab24566b", "31f1ff6c-d48c-4f8a-b2e1-abca7fd399df"

Теперь, если требуется проверить членство пользователя с идентификатором объекта 72cd4bbd-2594-40a2-935c-016f3cfeeeea в группах в $g, используйте следующую команду:Now, if we want to check the group memberships of a user with ObjectID 72cd4bbd-2594-40a2-935c-016f3cfeeeea against the groups in $g, we should use:

PS C:\Windows\system32> Select-AzureADGroupIdsUserIsMemberOf -ObjectId 72cd4bbd-2594-40a2-935c-016f3cfeeeea -GroupIdsForMembershipCheck $g OdataMetadata Value ------------- ----- https://graph.windows.net/85b5ff1e-0402-400c-9e3c-0f9e965325d1/$metadata#Collection(Edm.String) {31f1ff6c-d48c-4f8a-b2e1-abca7fd399df}

Возвращаемое значение — это список групп, членом которых является данный пользователь.The value returned is a list of groups of which this user is a member. Этот метод также можно применять для проверки членства в контактах, группах или субъектах-службах для определенного списка групп. Для этого используйте командлеты Select-AzureADGroupIdsContactIsMemberOf, Select-AzureADGroupIdsGroupIsMemberOf и Select-AzureADGroupIdsServicePrincipalIsMemberOf.You can also apply this method to check Contacts, Groups or Service Principals membership for a given list of groups, using Select-AzureADGroupIdsContactIsMemberOf, Select-AzureADGroupIdsGroupIsMemberOf or Select-AzureADGroupIdsServicePrincipalIsMemberOf

Отключение создания групп пользователямиDisable group creation by your users

Вы можете запретить пользователям без прав администратора создавать группы безопасности.You can prevent non-admin users from creating security groups. По умолчанию в службе каталогов MS Online (MSODS) пользователям без прав администратора разрешается создавать группы, независимо от того, включено ли при этом самостоятельное управление группами (SSGM).The default behavior in Microsoft Online Directory Services (MSODS) is to allow non-admin users to create groups, whether or not self-service group management (SSGM) is also enabled. Параметр SSGM позволяет управлять поведением только на панели доступа "Мои приложения".The SSGM setting controls behavior only in the My Apps access panel.

Чтобы отключить создание групп для пользователей без прав администратора, сделайте следующее:To disable group creation for non-admin users:

  1. Убедитесь, что пользователи без прав администратора могут создавать группы.Verify that non-admin users are allowed to create groups:

    PS C:\> Get-MsolCompanyInformation | fl UsersPermissionToCreateGroupsEnabled
  2. Если этот код вернет UsersPermissionToCreateGroupsEnabled : True, то пользователи без прав администратора могут создавать группы.If it returns UsersPermissionToCreateGroupsEnabled : True, then non-admin users can create groups. Чтобы отключить эту функцию, используйте следующий код.To disable this feature:

    Set-MsolCompanySettings -UsersPermissionToCreateGroupsEnabled $False

Управление владельцами группManage owners of groups

Чтобы добавить в группу новых владельцев, воспользуйтесь командлетом Add-AzureADGroupOwner:To add owners to a group, use the Add-AzureADGroupOwner cmdlet:

PS C:\Windows\system32> Add-AzureADGroupOwner -ObjectId 31f1ff6c-d48c-4f8a-b2e1-abca7fd399df -RefObjectId 72cd4bbd-2594-40a2-935c-016f3cfeeeea

Параметр -ObjectId — это идентификатор объекта группы, в которую требуется добавить владельца, а -RefObjectId — это идентификатор объекта пользователя, которого требуется добавить в качестве владельца группы.The -ObjectId parameter is the ObjectID of the group to which we want to add an owner, and the -RefObjectId is the ObjectID of the user we want to add as an owner of the group.

Для получения сведений о владельцах группы используйте командлет Get-AzureADGroupOwner:To retrieve the owners of a group, use the Get-AzureADGroupOwner cmdlet:

PS C:\Windows\system32> Get-AzureADGroupOwner -ObjectId 31f1ff6c-d48c-4f8a-b2e1-abca7fd399df

Командлет возвращает список владельцев для указанной группы:The cmdlet returns the list of owners for the specified group:

DeletionTimeStamp ObjectId ObjectType ----------------- -------- ---------- e831b3fd-77c9-49c7-9fca-de43e109ef67 User

Для удаления владельца из группы используйте командлет Remove-AzureADGroupOwner:If you want to remove an owner from a group, use the Remove-AzureADGroupOwner cmdlet:

PS C:\Windows\system32> remove-AzureADGroupOwner -ObjectId 31f1ff6c-d48c-4f8a-b2e1-abca7fd399df -OwnerId e831b3fd-77c9-49c7-9fca-de43e109ef67

Зарезервированные псевдонимыReserved aliases

После создания группы определенные конечные точки позволяют пользователю указать mailNickname или псевдоним, который можно использовать как часть адреса электронной почты группы.When a group is created, certain endpoints allow the end user to specify a mailNickname or alias to be used as part of the email address of the group. Группы с приведенными ниже привилегированными псевдонимами электронной почты может создавать только глобальный администратор Azure AD.Groups with the following highly privileged email aliases can only be created by an Azure AD global administrator.

  • abuseabuse
  • adminadmin
  • administratoradministrator
  • hostmasterhostmaster
  • majordomomajordomo
  • postmasterpostmaster
  • rootroot
  • securesecure
  • securitysecurity
  • ssl-adminssl-admin
  • webmasterwebmaster

Дополнительная информацияNext steps

Дополнительную документацию по PowerShell Azure Active Directory см. в разделе Azure Active Directory Cmdlets (Командлеты Azure Active Directory).You can find more Azure Active Directory PowerShell documentation at Azure Active Directory Cmdlets.

docs.microsoft.com

10 полезных приёмов при работе с оболочкой PowerShell

Если вы недостаточно хорошо освоили PowerShell, то наверняка не стремитесь применять этот инструмент в повседневной работе. Однако дананя оболочка является ядром таких систем, как Exchange 2007, Windows Server 2008 и SQL Server 2008. Поэтому любому администратору нужно научиться использовать её огромные возможности.

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

Замечание: Будьте осторожны, предельно осторожны

Название этого инструментария точно передает его суть. PowerShell (мощная оболочка) способна изменять конфигурацию системы кардинальным образом, причем как в хорошую, так и в плохую сторону. Поэтому эксперименты лучше проводить в тестовом режиме. Также не стоит забывать о применении параметра “-confirm” для проверки конфигурации перед запуском тех или иных команд.

Отчет обо всех установленных USB-устройствах

PowerShell осуществляет доступ к технологии централизованного управления системой Windows Management Instrumentation (WMI). При помощи PowerShell администратор может дать команду WMI произвести поиск всех установленных на локальную или удаленную машину USB-устройств:

gwmi Win32_USBControllerDevice –computername SERVER1 |fl Antecedent,Dependent

Фильтр вернёт список главных и зависимых USB-устройств компьютера SERVER1. Если не задействовать фильтр, то можно получить полный список подключенного к машине USB-оборудования. Это полезно для ведения регулярных отчетов об установленных лицензионных USB-устройствах, где будут отображаться данные о подключении каждого объекта.

Использование PowerShell вместо коммандера CMD

Тот факт, что для решения одних и тех же задач оболочку PowerShell можно использовать вместо командной строки DOS, поможет несколько облегчить процесс обучения и привыкнуть к новому интерфейсу. К сожаленью, строка выполнения (run) не позволяет запускать трехбуквенные команды, например cmd. Но с этой задачей легко справляется PowerShell. Можно назначить специальную команду для быстрого вызова коммандера, например Ctrl + Shift + P.

Использование PowerShell для закрытия процессов вместо Диспетчера задач

Если какая-либо служба Windows не отвечает на запрос о прекращении работы, то ее можно закрыть при помощи PowerShell. Оболочка наделена эквивалентной Диспетчеру задач функцией остановки процессов. Например, для того, чтобы остановить процесс BadThread.exe, нужно проделать следующее:

get-process BadTh*

Результат будет таким:

Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 28 4 -210844 -201128 -163 25.67 2792 BadThread

После того, как идентификационный номер процесса будет определён, его можно закрыть, введя команду:

stop-process –id 2792

После чего функция BadThread будет остановлена и теперь опять же с помощью PowerShell можно попробовать заново запустить соответствующую службу.

Использование команды PSDrive для отображения списка дисков и не только

Команда PSDrive позволяет не только просматривать локальные, удаленные и съемные диски, но и получить доступ к улею реестра HKEY_LOCAL_MACHINE. Для этого нужно задействовать параметр HKLM:

PS C:\> cd HKLM: PS HKLM:/>

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

Назначение NTFS полномочий — возможна ли рекурсия?

Управление правами доступа в файловой системе NTFS — отдельная тема для разговора, однако PowerShell дает возможность назначения полномочий NTFS для аудита доступа пользователей и отображения списков управления доступом (Access Control Lists) в рамках настройки конфигурации безопасности. Это отличное программно реализуемое средство ведения регулярной отчетности, которое также можно использовать для анализа частных случаев возникновения неисправностей. К примеру, зададим следующий цикл:

PS E:\>Get-Acl N:\Data

Система выдаст отчёт о правах доступа пользователя к той или иной директории (одного, но не всех пользователей). Само по себе это не так уж и впечатляет, поскольку отчёт касается лишь одного каталога, но если вы хотите включить рекурсию для целой папки, можно применить иную стратегию. Для той же директории (N:\Data) введём в строке оболочки PowerShell команду Get-ChildItem (cmdlet) в сочетании с другой командой Get-Acl:

PS E:\>Get-ChildItem N:\Data -recurse | Get-Acl

В результате будет выдан список контроля доступа пользователей к содержимому данного каталога. Дело в том, что команда Get-ChildItem проводит инвентаризацию объектов файловой системы, а Get-Acl выводит результаты этой инвентаризации по каждому объекту.При желании можно сохранить этот отчёт в файле разделяемых запятыми значений, для чего нужно будет ввести: “| export-csv c:\filename.csv” в конце команды cmdlet. Для сохранения отчёта в текстовом файле — “> C:\filename.txt” в конце той же команды. Имейте в виду, что при использовании параметра –recurse, функция осуществит проверку всей указанной директории. Поэтому будьте осторожны, применяя его для инвентаризации больших каталогов или целой сети.

Преимущества PowerShell 2.0

Оболочка PowerShell 2.0 встроена в платформу Community Technology Preview (CTP) и снабжена отменным графическим интерфейсом Graphical PowerShell. Сценарии оболочки можно сохранять в файлы с расширением .ps1, благодаря чему становится возможно осуществлять удобное управление, импорт и обмен ими между системами. На изображении A показаны приведённые выше примеры назначения NTFS-полномочий в режиме графического интерфейса.

Изображение A.

Вам необходиом будет скофигурировать политики исполнения (execution policy). Пример конфигурирования политики:

PS C:>Set-ExecutionPolicy Restricted (check only) PS C:>Set-ExecutionPolicy AllSigned (most secure) PS C:>Set-ExecutionPolicy RemoteSigned (medium secure) PS C:>Set-ExecutionPolicy Unrestricted (least secure)

Решив опробовать PowerShell 2.0 в деле, имейте в виду, что вам понадобится пакет WS-MAN v1.1, а для работы с графическим интерфейсом необходим набор инструментов Microsoft .NET Framework 3.0.

Комбинации клавиш для работы в графическом интерфейсе Graphical PowerShell

Если вы работали с SQL Query Analyzer, то вам уже знакомы некоторые из следующих сочетаний клавиш. В графическом интерфейсе Graphical PowerShell можно выделить одну или несколько строк и запустить их, нажав F5. А при редактировании сценария ускорить процесс помогут знакомые комбинации: Ctrl + S для сохранения, Ctrl + Z для отмены предыдущей операции, Ctrl + C для копирования и Ctrl + V для вставки.

Выполнение длительных процессов в фоновом режиме

Если вызванная командой cmdlet процедура работает слишком долго, PowerShell способна переключить её в фоновый режим. Можно одновременно запустить несколько процессов, которые будут выполняться столько, сколько им потребуется. Переключение в фоновый режим осуществляетcя, если в начале команды перед названием процесса ввести start-psjob. Можно послать запрос для выявления статуса всех выполняемых операций:

PS C:>get-psjob

PowerShell выдаст таблицу, где отображён ход всех процессов, при этом каждой сессии будет присвоен свой идентификатор. На изображении B показана ошибка в одном из процессов.

Изображение B

Одно небольшое замечание по PowerShell 2.0: перед её использованием необходимо настроить политику выполнения команд через обычную неграфическую оболочку PowerShell. Конфигурация одной из политик запуска:

Для выключения прерванного процесса введите команду:

PS C:>remove-psjob 9

Создание временных маркеров в отчётах PowerShell

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

Command"$(Get-Date -format g) Start logging" "$(Get-Date -format F) Start logging""$(Get-Date -format o) Start logging"       Output example2/5/2008 9:15 PM Tuesday, February 05, 2008 9:15:13 PM 2008-02-05T21:15:13.0368750-05:00

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

Пошаговый просмотр результатов

Многие команды в PowerShell выдают мгновенные отчёты, которые невозможно просмотреть на экране, если не экспортировать их в отдельный файл. Для возвращения результатов выполнения команд вновь используем Get-ChildItem. Просматривать отчёт станет значительно удобнее, если каждая новая его строка будет появляться через полсекунды после предыдущей. Для этого создадим функцию EasyView:

function EasyView { process { $_; Start-Sleep -seconds .5}}

Теперь для вызова функции EasyView достаточно ввести её имя после вертикального разделителя в конце команды Get-ChildItem:

Get-ChildItem N:\Data | EasyView

Для этой функции мы настроили отображение каждой последующей строки отчёта через 0,5 секунды. При желании можно указать в значение в миллисекундах.

Автор: Rick VanoverВерсия на английском: techrepublic.com.comКопирование статьи разрешается только в случае указания явной гиперссылки на веб-сайт winblog.ru, как на источник русскоязычной версии.

Оцените статью: Голосов 6

www.winblog.ru

Фильтрация объектов в Windows PowerShell

В прошлой статье мы разобрались, что же такое конвейеры в Windows PowerShell. Теперь поговорим о такой возможности, как фильтрация объектов.

Собственно, возможность фильтрации это базис работы с объектами, поскольку никому бы не понравилось работать с огромными массами объектов.

Фильтрация объектов в PowerShell осуществляется при помощи командлета Where-Object. Данный командлет проверяет объекты в конвейере на соответствие определенном условию и передаёт их дальше по конвейеру только в случае соответствия условию.

Условие или условия проверки в командлете Where-Object это, по сути, блок сценария, заключенный в фигурные скобки { }. Блок сценария идет после имени командлета и принимает одно из двух логических значений: $True или $False.

Продолжим разбирать наш пример с процессами в операционной системе. Как мы знаем, список запущенных в операционной системе процессов вызывается командлетом Get-Process. Результат будет примерно таким:

Результат работы командлета Get-Process

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

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

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

Get-Process | Where-Object {$_.CPU -gt 30} Пример фильтрации объектов в Windows PowerShell

Теперь разберем синтаксис командлета Where-Object.

$_ это специальная переменная, которую PowerShell создаёт самостоятельно.

-gt это оператор сравнения, обозначающий «больше». Ниже список операторов сравнения.

Оператор Значение
-eq равно
-ne не равно
-lt меньше
-le меньше или равно
-gt больше
-ge больше или равно
-like сравнение на совпадение имен
-notlike сравнение на несовпадение имен
-contains содержит
-notcontains не содержит

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

Оператор Значение
-and И
-or ИЛИ
-not НЕ
! НЕ

При использовании логических операторов операторы сравнения желательно помещать в скобки. Например, фраза пять равно пяти и три равно трём будет выглядеть как (5 -eq 5) -and (3 -eq 3).

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

В следующий раз поговорим о сортировке объектов.

webistore.ru

Примеры PowerShell для виртуальной машины Azure

Создание виртуальных машинCreate virtual machines
Быстрое создание виртуальной машиныQuickly create a virtual machine Создает группу ресурсов, виртуальную машину и все связанные ресурсы почти без участия пользователя.Creates a resource group, virtual machine, and all related resources, with the minimum of prompts.
Создание полностью настроенной виртуальной машиныCreate a fully configured virtual machine Создает группу ресурсов, виртуальную машину и все связанные ресурсы.Creates a resource group, virtual machine, and all related resources .
Создание высокодоступной виртуальной машиныCreate highly available virtual machines Создает несколько виртуальных машин с высокодоступной конфигурацией с балансировкой нагрузки.Creates several virtual machines in a highly available and load balanced configuration.
Создание виртуальной машины с помощью NGINXCreate a VM and run configuration script Создает виртуальную машину и использует расширение пользовательских скриптов Azure для установки IIS.Creates a virtual machine and uses the Azure Custom Script extension to install IIS.
Создание виртуальной машины с IIS с помощью DSCCreate a VM and run DSC configuration Создает виртуальную машину и использует расширение настройки требуемого состояния (DSC) для установки IIS.Creates a virtual machine and uses the Azure Desired State Configuration (DSC) extension to install IIS.
Sample script to upload a VHD to Azure and create a new VM (Пример скрипта для передачи VHD в Azure и создания виртуальной машины)Upload a VHD and create VMs Передача локального файла VHD в Azure. Создание образа на основе VHD. Создание виртуальной машины на основе этого образа.Uploads a local VHD file to Azure, creates and image from the VHD and then creates a VM from that image.
Создание виртуальной машины с помощью существующего управляемого диска ОС с использованием CLICreate a VM from a managed OS disk Создает виртуальную машину путем подключения имеющегося управляемого диска как диска ОС.Creates a virtual machine by attaching an existing Managed Disk as OS disk.
Создание виртуальной машины из моментального снимка с помощью PowerShellCreate a VM from a snapshot Создает виртуальную машину из моментального снимка, сначала создав из него управляемый диск, а затем подключив этот диск как диск ОС.Creates a virtual machine from a snapshot by first creating a managed disk from snapshot and then attaching the new managed disk as OS disk.
Управление хранилищемManage storage
Create a managed disk from a VHD file in a storage account in same or different subscription with PowerShell (Создание управляемого диска на основе VHD-файла в учетной записи хранения в той же или другой подписке с помощью PowerShell)Create managed disk from a VHD in same or different subscription Создание управляемого диска из специализированного VHD в качестве диска ОС или из VHD данных в качестве диска данных в той же или в другой подписке.Creates a managed disk from a specialized VHD as a OS disk or from a data VHD as data disk in same or different subscription.
Create a managed disk from a snapshot with PowerShell (Создание управляемого диска из моментального снимка с помощью PowerShell)Create a managed disk from a snapshot Создание управляемого диска из моментального снимка.Creates a managed disk from a snapshot.
Copy managed disks in the same subscription or different subscription with PowerShell (Копирование управляемых дисков в ту же или другую подписку с помощью PowerShell)Copy managed disk to same or different subscription Копирование управляемого диска в ту же или в другую подписку, но в том же регионе, что и родительский управляемый диск.Copies managed disk to same or different subscription but in the same region as the parent managed disk.
Экспорт моментального снимка в виде VHD в учетную запись хранения (Export/Copy managed snapshots as VHD to a storage account in different region with PowerShell)Export a snapshot as VHD to a storage account Экспорт управляемого моментального снимка в качестве VHD в учетную запись хранения в другом регионе.Exports a managed snapshot as VHD to a storage account in different region.
Create a snapshot from a VHD to create multiple identical managed disks in small amount of time with PowerShell (Создание моментального снимка на основе VHD для быстрого создания нескольких идентичных управляемых дисков с помощью PowerShell)Create a snapshot from a VHD Создание моментального снимка на основе VHD для создания нескольких идентичных управляемых дисков из моментального снимка за короткий промежуток времени.Creates snapshot from a VHD to create multiple identical managed disks from snapshot in short amount of time.
Copy snapshot of a managed disk to same or different subscription with CLI (Копирование моментального снимка управляемого диска в ту же или в другую подписку с помощью интерфейса командной строки)Copy snapshot to same or different subscription Копирование моментального снимка в ту же или в другую подписку, но в том же регионе, что и родительский моментальный снимок.Copies snapshot to same or different subscription but in the same region as the parent snapshot.
Защита виртуальных машинSecure virtual machines
Encrypt a Windows virtual machine with Azure PowerShell (Шифрование виртуальной машины Windows с помощью Azure PowerShell)Encrypt a VM and data disks Создание Azure Key Vault, ключа шифрования и субъекта-службы. Шифрование виртуальной машины.Creates an Azure Key Vault, encryption key, and service principal, then encrypts a VM.
Мониторинг виртуальных машинMonitor virtual machines
Мониторинг виртуальной машины с помощью Operations Management SuiteMonitor a VM with Operations Management Suite Создает виртуальную машину, устанавливает агент Operations Management Suite и регистрирует виртуальную машину в рабочей области OMS.Creates a virtual machine, installs the Operations Management Suite agent, and enrolls the VM in an OMS Workspace.

docs.microsoft.com

PowerShell и регулярные выражения (часть 1)

Регулярные выражения (Regular Expressions, RegExp)  — это специализированный язык для поиска и обработки текста. Основой регулярных выражений являются управляющие символы (метасимволы), а само регулярное выражение по сути является шаблоном, определяющим правила поиска.

Определение получилось не очень внятное, поэтому начнем с более простого и понятного — символов подстановки (wildcards). Даже если вы не имеете представления о регулярных выражениях, то наверняка использовали для поиска файлов конструкцию вида *.txt. Здесь символ звездочка (*) является метасимволом и означает ″любое количество любых символов″, (.txt) — это обычные (литеральные) символы, а вся конструкция в целом описывает файлы с любым именем и расширением txt.

Регулярные выражения также состоят из обычных и метасимволов и работают по тому же принципу, но имеют гораздо больше возможностей и, соответственно, более сложный синтаксис. Так предыдущий пример (*.txt) с помощью регэкспов будет выглядеть так (.*\.txt).

Регулярные выражения в разной мере поддерживаются в различных языках\средах программирования и даже в некоторых текстовых редакторах. PowerShell базируется на .NET, соответственно в нем доступны практически все возможности .NET, касающиеся регулярных выражений.

Оператор match

В примерах мы будем использовать оператор match, который является одним из основных инструментов для работы с регулярными выражениями в PowerShell. Он сравнивает текст слева с регулярным выражением справа, и если текст подходит под выражение, возвращает True, если не подходит — False:

″PowerShell″ -match ″power″ -> True ″Shell″ -match ″power″ -> False

Если же оператору скормить несколько строк, то он вернет те, которые подходят под заданное выражение:

″Power″, ″Shell″ -match ″power″ -> Power

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

″PowerShell″ -match ″rsh″ -> True

 

С помощью оператора match можно обрабатывать не только текстовые данные, но и любые другие объекты. В качестве примера получим список служб и выберем те из них, в названии которых присутствует ″event″:

Get-Service | where {$_.Name -match ″event″}

Регистрозависимость

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

″PowerShell″ -match ″power″ -> True

Если необходимо учитывать регистр символов, то можно приставить к оператору сравнения букву С (от Case Sensitive). Получившийся оператор cmatch регистрозависим, соответственно при его использовании выражение уже не будет соответствовать действительности:

″PowerShell″ -cmatch ″power″ -> False

Кроме того, есть возможность включать регистрозависимость средствами самих регулярных выражений, где в качестве переключателей используются конструкции (?i) и (?-i). При использовании оператора match (?-i) включает зависимость от регистра, а (?i) отключает. Например:

″PowerShell″ -match ″(?-i)power″ -> False″PowerShell″ -match ″(?i)power″ -> True

Плюс использования (?i) и (?-i) в том, что с их помощью можно задавать регистрозависимость не для всего выражения, а для его части. Например:

″PowerShell″ -match ″power(?-i)Shell″ -> True″PowerShell″ -match ″power(?-i)shell″ -> False

 

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

Get-Service | where {$_.name -cmatch ″event″} Get-Service | where {$_.name -cmatch ″Event″}

Якоря

Для положительного результата регулярному выражению требуется лишь наличие подходящих символов, независимо от их расположения в тексте. Это поведение по умолчанию, но его можно изменить с помощью специальных метасимволов, называемых якорями (anchors). Якоря позволяют точно указать на позицию в строке, в которой должны находиться искомые символы.

Метасимволы крышка ^ и \A совпадают с началом строки, перед первым символом. Для примера выведем список служб, начинающихся с символа ″b″:

Get-Service | where {$_.name -match ″^b″}

 

Метасимволы доллар $, \Z или \z совпадают с окончанием строки. Для примера выведем список служб, заканчивающихся на ″s″:

Get-Service | where {$_.name -match ″s$″}

 

Здесь может возникнуть вопрос, есть ли отличия между якорями (например между $,\Z и \z) и когда какой из них лучше использовать. Для этого представим разбираемый с помощью регулярного выражения объект как текст, состоящий из физических строк (string), разделенных символом новой строки (\n):

string 1 \nstring 2 \n…string n

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

^ —  совпадает с позицией в начале строки, в расширенном режиме также совпадает с позицией после любого символа новой строки;\A — не поддерживает расширенный режим и всегда соответствует началу строки;$ — совпадает с позицией в конце строки и перед символом новой строки, завершающим текст, в расширенном режиме совпадает с позицией перед любым символом новой строки;\Z — не поддерживает расширенный режим, совпадает с позицией в конце строки и перед завершающим символом новой строки;\z —  не поддерживает расширенный режим, совпадает с позицией в конце строки только в том случае, если перед ним нет символа новой строки.

Границы

Как уже было сказано, для регулярного выражения нет необходимости в точном совпадении, достаточно наличия искомых символов в тексте. Так например слово ″cat″ будет найдено не только в ″My cat is fat″, но и в ″bobcat″, ″category″, ″staccato″ и прочих, которые не имеют ни малейшего отношения к кошачьим. Поэтому, если необходимо только целое слово, можно обозначить его границы (boundaries) с помощью метасимвола \b.

Для примера выведем список файлов в директории, содержащих в названии слово power:

Get-ChildItem ′C:\Files\PS Books′ | where {$_.Name -match ″power″}

А теперь предположим, что мне нужно, чтобы слово power в названии присутствовало отдельно от прочих. Изменим команду, обозначив границы слова:

Get-ChildItem ′C:\Files\PS Books′ | where {$_.Name -match ″\bpower\b″}

 

Возможен и обратный случай, когда необходимо найти слово не целиком, а именно в составе с другим —  например найти ″cat″  в ″bobcat″, ″category″ или ″staccato″,  но не в ″My cat is fat″. Для этого есть специальный метасимвол \B, который называется ″не граница″ (nonboundaries). Возьмем пример с файлами и изменим его таким образом, чтобы слово power нашлось только в составе других слов:

Get-ChildItem ′C:\Files\PS Books′ | where {$_.Name -match ″\Bpower\B″}

 

Примечание. На всякий случай уточню, что метасимволы \b и \B вовсе не обязаны быть парными. Их можно использовать поодиночке и в различных сочетаниях, например \bpower, power\B или \bpower\B.

Классы символов

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

Get-Service | where {$_.Name -match ″v[ds]s″}

 

Символы в классе можно указывать не по одному, а задавать в виде диапазона. Например [e-v] совпадает с одним любым символом, находящемся в  указанном диапазоне (от e до v):

Get-Service | where {$_.Name -match ″[e-v]log$″}

 

Примечание. Знак дефис (-) внутри класса является метасимволом и обозначает диапазон символов. Если вы хотите указать дефис как обычный символ, то его необходимо поставить в начале выражения, например так [-a-z], либо экранировать.

Отдельные символы и диапазоны можно комбинировать, например [adev-z] означает ″a или d или e или любой символ от v до z″. Подобным образом можно обозначать любые классы символов, например [a-z] означает любой символ латинского алфавита, а [0-9] соответственно любую цифру.

Для наиболее распространенных классов есть сокращенные обозначения:

\w — word. В этот класс входит любая буква, цифра или нижнее подчеркивание, эквивалентно [a-zа-я0-9_];\d — digit. В этот класс входит любая цифра, эквивалентно [0-9];\s — space. Класс, совпадающий с любым символом пропуска (пробел, табуляция, новая строка и т.п.).

Примечание. В класс \w могут входить и символы других алфавитов, в зависимости от используемого на компьютере языка.

Для примера выведем список файлов в директории, в названии которых присутствуют цифры:

Get-ChildItem ′C:\Files\PS Books′ | where {$_.Name -match ″\d″}

 

Ну и наиболее общим символьным классом в регулярных выражениях является точка (.), которая описывает один любой символ. Для примера выведем службу с именем, начинающимся на b, заканчивающуюся на s, между которыми могут находиться любые два символа:

Get-Service | where {$_.Name -match ″^b..s$″}

Отрицательные классы

Иногда проще пойти от обратного, т.е. не перечислять все символы, которые должны присутствовать в строке, а указать только те, которых там быть не должно. Сделать это можно с помощью уже знакомого нам символа крышка (^). Так выражение  [^adf] означает ″любой символ кроме a,d или f″. Крышка, поставленная в качестве первого символа в классе, означает отрицание, а сам класс называется отрицательным (или инвертированным).

Для примера выведем все файлы в директории, кроме файлов с расширением pdf:

Get-ChildItem ′C:\Files\PS Books′ | where {$_.Name -match ″[^pdf]$″}

 

Для основных классов (\w,\d,\s) есть альтернативный вариант отрицания. Для того, чтобы включить в них отрицание, достаточно перевести их в верхний регистр:

\W — все кроме буквы, цифры или нижнего подчеркивания, эквивалентно [^\s];\D — все кроме цифр, эквивалентно [^\d];\S — все кроме символов пропуска, эквивалентно [^\s].

Оператор notmatch

Еще один способ пойти от обратного — это использовать оператор notmatch, обратный оператору match. Действует он следующим образом — сравнивает текст слева с регулярным выражением справа, и если текст не содержит символы, указанные в регулярном выражении, возвращает True, иначе False. Так предыдущий пример с отрицательными группами можно переписать следующим образом:

Get-ChildItem ′C:\Files\PS Books′ | where {$_.Name -notmatch ″pdf$″}

Экранирование

Как уже упоминалось, в регулярных выражениях есть обычные символы и метасимволы. Но иногда бывает необходимо использовать метасимволы в качестве обычных литералов. Сделать это можно, заэкранировав метасимвол с помощью обратного слэша (\).

Например, нам нужно найти все файлы, содержащим инициалы E. в названии. Попробуем сделать так:

Get-ChildItem ′C:\Files\PS Books′ | where {$_.Name -match ″E.″}

Поскольку в данном случае точка является метасимволом, то в результате мы получим файлы, имеющие в своем названии ″букву E, за которой следует один любой символ″.  А теперь заэкранируем точку и получим нужный результат:

Get-ChildItem ′C:\Files\PS Books′ | where {$_.Name -match ″E\.″}

 

Пока все. Продолжение следует 🙂

windowsnotes.ru

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 после каждой строки:

  1. Get-Service
  2. Get-Process

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

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

  1. Get-Service;Get-Process

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

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

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

Переменные

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

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

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

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

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

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

  1. $numbers = 1

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

  1. $numbers = 'fred.'

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

Кавычки

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

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

  1. $name = 'Don'
  2. $prompt = "My name is $name"

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

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

  1. $debug = "`$computer contains $computer"
  2. $head = "Column`tColumn`tColumn"

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

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

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

  1. $filter1 = "name='BITS'"
  2. $computer = 'BITS'
  3. $filter2 = "name='$computer'"

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

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

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

  1. $var = 'Hello'
  2. $var | Get-Member

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

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

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

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

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

  1. $service = 'bits'
  2. $name = "Service is $service.ToUpper()"
  3. $upper = $name.ToUpper()
  4. $name = "Service is $upper"

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

Скобки

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

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

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

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

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

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

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

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

  1. New-PSDrive -PSProviderFileSystem -Root C:\ -Name Sys
  2. Dir SYS:

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

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

  1. Dir
  2. New-Alias Dir Get-Alias
  3. 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 для принятия решений. Полная ее форма выглядит так:

  1. If ($this -eq $that) {
  2.   # commands
  3. } elseif ($those -ne $them) {
  4.   # commands
  5. } elseif ($we -gt $they) {
  6.   # commands
  7. } else {
  8.   # commands
  9. }

Ключевое слово «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 игнорирует весь текст от этого символа до следующего возврата каретки. Также обратите внимание на аккуратное форматирование описанных конструкций. Некоторые форматируют текст так:

  1. if ($those -eq $these)
  2. {
  3.   #commands
  4. }

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

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

  1. function mine {
  2. if ($this -eq $that){
  3. get-service
  4. }}

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

  1. function mine {
  2.  if ($this -eq $that){
  3.   get-service
  4.  }
  5. }

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

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

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

  1. Do {
  2.   # commands
  3. } While ($this -eq $that)

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

  1. While (Test-Path $path) {
  2.   # commands
  3. }

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

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

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

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

  1. $services = Get-Service
  2. ForEach ($service in $services) {
  3.   $service.Stop()
  4. }

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

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

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

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

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

  1. Get-Service | Stop-Service

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

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

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

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

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

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

Функции

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

  1. function Mine {
  2.   Get-Service
  3.   Get-Process
  4. }
  5. Mine

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

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

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

  1. function One {
  2.   function Two {
  3. Dir
  4.   }
  5.   Two
  6. }
  7. One
  8. Two

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

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

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

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

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

  1. param (
  2.   [string]$computername,
  3.   [string]$logfile,
  4.   [int]$attemptcount = 5
  5. )

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

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

  1. ./test -computername SERVER
  2. ./test -comp SERVER -log err.txt -attempt 2
  3. ./test SERVER err.txt 2
  4. ./test SERVER 2
  5. ./test -log err.txt -attempt 2 -comp SERVER

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

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

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

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

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

  1. [CmdletBinding()]
  2. param (
  3.   [Parameter(Mandatory=$True)]
  4.   [string]$computername,
  5.   [Parameter(Mandatory=$True)]
  6.   [string]$logfile,
  7.   [int]$attemptcount = 5
  8. )

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

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

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

webhamster.ru