Powershell — Where, Where-Object позволяют проводить сложную фильтрацию на поиск чего-либо. В этой статье мы не будем затрагивать другие фильтры и разберем их в следующих статьях. А сегодня разберемся с Where и Where-Object.
Powershell — Where
Результат выполнения любого командлета в Powershell — это объект. И чаще всего при выводе он не один, а целый массив. Для фильтрации только определенных объектов используется Where. Where — это командлет стандартной фильтрации в Powershell. Он позволяет отфильтровать вывод на экран, используя конвейер. К слову Where является алиасом командлета Where-Object. Так алиасом является и знак вопроса.
Конвейер уже неоднократно появлялся в наших статьях. Если вы хотите хотите отдельную статью для него — пишите коммент!
На самом деле использование Where достаточно просто. Вы пишите сначала командлет, который что-то должен вывести, а потом пишите фильтр с помощью Where для него. Выглядит это так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
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 |
Как видно на примере вывелись сервисы, у которых статус эквивалентен «Running».
Еще один пример позволяет фильтровать файлы и папки с помощью оператора like:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Get-ChildItem | Where Name -like "*i*" Каталог: D:\Powershell Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 05.12.2019 14:45 custom script da---- 01.07.2019 12:11 Update KKT API for LK -a---- 26.03.2019 13:51 712 iisreset.ps1 -a---- 18.11.2019 18:08 8858 RegisterTestAbonentForMerchant.ps1 -a---- 27.06.2019 17:49 251 tryexecutefunction.ps1 -a---- 28.06.2019 13:38 590 tutorial_execute_function.ps1 |
В целом, думаю понятно как это теперь работает.
Where-Object
В данном случае ситуация обстоит немного сложнее, но и возможностей фильтрации здесь гораздо шире. Where-Object позволяет использовать так называемый FilterScript. Параметр позиционный и не обязателен для указания, но его возможности впечатляют. В недавней статье про перезапуск процесса в FilterScript используется фильтр Name. Давайте еще раз рассмотрим его:
1 2 3 4 5 |
get-service | Where-Object {$_.Name -like "Adobe*"} Status Name DisplayName ------ ---- ----------- Running AdobeARMservice Adobe Acrobat Update Service Running AdobeUpdateService AdobeUpdateService |
Таким образом можно фильтровать весьма точечно то, что вам нужно.
Знак ?
Так как знак вопроса так же является алиасом фильтра Where-Object, я просто приведу пример его использования и включим в фильтр $PSItem:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
Get-ChildItem | ? {$PSItem.name -like '*server*'} Каталог: C:\WINDOWS\system32 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 15.01.2020 18:17 3387392 AppXDeploymentServer.dll -a---- 15.09.2018 10:28 198656 ClipboardServer.dll -a---- 15.09.2018 10:28 348672 CloudDomainJoinDataModelServer.dll -a---- 15.08.2019 18:06 291328 CXHProvisioningServer.dll -a---- 15.09.2018 10:29 180224 dialserver.dll -a---- 15.09.2018 19:45 516472 DMRServer.dll -a---- 15.09.2018 10:29 308224 Dxpserver.exe -a---- 15.08.2019 18:06 701440 FrameServer.dll -a---- 15.09.2018 10:28 312320 LanguageOverlayServer.dll -a---- 15.09.2018 10:28 48224 LockScreenContentServer.exe -a---- 15.09.2018 19:45 458240 MDEServer.exe -a---- 15.09.2018 10:28 1544192 mmgaserver.exe -a---- 22.02.2019 17:44 518656 modernexecserver.dll -a---- 15.09.2018 10:28 259072 MTFServer.dll -a---- 15.09.2018 10:29 134144 raserver.exe -a---- 31.10.2019 18:17 1830200 rdpserverbase.dll -a---- 15.09.2018 10:28 144896 ResourcePolicyServer.dll -a---- 15.09.2018 10:28 46592 SortServer2003Compat.dll -a---- 03.04.2010 11:57 459104 SqlServerSpatial.dll -a---- 29.08.2013 16:02 768624 SqlServerSpatial110.dll -a---- 21.02.2014 6:27 774336 SqlServerSpatial120.dll -a---- 29.10.2016 5:20 732872 SqlServerSpatial130.dll -a---- 23.08.2017 0:14 732856 SqlServerSpatial140.dll -a---- 03.05.2018 6:42 736968 SqlServerSpatial150.dll -a---- 15.09.2018 19:45 36152 SyncAppvPublishingServer.exe -a---- 15.09.2018 10:29 1720 SyncAppvPublishingServer.vbs -a---- 31.10.2019 18:17 274432 SystemEventsBrokerServer.dll -a---- 15.09.2018 10:28 174592 TimeBrokerServer.dll -a---- 31.10.2019 18:17 1309696 webplatstorageserver.dll |
К слову переменная $_ является основной, в то время как $PSItem всего лишь аналог. Это нужно знать, возможно $PSItem вам будет удобней, но функциональной разницы между переменными нет.
Итог:
Where-Object является очень мощным инструментом фильтрации в Powershell. Имена сервисов можно находить зная лишь путь до exe-шника. Таким образом можно получить любую информацию о нужном вам файле, папке или сервисе. Достаточно правильно задать фильтр и результат в консоли вас приятно удивит. Если у вас остались вопросы, обязательно пишите их в комментариях. Спасибо за внимание, надеемся, что статья была полезной для вас! Подписывайтесь на нашу группу в ВК, а так же не забывайте про канал на youtube!