Использование в PowerShell Where, Where-Object, ?
PS C:\> Get-ADUser -Filter * | Get-Member
TypeName: Microsoft.ActiveDirectory.Management.ADUser
Name MemberType Definition
—- ———- ———-
Contains Method bool Contains(string propertyName)
Equals Method bool Equals(System.Object obj)
GetEnumerator Method System.Collections.IDictionaryEnumerator GetEnumerator()
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Item ParameterizedProperty Microsoft.ActiveDirectory.Management.ADPropertyValueCollection Item(string p…
DistinguishedName Property System.String DistinguishedName {get;set;}
Enabled Property System.Boolean Enabled {get;set;}
GivenName Property System.String GivenName {get;set;}
Name Property System.String Name {get;}
ObjectClass Property System.String ObjectClass {get;set;}
ObjectGUID Property System.Nullable`1[[System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, …
SamAccountName Property System.String SamAccountName {get;set;}
SID Property System.Security.Principal.SecurityIdentifier SID {get;set;}
Surname Property System.String Surname {get;set;}
UserPrincipalName Property System.String UserPrincipalName {get;set;}
PS C:\> Get-ADUser -Filter * -Properties * | Get-Member
TypeName: Microsoft.ActiveDirectory.Management.ADUser
Name MemberType Definition
—- ———- ———-
Contains Method bool Contains(string propertyName)
Equals Method bool Equals(System.Object obj)
GetEnumerator Method System.Collections.IDictionaryEnumerator GetEnumerator()
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Item ParameterizedProperty Microsoft.ActiveDirectory.Management.ADPropertyValueColle…
AccountExpirationDate Property System.DateTime AccountExpirationDate {get;set;}
accountExpires Property System.Int64 accountExpires {get;set;}
AccountLockoutTime Property System.DateTime AccountLockoutTime {get;set;}
AccountNotDelegated Property System.Boolean AccountNotDelegated {get;set;}
adminCount Property System.Int32 adminCount {get;set;}
AllowReversiblePasswordEncryption Property System.Boolean AllowReversiblePasswordEncryption {get;set;}
AuthenticationPolicy Property Microsoft.ActiveDirectory.Management.ADPropertyValueColle…
AuthenticationPolicySilo Property Microsoft.ActiveDirectory.Management.ADPropertyValueColle…
BadLogonCount Property System.Int32 BadLogonCount {get;}
badPasswordTime Property System.Int64 badPasswordTime {get;set;}
badPwdCount Property System.Int32 badPwdCount {get;set;}
CannotChangePassword Property System.Boolean CannotChangePassword {get;set;}
CanonicalName Property System.String CanonicalName {get;}
Certificates Property Microsoft.ActiveDirectory.Management.ADPropertyValueColle…
City Property System.String City {get;set;}
CN Property System.String CN {get;}
codePage Property System.Int32 codePage {get;set;}
Company Property System.String Company {get;set;}
CompoundIdentitySupported Property Microsoft.ActiveDirectory.Management.ADPropertyValueColle…
Country Property System.String Country {get;set;}
countryCode Property System.Int32 countryCode {get;set;}
Created Property System.DateTime Created {get;}
createTimeStamp Property System.DateTime createTimeStamp {get;}
Deleted Property System.Boolean Deleted {get;}
Department Property System.String Department {get;set;}
Description Property System.String Description {get;set;}
DisplayName Property System.String DisplayName {get;set;}
DistinguishedName Property System.String DistinguishedName {get;set;}
Division Property System.String Division {get;set;}
DoesNotRequirePreAuth Property System.Boolean DoesNotRequirePreAuth {get;set;}
dSCorePropagationData Property Microsoft.ActiveDirectory.Management.ADPropertyValueColle…
EmailAddress Property System.String EmailAddress {get;set;}
EmployeeID Property System.String EmployeeID {get;set;}
EmployeeNumber Property System.String EmployeeNumber {get;set;}
Enabled Property System.Boolean Enabled {get;set;}
Fax Property System.String Fax {get;set;}
GivenName Property System.String GivenName {get;set;}
HomeDirectory Property System.String HomeDirectory {get;set;}
HomedirRequired Property System.Boolean HomedirRequired {get;set;}
HomeDrive Property System.String HomeDrive {get;set;}
HomePage Property System.String HomePage {get;set;}
HomePhone Property System.String HomePhone {get;set;}
Initials Property System.String Initials {get;set;}
instanceType Property System.Int32 instanceType {get;}
isCriticalSystemObject Property System.Boolean isCriticalSystemObject {get;set;}
isDeleted Property System.Boolean isDeleted {get;}
KerberosEncryptionType Property Microsoft.ActiveDirectory.Management.ADPropertyValueColle…
LastBadPasswordAttempt Property System.DateTime LastBadPasswordAttempt {get;}
LastKnownParent Property System.String LastKnownParent {get;}
lastLogoff Property System.Int64 lastLogoff {get;set;}
lastLogon Property System.Int64 lastLogon {get;set;}
LastLogonDate Property System.DateTime LastLogonDate {get;}
lastLogonTimestamp Property System.Int64 lastLogonTimestamp {get;set;}
LockedOut Property System.Boolean LockedOut {get;set;}
logonCount Property System.Int32 logonCount {get;set;}
logonHours Property System.Byte[] logonHours {get;set;}
LogonWorkstations Property System.String LogonWorkstations {get;set;}
Manager Property System.String Manager {get;set;}
MemberOf Property Microsoft.ActiveDirectory.Management.ADPropertyValueColle…
MNSLogonAccount Property System.Boolean MNSLogonAccount {get;set;}
MobilePhone Property System.String MobilePhone {get;set;}
Modified Property System.DateTime Modified {get;}
modifyTimeStamp Property System.DateTime modifyTimeStamp {get;}
msDS-User-Account-Control-Computed Property System.Int32 msDS-User-Account-Control-Computed {get;}
Name Property System.String Name {get;}
nTSecurityDescriptor Property System.DirectoryServices.ActiveDirectorySecurity nTSecuri…
ObjectCategory Property System.String ObjectCategory {get;}
ObjectClass Property System.String ObjectClass {get;set;}
ObjectGUID Property System.Nullable`1[[System.Guid, mscorlib, Version=4.0.0.0…
objectSid Property System.Security.Principal.SecurityIdentifier objectSid {g…
Office Property System.String Office {get;set;}
OfficePhone Property System.String OfficePhone {get;set;}
Organization Property System.String Organization {get;set;}
OtherName Property System.String OtherName {get;set;}
PasswordExpired Property System.Boolean PasswordExpired {get;set;}
PasswordLastSet Property System.DateTime PasswordLastSet {get;set;}
PasswordNeverExpires Property System.Boolean PasswordNeverExpires {get;set;}
PasswordNotRequired Property System.Boolean PasswordNotRequired {get;set;}
POBox Property System.String POBox {get;set;}
PostalCode Property System.String PostalCode {get;set;}
PrimaryGroup Property System.String PrimaryGroup {get;}
primaryGroupID Property System.Int32 primaryGroupID {get;set;}
PrincipalsAllowedToDelegateToAccount Property Microsoft.ActiveDirectory.Management.ADPropertyValueColle…
ProfilePath Property System.String ProfilePath {get;set;}
ProtectedFromAccidentalDeletion Property System.Boolean ProtectedFromAccidentalDeletion {get;set;}
pwdLastSet Property System.Int64 pwdLastSet {get;set;}
SamAccountName Property System.String SamAccountName {get;set;}
sAMAccountType Property System.Int32 sAMAccountType {get;set;}
ScriptPath Property System.String ScriptPath {get;set;}
sDRightsEffective Property System.Int32 sDRightsEffective {get;}
ServicePrincipalNames Property Microsoft.ActiveDirectory.Management.ADPropertyValueColle…
SID Property System.Security.Principal.SecurityIdentifier SID {get;set;}
SIDHistory Property Microsoft.ActiveDirectory.Management.ADPropertyValueColle…
SmartcardLogonRequired Property System.Boolean SmartcardLogonRequired {get;set;}
State Property System.String State
Where, Where-Object, ? » Pechenek.NET
get-service | Where Status -eq «Running»
Status Name DisplayName
—— —- ————
Running AdobeARMservice Adobe Acrobat Update Service
Running AdobeUpdateService AdobeUpdateService
Running AGMService Adobe Genuine Monitor Service
Running AGSService Adobe Genuine Software Integrity Se…
Running Appinfo Сведения о приложении
Running AudioEndpointBu… Средство построения конечных точек …
Running Audiosrv Windows Audio
Running AVP Kaspersky Endpoint Security Service
Running avpsus Kaspersky Seamless Update Service
Running BFE Служба базовой фильтрации
Running BrokerInfrastru… Служба инфраструктуры фоновых задач
Running BthAvctpSvc Служба AVCTP
Running cbdhsvc_572e0f Пользовательская служба буфера обме…
Running CcmExec Узел агента SMS
Running CDPSvc Служба платформы подключенных устро…
Running CDPUserSvc_572e0f Служба пользователя платформы подкл…
Running CertPropSvc Распространение сертификата
Running ClipSVC Служба лицензий клиента (ClipSVC)
Running CmRcService Удаленное управление Configuration …
Running CoreMessagingRe… CoreMessaging
Running cpcsp КриптоПро CSP 4.0.9963 KC1
Running CryptSvc Службы криптографии
Running CxMonSvc CxMonSvc
Running CxUtilSvc CxUtilSvc
Running DcomLaunch Модуль запуска процессов DCOM-сервера
Running DeviceAssociati… Служба сопоставления устройств
Running Dhcp DHCP-клиент
Running Dnscache DNS-клиент
Running DPS Служба политики диагностики
Running DsSvc Служба совместного доступа к данным
Running DusmSvc Использование данных
Running EventLog Журнал событий Windows
Running EventSystem Система событий COM+
Running FontCache Служба кэша шрифтов Windows
Running FontCache3.0.0.0 Кэш шрифтов Windows Presentation Fo…
Running gpsvc Клиент групповой политики
Running hidserv Доступ к HID-устройствам
Running igfxCUIService2… Intel(R) HD Graphics Control Panel …
Running IKEEXT Модули ключей IPsec для обмена ключ…
Running InstallService Служба установки Microsoft Store
Running iphlpsvc Вспомогательная служба IP
Running IpOverUsbSvc Windows Phone IP over USB Transport…
Running JetBrainsLicSer… JetBrains License Server by DVT
Running KeyIso Изоляция ключей CNG
Running klnagent Агент администрирования Kaspersky S…
Running LanmanServer Сервер
Running LanmanWorkstation Рабочая станция
Running LicenseManager Служба Windows License Manager
Running lmhosts Модуль поддержки NetBIOS через TCP/IP
Running LSM Диспетчер локальных сеансов
Running mpssvc Брандмауэр Защитника Windows
Running NcbService Посредник подключений к сети
Running Netlogon Сетевой вход в систему
Running netprofm Служба списка сетей
Running NgcCtnrSvc Контейнер службы Microsoft Passport
Running NlaSvc Служба сведений о подключенных сетях
Running nsi Служба интерфейса сохранения сети
Running OneSyncSvc_572e0f Синхронизация узла_572e0f
Running osppsvc Office Software Protection Platform
Running PcaSvc Служба помощника по совместимости п…
Running PimIndexMainten… Служба контактных данных_572e0f
Running PlugPlay Plug and Play
Running PolicyAgent Агент политики IPsec
Running Power Питание
Running ProfSvc Служба профилей пользователей
Running RasMan Диспетчер подключений удаленного до…
Running RmSvc Служба управления радио
Running RpcEptMapper Сопоставитель конечных точек RPC
Running RpcSs Удаленный вызов процедур (RPC)
Running SamSs Диспетчер учетных записей безопасности
Running Schedule Планировщик заданий
Running SecurityHealthS… Служба «Безопасность Windows»
Running SEMgrSvc Диспетчер платежей и NFC/защищенных…
Running SENS Служба уведомления о системных собы…
Running SessionEnv Настройка сервера удаленных рабочих…
Running SgrmBroker Брокер мониторинга среды выполнения…
Running ShellHWDetection Определение оборудования оболочки
Running Spooler Диспетчер печати
Running SQLWriter SQL Server, службы синхронизации ко…
Running SSDPSRV Обнаружение SSDP
Running SstpSvc Служба SSTP
Running StateRepository Служба репозитория состояний
Running stisvc Служба загрузки изображений Windows…
Running StorSvc Служба хранилища
Running SysMain SysMain
Running SystemEventsBroker Брокер системных событий
Running TabletInputService Служба сенсорной клавиатуры и панел…
Running TapiSrv Телефония
Running TermService Службы удаленных рабочих столов
Running Themes Темы
Running TimeBrokerSvc Брокер времени
Running TokenBroker Диспетчер учетных веб-записей
Running TrkWks Клиент отслеживания изменившихся св…
Running UmRdpService Перенаправитель портов пользователь…
Running UnistoreSvc_572e0f Служба хранения данных пользователя…
Running UserDataSvc_572e0f Служба доступа к данным пользовател…
Running UserManager Диспетчер пользователей
Running UsoSvc Update Orchestrator Service
Running VaultSvc Диспетчер учетных данных
Running VMAuthdService VMware Authorization Service
Running VMnetDHCP VMware DHCP Service
Running VMUSBArbService VMware USB Arbitration Service
Running VMware NAT Service VMware NAT Service
Running VMwareHostd VMware Workstation Server
Running W32Time Служба времени Windows
Running Wcmsvc Диспетчер подключений Windows
Running WdiServiceHost Узел службы диагностики
Running WinHttpAutoProx… Служба автоматического обнаружения …
Running Winmgmt Инструментарий управления Windows
Running WpnService Служба системы push-уведомлений Win…
Running WpnUserService_… Пользовательская служба push-уведом…
Running wscsvc Центр обеспечения безопасности
Running WSearch Windows Search
Running wuauserv Центр обновления Windows
* | PowerShell и другие скрипты
Очень часто приходится делать выборки из результатов, на основе сравнения свойств объектов с некой строчкой. Например:
Get-Command | Where-Object {$_.definition -like "*mapi*"}
Не очень сложно, и логично 🙂 Но так как писать такую конструкцию приходится достаточно постоянно, это сильно надоедает. И учитывая что больше всего в таких случаях используются простые сравнения с помощью операторов -match, -like, и -eq, я написал несколько маленьких фильтров-оберток, просто для снижения количества набираемых спецсимволов 🙂
filter Where-Match ([string]$Property="", [string]$Value=$(throw "You must specify value"), [switch]$Not) { if($(if($Property){$_.$Property}else{$_}) -match $Value -xor $Not){$_} } filter Where-Like ([string]$Property="", [string]$Value=$(throw "You must specify value"), [switch]$Not) { if($(if($Property){$_.$Property}else{$_}) -like $Value -xor $Not){$_} } filter Where-Equal ([string]$Property="", $Value=$(throw "You must specify value"), [switch]$Not) { if($(if($Property){$_.$Property}else{$_}) -eq $Value -xor $Not){$_} }
Эти фильтры можно поместить в профиль, для того чтобы не приходилось каждую сессию снова задавать их 🙂 Используются же они так:
Get-Command | Where-Like definition *mapi*
или так (ключ -not указывает что следует инвертировать смысл функции, то есть в данном случае как бы используется -notlike):
Get-Process | Where-Like path c:\windows\* -not
Смотрим только запущенные сервисы…
Get-Service | Where-Equal status running
или только файлы с расширением .ps<цифра>
dir | Where-Match -value '\.ps\d'
Кроме того, для себя я сделал еще алиасы:
Set-Alias wm Where-Match Set-Alias wl Where-Like Set-Alias we Where-Equal
Понравилось это:
Нравится Загрузка…
Похожее
Работа с объектами, собственные классы / Блог компании RUVDS.com / Хабр
Текстовый вывод команд в окне интерпретатора PowerShell — всего лишь способ отображения информации в пригодном для человеческого восприятия виде. На самом деле среда ориентирована на работу с объектами: командлеты и функции получают их на входе и возвращают на выходе, а доступные в интерактивном режиме и в сценариях типы переменных базируются на классах .NET. В четвертой статье цикла мы изучим работу с объектами более детально.
Оглавление:
Объекты в PowerShell
Просмотр структуры объектов
Фильтрация объектов
Сортировка объектов
Выделение объектов и их частей
ForEach-Object, Group-Object и Measure-Object
Создание объектов .NET и COM (New-Object)
Вызов статических методов
Тип PSCustomObject
Создание собственных классов
Объекты в PowerShell
Напомним, что объект — это совокупность полей данных (свойств, событий и т.д.) и способов их обработки (методов). Его структура задается типом, который как правило базируется на использующихся в унифицированной платформе .NET Core классах. Также есть возможность работать с объектами COM, CIM (WMI) и ADSI. Свойства и методы нужны для выполнения различных действий над данными, кроме того в PowerShell объекты можно передавать как аргументы в функции и командлеты, присваивать их значения переменным, а также существует механизм композиции команд (конвейер или pipeline). Каждая команда в конвейере передает свой вывод следующей поочередно — объект за объектом. Для обработки можно использовать скомпилированные командлеты или создавать собственные расширенные функции, чтобы производить различные манипуляции с объектами в конвейере: фильтрацию, сортировку, группировку и даже изменение их структуры. Передача данных в таком виде имеет серьезное преимущество: принимающей команде не нужно заниматься синтаксическим разбором потока байтов (текста), вся нужная информация легко извлекается с помощью обращения к соответствующим свойствам и методам.
Просмотр структуры объектов
Он выведет на экран некие отформатированные текстовые данные, не дающие представления о свойствах возвращаемых объектов и их методах. Для тонкого препарирования вывода необходимо научиться исследовать структуру объектов и в этом нам поможет командлет Get-Member:
Get-Process | Get-Member
Здесь мы уже видим тип и структуру, а с помощью дополнительных параметров можем, например, вывести только свойства попавшего на вход объекта:
Get-Process | Get-Member -MemberType Property
Эти знания понадобятся для решения задач администрирования в интерактивном режиме или для написания собственных скриптов: скажем, чтобы получить сведения о зависших процессах по свойству Responding.
Фильтрация объектов
PowerShell позволяет пропускать по конвейеру объекты, удовлетворяющие определенному условию:
Where-Object { блок сценария }
Результатом выполнения блока сценария в операторных скобках должно быть логические значение. Если оно истинно ($true) попавший на вход командлету Where-Object объект будет передан по конвейеру дальше, в противном случае (значение $false) он будет удален. Для примера выведем список остановленных служб Windows Server, т.е. таких, у которых свойство Status имеет значение «Stopped»:
Get-Service | Where-Object {$_.Status -eq "Stopped"}
Здесь мы снова видим текстовое представление, но при желании понять тип и внутреннее устройство проходящих через конвейер объектов нетрудно:
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member
Сортировка объектов
При конвейерной обработке объектов часто возникает необходимость их сортировки. В командлет Sort-Object передаются имена свойств (ключей сортировки), а он возвращает упорядоченные по их значениям объекты. Вывод запущенных процессов несложно отсортировать по затраченному процессорному времени (свойство cpu):
Get-Process | Sort-Object –Property cpu
Параметр -Property при вызове командлета Sort-Object можно не указывать — он используется по умолчанию. Для обратной сортировки применяется параметр -Descending:
Get-Process | Sort-Object cpu -Descending
Выделение объектов и их частей
Командлет Select-Object позволяет выделить определенное количество объектов в начале или в конце конвейера с помощью параметров -First или -Last. С его помощью можно выбрать единичные объекты или определенные свойства, а также создать на их основе новые объекты. Разберем работу командлета на простых примерах.
Get-Process | Sort-Object WS -Descending | Select-Object -First 10
Можно выделить только определенные свойства проходящих через конвейер объектов и создать на их основе новые:
Get-Process | Select-Object ProcessName, Id -First 1
В результате работы конвейера мы получим новый объект, структура которого будет отличаться от структуры возвращаемых командлетом Get-Process. Убедимся в этом при помощи Get-Member:
Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member
Обратите внимание, что Select-Object возвращает единичный объект (-First 1), у которого всего два указанных нами поля: их значения были скопированы из первого переданного в конвейер командлетом Get-Process объекта. На использовании Select-Object основан один из способов создания объектов в сценариях PowerShell:
$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType()
С помощью Select-Object можно добавлять объектам вычисляемые свойства, которые необходимо представить в виде хэш-таблицы. При этом значение ее первого ключа соответствует имени свойства, а значение второго — значению свойства для текущего элемента конвейера:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
Посмотрим на структуру проходящих через конвейер объектов:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member
ForEach-Object, Group-Object и Measure-Object
Для работы с объектами существуют и другие командлеты. Для примера расскажем о трех наиболее полезных:
ForEach-Object позволяет выполнить код на языке PowerShell для каждого объекта в конвейере:
ForEach-Object { блок сценария }
Group-Object группирует объекты по значению свойства:
Group-Object PropertyName
Если запустить его с параметром -NoElement, можно узнать количество элементов в группах.
Measure-Object агрегирует различные сводные параметры по значениям полей объектов в конвейере (вычисляет сумму, а также находит минимальное, максимальное или среднее значение):
Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum
Обычно рассмотренные командлеты используются в интерактивном режиме, а в скриптах чаще создаются функции с блоками Begin, Process и End.
Создание объектов .NET и COM (New-Object)
Есть множество программных компонентов с интерфейсами .NET Core и COM, которые пригодятся системным администраторам. С помощью класса System.Diagnostics.EventLog можно управлять системными журналами непосредственно из Windows PowerShell. Разберем пример создания экземпляра этого класса при помощи командлета New-Object с параметром -TypeName:
New-Object -TypeName System.Diagnostics.EventLog
Поскольку мы не указали определенный журнал событий, полученный экземпляр класса не содержит данных. Чтобы это изменить, необходимо во время его создания вызвать специальный метод-конструктор при помощи параметра -ArgumentList. Если мы хотим получить доступ к журналу приложений, в конструктор следует передать строку «Application» в качестве аргумента:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application $AppLog
Обратите внимание: выходные данные команды мы сохранили в переменной $AppLog. Хотя в интерактивном режиме обычно используются конвейеры, написание сценариев часто требует сохранения ссылки на объект. Кроме того основные классы .NET Core содержатся в пространстве имен System: PowerShell по умолчанию ищет в нем указанные типы, поэтому написание Diagnostics.EventLog вместо System.Diagnostics.EventLog вполне корректно.
Для работы с журналом можно обращаться к соответствующим методам:
$AppLog | Get-Member -MemberType Method
Скажем очищается он методом Clear() при наличии прав доступа:
$AppLog.Clear()
Командлет New-Object применяется и для работы с СОМ-компонентами. Их довольно много — от поставляемых с сервером сценариев Windows библиотек до приложений ActiveX, таких, например, как Internet Explorer. Чтобы создать СОМ-объект, требуется задать параметр -ComObject с программным идентификатора ProgId нужного класса:
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject
Для создания собственных объектов с произвольной структурой использование New-Object выглядит слишком архаичным и громоздким, этот командлет используется для работы с внешними по отношению к PowerShell программными компонентами. В следующих статьях этот вопрос будет разобран более подробно. Помимо объектов .NET и COM мы также изучим объекты CIM (WMI) и ADSI.
Вызов статических методов
Экземпляры некоторых классов .NET Core создать невозможно: к их числу относятся System.Environment и System.Math. Они являются статическими и содержат только статические свойства и методы. По сути это справочные библиотеки, которые используются без создания объектов. Сослаться на статический класс можно через литерал, заключив имя типа в квадратные скобки. При этом если посмотреть на структуру объекта с помощью Get-Member, мы увидим тип System.RuntimeType вместо System.Environment:
[System.Environment] | Get-Member
Для просмотра только статических элементов нужно вызвать Get-Member с параметром -Static (обратите внимание на тип объекта):
[System.Environment] | Get-Member -Static
Для доступа к статическим свойствам и методам используются два идущих подряд двоеточия вместо точки после литерала:
[System.Environment]::OSVersion
Или
$test=[System.Math]::Sqrt(25)
$test
$test.GetType()
Тип PSCustomObject
Среди многочисленных доступных в PowerShell типов данных отдельно стоит упомянуть PSCustomObject, предназначенный для хранения объектов с произвольной структурой. Создание такого объекта с помощью командлета New-Object считается классическим, но громоздким и устаревшим способом:
$object = New-Object –TypeName PSCustomObject -Property @{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'}
Посмотрим на структуру объекта:
$object | Get-Member
Начиная с PowerShell 3.0 доступен и другой синтаксис:
$object = [PSCustomObject]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Получить доступ к данным можно одним из эквивалентных способов:
$object.Name
$object.'Name'
$value = 'Name'
$object.$value
Приведем пример преобразования в объект существующей хэштаблицы:
$hash = @{'Name'='Ivan Danko'; 'City'='Moscow'; 'Country'='Russia'}
$hash.GetType()
$object = [pscustomobject]$hash
$object.GetType()
Один из недостатков объектов этого типа — порядок их свойств может поменяться. Чтобы этого избежать, необходимо использовать атрибут [ordered]:
$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Есть и другие варианты создания объекта: выше мы рассмотрели использование командлета Select-Object. Осталось разобраться с добавлением и удалением элементов. Сделать это для объекта из предыдущего примера довольно просто:
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
Командлет Add-Member позволяет добавлять ранее созданному объекту $object не только свойства, но и методы посредством использования конструкции «-MemberType ScriptMethod»:
$ScriptBlock = {
# код
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member
Обратите внимание: для хранения кода нового метода мы использовали переменную $ScriptBlock типа ScriptBlock.
Для удаления свойств используется соответствующий метод:
$object.psobject.properties.remove('Name')
Создание собственных классов
В PowerShell 5.0 появилась возможность определения классов с использованием характерного для объектно-ориентированных языков программирования синтаксиса. Для этого предназначено служебное слово Class, после которого следует задать имя класса и описать его тело в операторных скобках:
class MyClass
{
# тело класса
}
Это настоящий тип .NET Core, в теле которого описываются его свойства, методы и другие элементы. Рассмотрим пример определения простейшего класса:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
}
Для создания объекта (экземпляра класса) используется командлет New-Object, либо литерал типа [MyClass] и псевдостатический метод new (конструктор по умолчанию):
$object = New-Object -TypeName MyClass
или
$object = [MyClass]::new()
Проанализируем структуру объекта:
$object | Get-Member
Не стоит забывать про область видимости: нельзя ссылаться на имя типа в виде строки или использовать литерал типа за пределами скрипта или модуля, в котором определен класс. При этом функции могут возвращать экземпляры класса (объекты), которые будут доступны вне модуля или скрипта.
После создания объекта заполним его свойства:
$object.Name = 'Ivan Danko'
$object.City = 'Moscow'
$object.Country = 'Russia'
$object
Отметим, что в описании класса задаются не только типы свойств, но и их значения по умолчанию:
class Example
{
[string]$Name = 'John Doe'
}
Описание метода класса напоминает описание функции, но без использования служебного слова function. Как и в функции, в методы при необходимости передаются параметры:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
#описание метода
Smile([bool]$param1)
{
If($param1) {
Write-Host ':)'
}
}
}
Теперь представитель нашего класса умеет улыбаться:
$object = [MyClass]::new()
$object.Smile($true)
Методы можно перегружать, кроме того у класса бывают статические свойства и методы, а также конструкторы, имена которых совпадают с именем самого класса. Определенный в скрипте или модуле PowerShell класс может служить базовым для другого — так реализуется наследование. При этом в качестве базовых допускается использование существующих классов .NET:
class MyClass2 : MyClass
{
#тело нового класса, базовым для которого является MyClass
}
[MyClass2]::new().Smile($true)
Наше описание работы с объектами в PowerShell трудно назвать исчерпывающем. В следующих публикациях попробуем его углубить на практических примерах: пятая статья цикла будет посвящена вопросам интеграции PowerShell со сторонними программными компонентами. Прошлые части можно найти по ссылкам ниже.
Часть 1: основные возможности Windows PowerShell
Часть 2: введение в язык программирования Windows PowerShell
Часть 3: передача параметров в скрипты и функции, создание командлетов
Фильтрация в Powershell с Select-Object на примерах
Команда Powershell Select-Object фильтрует вывод информации. Когда Where-Object выступает в качестве условий, через который проходит объект, Select-Object используется для фильтрации колонок и строк. Эта команда так же позволяет выводить дополнительные свойства, так как по умолчанию команды Powershell выводят не все свойства.
Если вы посмотрите свойства, который хранит объект, то увидите что их намного больше чем выводится по умолчанию:
Get-Service | Get-Member -MemberType *Property*
Для вывода всех свойств понадобится использовать Select-Object:
Get-Service -Name WinRM
Get-Service -Name WinRM | Select-Object -Property *
Знак ‘*’ говорит, что нам нужно вывести все свойства. Вы так же можете заметить, что вывод в виде строки, а не таблицы. В некоторых случаях Powershell сам меняет формат отображения на список. Если нам нужна таблица добавьте Format-Table, но такой формат может быть сложно читаем:
Get-Service -Name WinRM | Select-Object -Property * | Format-Table
Что бы сделать вывод более читаемым можно указать только определенные колонки:
Get-Service -Name WinRM | Select-Object Name, RequiredServices | Format-Table
Параметр Property первый принимает значения и поэтому его не обязательно указывать.
Когда нужно вывести все колонки, кроме определенных можно использовать параметр ExcludeProperty:
Get-Service -Name WinRM | Select-Object * -ExcludeProperty ServiceName,Status,Name| ft
Алиасы
Эта команда имеет один алиас в виде Select:
Get-Process | Select Name, Path
Выражения и скрипты
Нам не обязательно указывать существующие свойства, можно использовать выражения. Один из самых очевидных примеров это то, что мы можем добавлять колонки с новыми значениями. Ниже пример где мы выводим еще одну колонку изменив число:
$num = @(1,2,3,4)
$num | select-object -Property {$PSItem+1}
$PSItem это значение, которое проходит через конвейер. Вы можете знать второй способ написания в виде «$_».
Колонка имеет имя по умолчанию, что бы изменить это разделим выражение на Label, где укажем имя и выражение Expression:
$num | select-object -Property @{Label="Значение + 1"; Expression={$PSItem+1}}
По сути мы имеем формат hashtable. Более наглядные примеры мы можем увидеть, когда нам нужно перевести один тип значений в другой.
Когда мы выполняем команду Get-Volume мы получаем список разделов, общее и свободное пространство. Добавим колонку, которая будет показывать процент свободного пространства:
Get-Volume | select -Property DriveLetter, @{Label='Free'; Expression = {[string]([int]($_.SizeRemaining/$_.Size*100)) + " %"}}
Выше уже упоминалось, что этот тип похож на hashtable. Мы можем вывести выражение в отдельную строку и просто вставить его в select:
$free = @{Label='Free'; Expression = {[string]([int]($_.SizeRemaining/$_.Size*100)) + " %"}}
Get-Volume | select -Property DriveLetter, $free
Такой же пример можно использовать и с процессами, где значения отображаются в Кб. На примере ниже я конвертирую в Мб:
Get-Process | Select-Object -Property Name, @{Label='WS(MB)'; Expression={$PSItem.WS/1Mb}}
Если вам нужны значения в GB или другом размере просто замените их в выражении. Если нужно округлить, можно использовать [int] так же как я это делал в предыдущем примере.
InputObject
Так же как и любые другие командлеты работающие через конвейер этот тоже имеет параметр InputObject. С помощью его мы можем использовать командлет без конвейера:
$data = Get-Host
Select-Object -Property Name -InputObject $data
Такое написание аналогично этому:
$data = Get-Host
$data | Select-Object -Property Name
ExpandProperty
Для примера рассмотрим ситуацию, где элемент хранит несколько значений. Это будет выглядеть так:
$hash = [pscustomobject]@{Type='array'; collection=@(1,2,3,4,5)}
$hash | Select-Object -Property $PSItem
Если мы хотим вывести все значения хранящиеся в Collection это нужно делать через метод ExpandProperty:
$hash = [pscustomobject]@{Type='array'; collection=@(1,2,3,4,5)}
$hash | Select-Object -Property Type -ExpandProperty collection
Дополнительные параметры
У нас есть два параметра, с помощью которых мы можем получать первые и последние элемент из объекта. Это параметры:
- First — получение элементов с начала;
- Last — получение элементов с конца.
Я не могу придумать пример без использования сортировки Powershell Sort-Object, поэтому пример ниже с ним. Мы возвращаем процесс, который имеет наибольшее значение PM:
Get-Process | Sort-Object WS -Descending | Select-Object -First 1
Есть возможность использовать индексы указав Index. В предыдущем примере мы получили первый элемент с использованием First, аналогичный пример с индексами:
Get-Process | Sort-Object WS -Descending | Select-Object -Index 0
Условия не совсем подходят для использования с Select, но это можно делать. Например у нас есть команда Get-NetTCPConnection, которая получает список сетевых сеансов с отображением портов и идентификаторов процессов:
Get-NetTCPConnection
С помощью условий заменим колонку RemotePort на имена протоколов:
$prot = @{Label='LocalPortName'; Expression={
if ($PSItem.LocalPort -eq 443){'HTTPS'}
elseif ($PSItem.LocalPort -eq 80){'HTTP'}
elseif ($PSItem.LocalPort -eq 22){'SSH'}
elseif ($PSItem.LocalPort -eq 53){'DNS'}
elseif ($PSItem.LocalPort -eq 389){'LDAP'}
elseif ($PSItem.LocalPort -eq 135){'LOC-SRV'}
}
}
Get-NetTCPConnection | Select-Object -Property LocalAddress,OwningProcess,LocalPort,$prot,RemotePort | Sort-Object -Descending LocalPortName | ft
Обратите внимание, что сортировка применяется после создания колонки, а не до (как это было показано в другом примере).
Логично было бы использовать условия в виде switch в Powershell. Аналогичный пример, но со switch:
$prot = @{Label='LocalPortName'; Expression={
switch($PSItem.LocalPort){
443 {'HTTPS'}
80 {'HTTP'}
22 {'SSH'}
53 {'DNS'}
389 {'LDAP'}
135 {'LOC-SRV'}
}
}
}
Get-NetTCPConnection | Select-Object -Property LocalAddress,OwningProcess,LocalPort,$prot,RemotePort | Sort-Object -Descending LocalPortName | ft
Как уже говорилось в начале статьи, where чаще применяется в качестве условий, а select фильтрует колонки, и может изменять значения. В какой последовательности использовать обе команды — зависит от разных случаев. Если мы еще точно не знаем какие колонки нам нужно вывести лучше использовать where первым:
Get-Package | where -Property Name -Like "*C++*" | select Version
Если бы мы изменили порядок, то у нас бы ничего не отобразилось:
Get-Package | select Version |where -Property Name -Like "*C++*"
Это связано с тем, что мы выполняем where для колонки, которой не существует (в select выбран только Version). Другие примеры вы можете посмотреть в статье Фильтрация через Where-Object в Powershell с примерами.
…Теги: #powershell
ОсновыPowerShell: Где | Where-Object {$ _. Property = statement} Фильтр
Windows PowerShell | Where-Object {$ _. Property -eq statement}
Я начал свою компьютерную карьеру в 1982 году с электронной таблицы под названием SuperCalc. Одной из самых полезных команд, которые я освоил, был оператор «Если», он отлично справлялся с фильтрацией данных. Теперь, хотя PowerShell также поддерживает оператор «If», я считаю, что конструкция PowerShell «Where-Object» гораздо более универсальна для фильтрации вывода.Давайте узнаем больше о «Где», изучив следующие практические примеры.
Темы PowerShell для PowerShell Где Заявление
Предварительные требования и контрольный список для PowerShell
В случае Windows 7 и более поздних версий вам не нужно загружать какие-либо дополнительные файлы, просто: «Добавить компонент» -> Windows PowerShell. Однако для более старых операционных систем существуют разные версии PowerShell для XP, Windows Server 2003 и Vista. Только для таких устаревших систем вам необходимо загрузить PowerShell с сайта Microsoft.
После того, как вы установили PowerShell 2.0 или новее, я рекомендую выбрать версию ISE (Integrated Scripting Engine), это избавит вас от покупки текстового редактора.
Пример фильтра PowerShell «Где-объект»
Хорошее время для добавления оператора «Где-объект» — это когда вам нужно отфильтровать список. Что мы собираемся сделать, так это получить список файлов с помощью GCI (Get-Childitem), а затем направить вывод в предложение «Where», которое фильтрует поток в соответствии со следующим условием: расширение файла равно.Exe.
Пример 1a: Предложение Where для поиска исполняемых файлов
# Фильтр PowerShell Where-Object для вывода списка исполняемых файлов C: \ program Files
GCI "C: \ Program Files" -рекурс | Where-Object {$ _. Extension -eq ".exe"}
Примечание 1: Возможно, эта слабость влияет только на меня, но всякий раз, когда я создаю заявление «Где» с нуля, я забываю ввести «Где» с | символ трубы.
Примечание 2: # (хэш) означает: «Здесь следует комментарий»
Пример 1b: где-объект заменен на «?»
PowerShell имеет псевдонимы для общих командлетов; «?» И «Где» — это псевдонимы для Where-Object, возможно, вы уже знаете gci для Get-ChildItem.
# PowerShell Где скрипт для вывода списка exe файлов C: \ Program Files
Clear-Host
$ GuyDir = "C: \ Program Files"
$ FilesExe = gci $ GuyDir -recurse
$ List = $ FilesExe | ? {$ _. Extension -eq ".exe"}
$ Список | Сортировка-объект -уникальность | Имя форматной таблицы
Пункты обучения инструкции Where в PowerShell
Примечание 3: Многие сценаристы PowerShell предпочитают вводить один символ, а именно вопросительный знак «?» Вместо «Где» или «Где-объект».Однако я предпочитаю использовать полное слово «Где», потому что оно упрощает чтение сценария, особенно когда остальная часть сценария является новой или сложной.
Примечание 4: Если вам нравятся сокращения, PowerShell имеет множество псевдонимов для общих команд, например, gci для Get-ChildItem. В примере 1b мы могли бы также использовать «ft» вместо Format-Table. Кроме того, я в основном использую обычную «сортировку», а не Sort-Object.
Примечание 5: Я не могу выделить достаточно, всегда не забывайте вводить оператор where с вертикальной чертой, следовательно,
….. | Где {$ _ ……
Примечание 6: Посмотрите, как сортировка и форматирование могут улучшить вывод. Чтобы понять, что я имею в виду, сравните Пример 1a с Примером 1b.
Задача 1: Измените расширение файла для фильтрации с «.exe» на «.dll»
Задача 2: Изменение: где {$ _. Extension -eq «.exe»} на Где {$ _ .name -eq «ReadMe»} Подробнее о $ _ в PowerShell.
Задача 3: Попробуйте изменить расположение с C: \ program files на папку по вашему выбору.Если вы примете этот вызов, подумайте также об изменении расширения файла.
Guy рекомендует: Network Performance Monitor (БЕСПЛАТНАЯ ПРОБНАЯ ПЕРЕДАЧА)
SolarWinds Network Performance Monitor ( NPM) поможет вам узнать, что происходит в вашей сети. Эта утилита также поможет вам в устранении неполадок; на приборной панели будет указано, является ли основная причина неисправной ссылкой, неисправным оборудованием или перегрузкой ресурсов.
Что мне больше всего нравится, так это то, как NPM предлагает решения сетевых проблем.Он также имеет возможность отслеживать состояние отдельных виртуальных машин VMware. Если вы заинтересованы в устранении неполадок и создании сетевых карт, я рекомендую вам попробовать NPM в 30-дневной бесплатной пробной версии.
SolarWinds Network Performance Monitor Загрузить 30-дневную БЕСПЛАТНУЮ пробную версию
PowerShell «Где » Примеры Этот фильтр Объекты WMI
Еще одна ситуация, в которой можно использовать выражение «Где», — это когда мы исследуем объекты PowerShell.Чтобы взять пример сети, представьте, что наша цель — отобразить свойства TCP / IP, но у нас есть проблема — как называется объект WMI? Давайте начнем наши поиски с исследования объектов WMI. Мы уже знаем, что можем использовать WmiObject -List, но давайте уточним наш поиск, добавив оператор where.
Моя идея, связанная с приведением трех примеров достижения одной и той же цели, состоит в том, чтобы дать вам представление и проиллюстрировать, что не существует единого «правильного» способа кодирования PowerShell.
Пример 2а:
# PowerShell, где в сценарии WMI
Get-WmiObject -List | Где-Объект {$ _.название -Соответствие "Сеть"}
Пример 2b:
Gwmi -List | Где {$ _. Name -Match "Network"}
Примечание 7: Я не использую много псевдонимов, но для экономии места я часто использую простое «Где» вместо «Где-объект». Пример 2b
Пример 2c:
# PowerShell, где фильтр для вывода списка сетевых объектов WMI
Clear-Host
$ objNetwork = Get-WmiObject -List | Где {$ _. Name -Match "Network"}
$ objNetwork | Имя форматной таблицы
Учебные моменты для инструкции Where в PowerShell
Примечание 8: В большинстве инструкций «Где» используется «{$ _.xyz ’конструкция. Знак подчеркивания в долларах ($ _. Xyz) означает: «Возьмите xyz из текущего ввода».
Вторая половина утверждения касается оценки, которая обеспечивает желаемую фильтрацию. В этих примерах я использую -Match, но вы можете заменить, -eq (равно), -Like или любой другой из операторов сравнения PowerShell.
Note 9: Один урок, который я постоянно переучиваю, заключается в том, что каждое слово, символ или скобка PowerShell наполнено смыслом.Например, где {требуются фигурные скобки, а не эллиптические скобки}.
Гай рекомендует: бесплатный монитор WMI для PowerShell (БЕСПЛАТНЫЙ ИНСТРУМЕНТ)
Инструментарий управления Windows (WMI) — одно из скрытых сокровищ операционных систем Microsoft. К счастью, компания SolarWinds создала бесплатный монитор WMI для PowerShell , чтобы вы могли обнаружить эти жемчужины информации о производительности и, таким образом, улучшить свои сценарии PowerShell.
Не гадайте, какие счетчики WMI использовать при написании сценариев для операционной системы, Active Directory или Exchange Server.Попробуйте этот монитор WMI — это бесплатно.
SolarWinds WMI Monitor Скачать 100% бесплатный инструмент
Исследование Where-Object PowerShell
Фильтр where настолько распространен, что мы склонны забывать, что на самом деле это командлет с именем Where-Object, который имеет два псевдонима, во-первых, простой ‘where ‘, а во-вторых, вопросительный знак:’? ‘Я хочу сказать, что вы можете применить обычные методы исследования PowerShell Get-Help.
Lear-Host
Get-Help Where-Object -full
# Простая подсказка "где" тоже работает.
Справка напоминает нам, что Where-Object выполняет фильтрацию, проверяя {Scriptblock}. До PowerShell 3 я никогда не видел изолированного «где», получая ввод только через конвейер (|).
В результате этих знаний вы можете уточнить вывод вашего предложения where, подключившись к оператору Sort-Object.
Еще одно замечание: PowerShell использует свои собственные объекты сравнения, такие как -gt или -le, а не> или = <.
Другие командлеты объектов PowerShell
Вы можете использовать Get-Command для более подробного изучения семейства «Object» PowerShell.Мне нравится использовать фильтр -Noun, например:
Clear-Host
Get-Command -Noun object
Подробнее о самой Get-Command »
Краткое изложение статьи PowerShell« Где »
Одно из главных достоинств PowerShell — это возможность передавать вывод одной команды другой команде. Пункт «Где» предоставляет подходящее средство для тестирования этой техники прокладки трубопроводов и последующей фильтрации выходных данных. Умение заключается в том, чтобы экспериментировать, пока вы не получите именно тот список, который вам нужен.Кстати, освоение команды «Где» дает вам представление о модульной природе PowerShell. Как только вы овладеете ритмом команды: Выход | (pipe) where {$ _. property -condition «compare»}, то вы можете применить ту же конструкцию к множеству других сценариев PowerShell.
См. Другие примеры использования предложения «Где» в PowerShell:
Если вам нравится эта страница, поделитесь ею с друзьями
См. Дополнительные примеры командлетов «Объект» в PowerShell.
• Учебники по PowerShell • Синтаксис • PowerShell Где -Object • Foreach-Object • Бесплатный WMI Monitor
• New-Item • Remove-Item • ItemProperty • PowerShell New Object • Sort-Object • Group-Object
• PowerShell Splatting • Select-String • -replace string • Compare- Объект • Мера-Объект
Пожалуйста, напишите мне, если у вас есть лучший пример сценария.Также просьба сообщать о любых фактических ошибках, грамматических ошибках или неработающих ссылках, я буду рад исправить ошибку.
.PowerShell, где-объект и где метод
Переполнение стека- Около
- Товары
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
- Вакансии Программирование и связанные с ним технические возможности карьерного роста
- Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
- Реклама Обратитесь к разработчикам и технологам со всего мира
- О компании
Загрузка…
Где-объект — PowerShell — SS64.com
Где-объект — PowerShell — SS64.com Фильтровать входные данные из конвейера, определяя, какие объекты будут передаваться по конвейеру команд.
‘?’ symbol и Where являются псевдонимами для Where-Object.
Синтаксис Where-Object [-filterScript] { блок сценария } [-inputObject psobject ] [CommonParameters] Ключ -FilterScript блок сценария Выражение, которое разрешается в логическое значение (ИСТИНА / ЛОЖЬ).Это определит, какие входные объекты будут переданы по конвейеру команд. -inputObject psobject Объекты для фильтрации. Обычно объекты проходят через конвейер.
Знак «?» symbol и Where являются псевдонимами для Where-Object. Если вы явно хотите запустить команду Where-Object, запустите Where-object или ‘?’ .
Where-object определяет, какие объекты передавать по конвейеру, оценивая блок сценария, который может включать ссылку на фильтруемый объект.Если результат оценки True, обрабатываемый объект передается по конвейеру; в противном случае объект отбрасывается.
Выражение блока сценария может использовать любой из операторов сравнения PowerShell, если результат является логическим.
Также: -not logic not (с! В качестве псевдонима)
и -xor (Исключительное ИЛИ)
Отчет о сравнении
Оператор сравнения — это упрощенный синтаксис, который можно использовать для фильтрации конвейера. Ни {скобки}, ни заполнитель конвейера $ _ не требуются.Доступно в PowerShell 3.0 и выше.
Синтаксис команда | Где test1 [ concunction test2 ] Ключ конъюнкция Любое из следующего: (логические логические операторы) -and, -or (логическое или), -bor (побитовое или), -band (побитовое и), -xor Test1 Выражение, которое преобразуется в логическое значение (TRUE / FALSE). Test2 Выражение, которое преобразуется в логическое значение (TRUE / FALSE).операторы сравненияКак и выше, выражение может использовать любые операторы сравнения PowerShell, если результат является логическим.
Также: -not logic Not (с! В качестве псевдонима) и -xor (Исключающее ИЛИ)Например — для вывода списка файлов на диске f: больше 1000000 байт:
PS C: \> Get-ChildItem f: \ | где Длина -gt 1000000Что эквивалентно:
PS C: \> Get-ChildItem f: \ | где {$ _. Length -gt 1000000}Аналогичным образом можно читать свойства:
PS C: \> (Get-ChildItem f: \).ДлинаВы не можете использовать этот упрощенный синтаксис для установки свойств.
Чтобы отфильтровать элементы с набором свойств (не пустым), просто укажите имя свойства:
PS C: \> Get-ADuser -Filter * | где DisplayName
Примеры
Получить список файлов, но исключить папки:
PS C: \> Get-ChildItem ‘C: \ Apps \’ -Recurse | Where-Object {-not $ _. PsIsContainer}
Получить список всех остановленных служб:
PS C: \> Get-Service | Где-Объект {$ _.стр. * ‘}
«Враг искусства — отсутствие ограничений» ~ Орсон Уэллс
Связанные командлеты PowerShell:
Синтаксис PowerShell — регулярные выражения
ForEach-Object — цикл для каждого объекта в конвейере.
Group-Object — Группируйте объекты, которые содержат одинаковое значение для общего свойства.
Select-Object — выбор объектов на основе параметров, заданных в командной строке командлета.
Sort-Object — Сортировка входных объектов по значению свойства.
Где (метод) — фильтровать входные данные из коллекции.
Авторские права © 1999-2020 SS64.com
Некоторые права защищены .
PowerShell 3.0 Где фильтр | Новый синтаксис
PowerShell 3.0 Упрощенное предложение Where
PowerShell 3.0 упрощает предложение «Where», не требуя ни {фигурных} скобок, ни заполнителя $ _. Xyz. Преимущество состоит в том, что новичкам становится проще писать сценарии PowerShell.
PowerShell 3.0 Где Примеры нового синтаксиса
♣
Пример 1: PowerShell v 3.0 Где Пример
Сценарий: Вы хотите перечислить файлы библиотеки динамической компоновки в системной папке Windows.
Пример 1a: Новый стиль PowerShell 3.0, где синтаксис
Get-Childitem C: \ Windows \ System32 | Где extension -eq .dll
Примечание 1: Что нового в PowerShell 3.0 — это более простой синтаксис
Где extension -eq .dll
Пример 1b: Старый стиль PowerShell 2.0 Где синтаксис
В PowerShell 2.0 для указанной выше команды потребуются три дополнительных элемента синтаксиса: {Фигурные скобки}, $ _. переменные и речевые метки около ‘ value ‘ :
Get-Childitem C: \ Windows \ System32 | Где {$ _. extension -eq ‘ .dll ‘}
Note 2: Я чувствую себя немного филистером, потому что предпочитаю полный синтаксис, как показано в примере 1b. Более короткий метод очень хорош, но я обнаружил, что он может вызвать у меня путаницу и внести ошибки.
Пример 2: PowerShell 3.0, где перечислены файлы .exe
# PowerShell 3.0 Фильтр «Где» для перечисления .exe в системной папке
Clear-Host
Get-ChildItem $ Env: WinDir | Где расширение -экв.exe
Примечание 3: $ Env: WinDir — это переменная среды, которая просто получает вашу папку Windows, даже если она находится в D: \ и даже если вы называете ее WindowsOld.
Задача: проверьте скорость двух методов
Вы можете обернуть всю команду в Measure-Command и, таким образом, сравнить скорость двух v2.0 ‘Where’ с новой v3.0 ‘Where.
Clear-Host
Measure-Command {
Get-ChildItem $ Env: WinDir | Где расширение -eq.exe
}
Measure-Command {
Get-ChildItem $ Env: WinDir | Where-Object {$ _. Extension -eq ‘.exe’}
}
Предложение: Я советую выполнить команду 3 или 4 раза, чтобы убедиться, что кеширование приводит к противоречивым результатам.
Guy рекомендует: Бесплатная пробная версия Network Performance Monitor (NPM) v11.5
SolarWinds Network Performance Monitor поможет вам узнать, что происходит в вашей сети. Эта утилита также поможет вам в устранении неполадок; на приборной панели будет указано, является ли основная причина неисправной ссылкой, неисправным оборудованием или перегрузкой ресурсов.
Что мне больше всего нравится, так это то, как NPM предлагает решения сетевых проблем. Он также имеет возможность отслеживать состояние отдельных виртуальных машин VMware. Если вы заинтересованы в устранении неполадок и создании сетевых карт, я рекомендую вам попробовать NPM прямо сейчас.
Загрузите бесплатную пробную версию монитора производительности сети Solarwinds
Пример 3: Где еще можно заменить на «?»
Вы можете еще больше упростить фильтр, заменив, например, вопросительный знак на команду «Где» 😕 расширение -eq.exe (вместо: Where extension -eq .exe). Использование знака вопроса такое же, как в PowerShell 2.0, а также использование псевдонима gci для Get-ChildItem.
# Windows PowerShell Где сценарий для вывода списка исполняемых файлов C: \ Program Files
$ FilesExe = gci «C: \ Program Files» -recurse
$ List = $ FilesExe | ? extension -eq .exe
$ Список | Сортировка-объект -уникальность | Format-Table Name, Directory -auto
Уроки для обучения PowerShell. Заявление
Примечание 4: Большинство людей, использующих PowerShell, предпочитают вводить знак вопроса «?» Вместо «Где».Однако я предпочитаю использовать полное слово «Где», потому что оно упрощает чтение сценария, особенно со сложными операторами.
Примечание 5: Если вам нравятся эти сокращения, PowerShell имеет множество псевдонимов для общих команд, например, в приведенном выше примечании к сценарию, gci для Get-ChildItem. Более того, мы могли бы использовать «ft» вместо Format-Table. Даже я обычно опускаю Object из Sort-Object и Where-Object.
Примечание 6: Я часто забываю ввести оператор where с вертикальной чертой, следовательно,
….. $ FilesExe | ? …… Пожалуйста, извлеките урок из моей ошибки!
Пример 4: PowerShell «Где » фильтрует объекты WMI
Другая ситуация, которая выигрывает от оператора «Где», — это когда мы исследуем объекты PowerShell. Чтобы взять пример сети, представьте, что наша цель — отобразить свойства TCP / IP, но у нас есть проблема — как называется объект WMI? Давайте начнем наши поиски с исследования объектов WMI. Мы уже знаем, что можем использовать WmiObject -List, но давайте уточним наш поиск, добавив оператор where.
Где Пример 4a
# Windows PowerShell, где в сценарии WMI
Get-WmiObject -List | Где имя -Match Network
Где Пример 4b
Еще раз, мы можем заменить «Где» вопросительным знаком; Я также добавил FT, чтобы выбрать только имя.
# PowerShell? (где) фильтр для вывода списка сетевых объектов WMI
Clear-Host
Get-WmiObject -List | ? имя -Match Network | FT name
Guy рекомендует: бесплатный WMI Monitor для PowerShell
Инструментарий управления Windows (WMI) — одно из скрытых сокровищ операционных систем Microsoft.К счастью, компания SolarWinds создала бесплатный монитор WMI, чтобы вы могли обнаружить эти жемчужины информации о производительности и, таким образом, улучшить свои сценарии PowerShell.
Догадайтесь, какие счетчики WMI использовать при написании сценариев для операционной системы, Active Directory или Exchange Server. Попробуйте этот монитор WMI — это бесплатно.
Загрузите бесплатную копию WMI Monitor
Researching PowerShell 3.0, Where-Object
PowerShell, выражение where настолько распространено, что мы часто забываем «?» И даже «Где» — это псевдонимы для командлета Where-Object.Преимущество этого понимания в том, что мы можем позвонить в Get-Help.
Get-Help Where-Object
И новая версия 3.0 «Where», и старая версия v 2.0 являются псевдонимами для командлета Where-Object.
Clear-Host
Get-Help Where-Object -full
# Простая подсказка «где» также работает.
Справка напоминает нам, что Where-Object выполняет фильтрацию, проверяя {Scriptblock}. Я никогда не видел «где» изолированно, он всегда получает ввод через конвейер (|).
Еще одно замечание: PowerShell использует свои собственные объекты сравнения, такие как -gt или -le, а не> или = <.
Дополнительные параметры Where-Object в PowerShell 3.0
Clear-Host
Get-Command Where-Object | Выберите -ExpandProperty ParameterSets |
Имя форматной таблицы
Примечание 7: Одним из интересных новых параметров в версии 3.0 является «In». Например, попробуйте:
2 -In 1..10
PowerShell 3.0 Where-Object с Get-ChildItem
Я предполагаю, что вы можете исследовать свойства командлета, добавив gm (Get-Member).Для первого эксперимента нам понадобится свойство «Extension», а позже нам понадобится LastAccessTime.
Эксперимент 1: Нам нужен список исполняемых файлов (.exe) в папке Windows.
Метод: Мы можем использовать простое предложение «Where» в PowerShell 3.0.
# PowerShell 3.0 Get-Childitem Где
Get-Childitem C: \ Windows | Где Extension -eq .exe
Guy рекомендует: Бесплатная программа массового импорта SolarWinds
Импортируйте пользователей из электронной таблицы.Просто укажите список пользователей с их полями в верхней строке и сохраните как файл .csv. Затем запустите эту БЕСПЛАТНУЮ утилиту и сопоставьте свои поля с атрибутами AD, щелкните и импортируйте пользователей.
При желании вы можете указать имя подразделения, в котором будут создаваться новые учетные записи. Загрузите БЕСПЛАТНЫЙ инструмент массового импорта.
Проблема с предложением Where в PowerShell 3.0
Следуя предыдущему примеру, можно подумать, что | Где LastTime.Year -gt 2012 предоставит список файлов, к которым был осуществлен доступ после 01.01.2013, но это не так.
# PowerShell 3.0 Где проблема
Get-Childitem C: \ Windows \ System | Где LastAccessTime.Year -gt 2012
Хотя приведенный выше пример завершается без ошибок, он не отображает никаких файлов. На всякий случай, если файлов нет, измените -gt на -lt, файлы все равно не появятся.
Решение: Вернуться к синтаксису PowerShell 2.0 Where. Запомните полный синтаксис: фигурные скобки}, $ _. переменная и «одиночный речевой знак».
# PowerShell 3.0 Проблема с предложением Где
Get-Childitem C: \ Windows \ System | Где {$ _.LastAccessTime.Year -gt ‘2012’}
Другие командлеты PowerShell, содержащие ‘Object’
Clear-Host
Get-Command -Noun object
Краткое изложение новой статьи PowerShell 3.0 ‘Where’
PowerShell 3.0 упрощает синтаксис заявление «Где». Нам больше не нужны ни {фигурные} скобки, ни заполнитель $ _. Xyz. В результате новичкам стало проще изучить PowerShell, и всем стало легче понимать предложения Where.
См. Другие примеры использования пункта «Где» в PowerShell:
Если вам нравится эта страница, поделитесь ею с друзьями
См. Дополнительные руководства по Microsoft PowerShell
• Учебники по PowerShell • Методы • Командлеты • PS Snapin • Профиль.ps1 • Exchange 2007
• Режим команд и выражений • Конвейер PowerShell (|) • PowerShell ‘where’ • PowerShell ‘Sort’
• Модули Windows PowerShell • Import-Module • Каталог модулей PowerShell
Если вы видите ошибку добрый, дайте мне знать. Пожалуйста, сообщайте о любых фактических ошибках, грамматических ошибках или неработающих ссылках.
.