Разное

Powershell where: Использование в PowerShell Where, Where-Object, ?

30.04.2021

Содержание

Использование в 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-Process, позволяющий получить информацию о работающих в системе процессах:

Он выведет на экран некие отформатированные текстовые данные, не дающие представления о свойствах возвращаемых объектов и их методах. Для тонкого препарирования вывода необходимо научиться исследовать структуру объектов и в этом нам поможет командлет 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. С его помощью можно выбрать единичные объекты или определенные свойства, а также создать на их основе новые объекты. Разберем работу командлета на простых примерах.

Следующая команда выводит информацию о 10 процессах, потребляющих максимальный объем оперативной памяти (свойство WS):

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*

Получение свойств в Powershell

Для вывода всех свойств понадобится использовать Select-Object:


Get-Service -Name WinRM
Get-Service -Name WinRM | Select-Object -Property *

Пример с Powershell Select-Object

Знак ‘*’ говорит, что нам нужно вывести все свойства. Вы так же можете заметить, что вывод в виде строки, а не таблицы. В некоторых случаях Powershell сам меняет формат отображения на список. Если нам нужна таблица добавьте Format-Table, но такой формат может быть сложно читаем:


Get-Service -Name WinRM | Select-Object -Property * | Format-Table

Пример с форматированием Powershell Select-Object

Что бы сделать вывод более читаемым можно указать только определенные колонки:


Get-Service -Name WinRM | Select-Object Name, RequiredServices | Format-Table

Пример с форматированием Powershell Select-Object

Параметр Property первый принимает значения и поэтому его не обязательно указывать.

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


Get-Service -Name WinRM | Select-Object * -ExcludeProperty ServiceName,Status,Name| ft

Пример с ExcludeProperty Powershell Select-Object

Алиасы

Эта команда имеет один алиас в виде Select:


Get-Process | Select Name, Path

Пример с алиасом Powershell Select

Выражения и скрипты

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


$num = @(1,2,3,4)
$num | select-object -Property {$PSItem+1}

Пример с выражением Expression Powershell Select-Object

$PSItem это значение, которое проходит через конвейер. Вы можете знать второй способ написания в виде «$_».

Колонка имеет имя по умолчанию, что бы изменить это разделим выражение на Label, где укажем имя и выражение Expression:


$num | select-object -Property @{Label="Значение + 1"; Expression={$PSItem+1}}

Expression Powershell Select-Object

По сути мы имеем формат hashtable. Более наглядные примеры мы можем увидеть, когда нам нужно перевести один тип значений в другой.

Когда мы выполняем команду Get-Volume мы получаем список разделов, общее и свободное пространство. Добавим колонку, которая будет показывать процент свободного пространства:


Get-Volume | select -Property DriveLetter, @{Label='Free'; Expression = {[string]([int]($_.SizeRemaining/$_.Size*100)) + " %"}}

Пример с Expression Powershell Select-Object

Выше уже упоминалось, что этот тип похож на hashtable. Мы можем вывести выражение в отдельную строку и просто вставить его в select:


$free = @{Label='Free'; Expression = {[string]([int]($_.SizeRemaining/$_.Size*100)) + " %"}}
Get-Volume | select -Property DriveLetter, $free

Пример с Expression Powershell Select-Object

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


Get-Process | Select-Object -Property Name, @{Label='WS(MB)'; Expression={$PSItem.WS/1Mb}}

Пример с Expression Powershell Select-Object добавление колонки

Если вам нужны значения в GB или другом размере просто замените их в выражении. Если нужно округлить, можно использовать [int] так же как я это делал в предыдущем примере.

InputObject

Так же как и любые другие командлеты работающие через конвейер этот тоже имеет параметр InputObject. С помощью его мы можем использовать командлет без конвейера:


$data = Get-Host
Select-Object -Property Name -InputObject $data

Пример с Powershell Select-Object InputObject

Такое написание аналогично этому:


$data = Get-Host
$data | Select-Object -Property Name

ExpandProperty

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


$hash = [pscustomobject]@{Type='array'; collection=@(1,2,3,4,5)}
$hash | Select-Object -Property $PSItem

Пример с Powershell Select-Object hashtable

Если мы хотим вывести все значения хранящиеся в Collection это нужно делать через метод ExpandProperty:


$hash = [pscustomobject]@{Type='array'; collection=@(1,2,3,4,5)}
$hash | Select-Object -Property Type -ExpandProperty collection

Пример с Powershell Select-Object pscutomobject

Дополнительные параметры

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

  • First — получение элементов с начала;
  • Last — получение элементов с конца.

Я не могу придумать пример без использования сортировки Powershell Sort-Object, поэтому пример ниже с ним. Мы возвращаем процесс, который имеет наибольшее значение PM:


Get-Process | Sort-Object WS -Descending | Select-Object -First 1

Пример с Powershell Select-Object First

Есть возможность использовать индексы указав Index. В предыдущем примере мы получили первый элемент с использованием First, аналогичный пример с индексами:


Get-Process | Sort-Object WS -Descending | Select-Object -Index 0

Пример с Powershell Select-Object Index

 

Условия не совсем подходят для использования с Select, но это можно делать. Например у нас есть команда Get-NetTCPConnection, которая получает список сетевых сеансов с отображением портов и идентификаторов процессов:


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

Пример условий с Powershell Select-Object

Обратите внимание, что сортировка применяется после создания колонки, а не до (как это было показано в другом примере).

Логично было бы использовать условия в виде 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

Пример условий switch с Powershell Select-Object

 

Как уже говорилось в начале статьи, where чаще применяется в качестве условий, а select фильтрует колонки, и может изменять значения. В какой последовательности использовать обе команды — зависит от разных случаев. Если мы еще точно не знаем какие колонки нам нужно вывести лучше использовать where первым:


Get-Package | where -Property Name -Like "*C++*" | select Version

Пример where с Powershell Select-Object

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


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, где-объект и где метод

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
  5. Реклама Обратитесь к разработчикам и технологам со всего мира
  6. О компании

Загрузка…

    .

    Где-объект — 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

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

    .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *