PowerShell - [решено] Мониторы, выбрать нужное значение.

Аватара пользователя
Griboed0ff

PowerShell - [решено] Мониторы, выбрать нужное значение.

Сообщение Griboed0ff »

Всем доброго времени суток! Требуется получить информацию о модели\сн мониторов. Команды найдены и хорошо отрабатывают, но когда в конфигурации пк больше одного монитора, то отображается две, три модели\сн монитора в одну строку:

Код:

Код: Выделить всё

HP E231      LG IPS FULLHD

Я написал костыль, который раскидывает на две переменные, но понимаю, что это не так должно работать

Код:

Код: Выделить всё

$mn = gwmi wmimonitorid -Namespace root\wmi
$mmod1 = ([char[]]($mn.UserFriendlyName)-join "")[0..12];$mmod2 = ([char[]]($mn.UserFriendlyName)-join "")[13..26];$msn1 = ([char[]]($mn.SerialNumberID)-join "")[0..15];$msn2 = ([char[]]($mn.SerialNumberID)-join "")[16..32]

Пробовал по другому:

Код:

Код: Выделить всё

([System.Text.Encoding]::ASCII.GetString($wmiMonitorID.UserFriendlyName)).Replace("$([char]0x000)","")

тогда значения просто слитно

Код:

Код: Выделить всё

HP E231LG IPS FULLHD

Как правильно раскидать значения на переменные или выбрать только первое\второе?
Аватара пользователя
Griboed0ff

Re: PowerShell - [решено] Мониторы, выбрать нужное значение.

Сообщение Griboed0ff »

решение нашлось, опять невероятный костыль. Наверно есть более правильное решение, но тут получается, что модуль редактирован и работает как надо.

-костыль для первого монитора:

Код:

Код: Выделить всё

if ($wmiMonitorID.UserFriendlyName -ne $null)
{
    $dispname  = $null
    $dispname=([System.Text.Encoding]::ASCII.GetString($wmiMonitorID.UserFriendlyName)).Split("$([char]0x000)")|Select-Object -First 1
    $dispname
}
else
{
"NotSupported"
}

костыль для второго монитора:

Код:

Код: Выделить всё

if ($wmiMonitorID.UserFriendlyName.Length -gt 13)
{
    $dispname  = $null
    $dispname=((([System.Text.Encoding]::ASCII.GetString($wmiMonitorID.UserFriendlyName)).Replace("$([char]0x000)","&")).Split('&').where{$_} -join '&').split("&")[-1]
    $dispname
}
else
{
"NotSupported"
}
Аватара пользователя
DJ Mogarych

Re: PowerShell - [решено] Мониторы, выбрать нужное значение.

Сообщение DJ Mogarych »

Как достать нужное я уже описал выше. Но вас не понял, как все таки из строки с двумя моделями мониторов достать только первую модель или вторую. Ваш код отрабатывает так:

Код:

Код: Выделить всё

PS D:\PowerShell\pc_info> $monitors = Get-WmiObject WmiMonitorID -Namespace root\wmi 
$result = foreach ($monitor in $monitors) {
  $manufacturer = ($monitor.ManufacturerName -notmatch 0 |% {[char]$_}) -join ""
  $name = ($monitor.UserFriendlyName -notmatch 0 |% {[char]$_}) -join ""
  $serial = ($monitor.SerialNumberID -notmatch 0 |% {[char]$_}) -join ""
  "$Manufacturer,$Name,$Serial" |ConvertFrom-Csv -Header manufacturer,name,serial
}
$result.manufacturer[1]
$result.name[0]
GSM
H E31

Не понял как это работает $result.manufacturer[1], $result.name[0], квадратные скобки, я обычно ими выбираю нужные символы. По ссылке
Цитата DJ Mogarych:



https://community.spiceworks.com/top...-serial-number
PowerShell - [решено] Мониторы, выбрать нужное значение.




почитаю перевод, может дойдет до меня, что не так.
Аватара пользователя
Griboed0ff

Re: PowerShell - [решено] Мониторы, выбрать нужное значение.

Сообщение Griboed0ff »

Почитал по вашей ссылке, у них проблема другая. У меня все получается достать, просто не могу правильно форматировать. Есть пк, у него два монитора, команда обычно отрабатывает и выдает обе модели в одну строку. Мне нужно записать обе модели в разные переменные, для дальнейшей обработки. Фактически я уже добился этого таким кодом:

Код:

Код: Выделить всё

$mn = gwmi wmimonitorid -Namespace root\wmi 
[string]$mmod1 = ([char[]]($mn.UserFriendlyName)-join "")[0..12];
[string]$mmod2 = ([char[]]($mn.UserFriendlyName)-join "")[13..26];
$mmod1
$mmod2
HP E231      
LG IPS FULLHD

Но думал есть более красивые решения, для разделения строки на разные переменные.
Аватара пользователя
Griboed0ff

Re: PowerShell - [решено] Мониторы, выбрать нужное значение.

Сообщение Griboed0ff »

Цитата Griboed0ff:



думал есть более красивые решения
PowerShell - [решено] Мониторы, выбрать нужное значение.






Код:

Код: Выделить всё

$monitors = Get-WmiObject wmimonitorid -Namespace root\wmi|
%{[Text.Encoding]::Default.GetString( $_.UserFriendlyName)}
$monitors|%{"Мониторы на $env:COMPUTERNAME`:";$i=1}{"`t$i`: $_";$i++} 

