Трюки PowerShell. Часть 2
Пришло время продолжить бесконечную серию статей "Трюки PowerShell". В комментариях можете оставить пожелания к трюкам/задачам, которые хотели бы cделать в PowerShell. Итак, продолжим.
Поиск истории обновлений
Всякий раз, когда Windows устанавливает обновления через Windows Update, он регистрирует их, в Windowsupdate.log файле. С PowerShell можно разобрать этот файл. Вы должны использовать следующую команду, что б выяснить, сколько обновлений вы получили и в какие даты:
Get-Content $env:windir\windowsupdate.log | Where-Object { $_ -like '*successfully installed*'} | Foreach-Object { $_.Split("`t")[0] } | Group-Object –NoElement
Вот у меня такой результат (только поставил ОС и еще не успел обновится нормально):
Count Name
---------
1 2009-11-01
1 2010-01-27
21 2010-01-31
1 2010-04-05
Тут читается log файл, где выбираются только строки с ключевыми словами "successfully installed", извлекает дату установки, которая стоит в начале строки отделенная таб символом.
Получаем все IP адреса машины
Если вы хотите знать все IP адреса, назначенные на машину, надо использовать WMI:
Get-WMIObject win32_NetworkAdapterConfiguration | Where-Object { $_.IPEnabled -eq $true } | Select-Object IPAddress
Вы также можете подключаться к удаленным машинам и узнавать их IP адреса с помощью команды Get-WMIObject, которая поддерживает параметры -ComputerName и -Credential.
Создание диапазона чисел
С помощью PowerShell можно легко задать диапазон чисел, приведем пример преобразования ascii кодов в символы:
65..90 | Foreach-Object { "$([char]$_):" }
Вот результат моего выполнения:
A:
B:
C:
D:
E:
F:
G:
H:
I:
J:
K:
L:
M:
N:
O:
P:
Q:
R:
S:
T:
U:
V:
W:
X:
Y:
Z:
Проверяем существование ключа реестра
Если вы хотите, проверить, существует ли определенный ключ реестра, то вы должны помнить, что все ключи реестра, рассматриваются как папки на диске, поэтому у них есть пути. Их существование можно проверить так:
Test-Path HKCU:\Software\Testkey
Поиск сервисов
С WMI можно по ключевым словам осуществить поиск сервисов. Для примера покажем код, который выведет все сервисы со словом "cert" в описании:
Get-WmiObject win32_service -Filter 'Description like "%cert%"' | Select-Object Caption, StartMode, State, ExitCode
Вот мои сервисы, которые вывелись:
Caption StartMode State ExitCode
------- --------- ----- --------
BitLocker Drive ... Manual Stopped 1077
Certificate Prop... Auto Running 0
Cryptographic Se... Auto Running 0
Health Key and C... Manual Stopped 1077
Remote Desktop C... Manual Running
Чтение журнала системных событий.
Эта строка выведет все предупреждения (Wornings) из журнала событий:
Get-EventLog System | Where-Object { $_.EntryType -eq 'Warning' }
Эта команда работает, но неэффективно, потому, что занимает много времени. Потому, что она считывает все события а потом отфильтровует те, что вам надо. Та и набирать ее дольше чем следующую:
Get-EventLog System -EntryType Warning
Команда выше работает быстрее, поскольку сразу возвращает те события, которые нужно.
Использование переменной $null
Вы можете использовать $null в качестве специальной переменной, представляющей значение "ничего”. Вы можете использовать её, чтобы определить (и разобраться) не существующие данные, например:
Get-Process | Where-Object { $_.Company -ne $null } | Select-Object Name, Company
Если вы все еще получаете процессы с пустым значением имени компании, то вы видите на самом деле пустую строку. Если вы хотите также устраненить эту проблему пустых строк, то попробуйте выполнить следующее:
Get-Process | Where-Object { $_.Company -ne $null } | Where-Object { $_.Company -ne ''} | Select-Object Name, Company
P.S.
Я не выводил результаты выполнения всех команд, поскольку они очень большие, ну вы можете попробовать их у себя сами.