Ну и соответственно:



Код:

Код: Выделить всё

$monitors    # тут все
$monitors[0] # тут первый
$monitors[1] # тут второй
# и т. д. 
Аватара пользователя
Fors1k

Re: PowerShell - [решено] Мониторы, выбрать нужное значение.

Сообщение Fors1k »

Цитата Griboed0ff:



как все таки из строки с двумя моделями мониторов достать только первую модель или вторую
PowerShell - [решено] Мониторы, выбрать нужное значение.






Код:

Код: Выделить всё

$result[0]
$result[1]
Аватара пользователя
DJ Mogarych

Re: PowerShell - [решено] Мониторы, выбрать нужное значение.

Сообщение DJ Mogarych »

Цитата DJ Mogarych:



$result[0]

$result[1]
PowerShell - [решено] Мониторы, выбрать нужное значение.




О, спасибо и ваш код заработал, только почему-то пропускает некоторые символы, например P, F, 2:

Код:

Код: Выделить всё

PS D:\PowerShell\pc_info> $monitors = Get-WmiObject WmiMonitorID -Namespace root\wmi -ComputerName "123-5445"
$result = foreach ($monitor in $monitors) {
  #$manufacturer = ($monitor.ManufacturerName -notmatch 0 |% {[char]$_}) -join ""
  $name = ($monitor.UserFriendlyName -notmatch 0 |% {[char]$_}) -join ""
  $serial = ($monitor.SerialNumberID -notmatch 0 |% {[char]$_}) -join ""
  "$Name,$Serial" |ConvertFrom-Csv -Header name,serial  #$Manufacturer,
}
$result[0]
$result[1]
name        serial      
----        ------      
H E31       6CM41R76    
LG IS ULLHD 610NTXRD7658


Цитата Fors1k:



$monitors[0] # тут первый

$monitors[1] # тут второй
PowerShell - [решено] Мониторы, выбрать нужное значение.




Спасибо, ваш код отработал без проблем:

Код:

Код: Выделить всё

$name = "123-5445"
$monitors = Get-WmiObject wmimonitorid -Namespace root\wmi -ComputerName $name|
%{[Text.Encoding]::Default.GetString( $_.UserFriendlyName)};%{$i=1;$i++}
$monitors[0] 
$monitors[1] 
HP E231      
LG IPS FULLHD
Аватара пользователя
Griboed0ff

Re: PowerShell - [решено] Мониторы, выбрать нужное значение.

Сообщение Griboed0ff »

дальше уже за гранью моего понимания. Хочу встроить код в готовый скрипт модуля get-systeminfo, так как он не умеет разделять мониторы, но умеет параллелить опрос множества пк. Как я понял модуль запрашивает всю инфу wmi, а далее уже выбирает нужное. То есть команды встречающиеся в скриптах идут без команды обращения к get-wmiObject. Изначально запускается командой:

Код:

Код: Выделить всё

Get-SystemInfo -computername $name -Properties MonitorName

далее скрипт запускается из скрипта

Код:

Код: Выделить всё

MonitorName=        '-Class wmiMonitorID -Script Monitor\MonName.ps1'

содержимое скрипта MonName.ps1

Код:

Код: Выделить всё

if ($wmiMonitorID.UserFriendlyName -ne $null)
{
    $dispname  = $null
    $dispname=([System.Text.Encoding]::ASCII.GetString($wmiMonitorID.UserFriendlyName)).Replace("$([char]0x000)","")
    $dispname
}
else
{
"NotSupported"
}

Когда пытаюсь изменить код, то начинаются сообщения типа (123-5445 имя пк):

Код:

Код: Выделить всё

ПРЕДУПРЕЖДЕНИЕ: 123-5445 Исключение при вызове "GetString" с "1" аргументами: "Массив не может быть неопределенным.
Имя параметра: bytes"



Код:

Код: Выделить всё

ПРЕДУПРЕЖДЕНИЕ: 123-5445 Не удается индексировать в объект типа System.String.

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



Статья на хабре, про модуль GET-SYSTEMINFO
Аватара пользователя
Griboed0ff

Re: PowerShell - [решено] Мониторы, выбрать нужное значение.

Сообщение Griboed0ff »

Griboed0ff, воспользуйтесь программой
WinAudit
, она поддерживает командную строку и умеет выгружать отчёты в csv, откуда потом можно достать что угодно.



Я уже ранее
упоминал эту программу в другой теме
, даже код приводил.
Аватара пользователя
DJ Mogarych

Re: PowerShell - [решено] Мониторы, выбрать нужное значение.

Сообщение DJ Mogarych »

Цитата DJ Mogarych:



воспользуйтесь программой WinAudit
PowerShell - [решено] Мониторы, выбрать нужное значение.




Спасибо, я обязательно рассмотрю данный вариант при будущих задачах. Но дело в том, что на powershell уже написан большой проект по сбору различной информации, не только сбор, но и различные условия для анализа, подмены значений, плюс интеграция с базой 1с. Как вы поняли я не могу сейчас изменить главный принцип сбора информации из-за второго монитора, все остальное корректно работает. Поэтому думал допилить малый кусок модуля, если с модулем не получится, то буду делить на два монитора уже результат в теле главного скрипта с условиями.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»