Войти

Показать полную графическую версию : [решено] Мониторы, выбрать нужное значение.


Griboed0ff
09-02-2021, 16:37
Всем доброго времени суток! Требуется получить информацию о модели\сн мониторов. Команды найдены и хорошо отрабатывают, но когда в конфигурации пк больше одного монитора, то отображается две, три модели\сн монитора в одну строку: 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
Как правильно раскидать значения на переменные или выбрать только первое\второе?

DJ Mogarych
09-02-2021, 16:59
$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]

https://community.spiceworks.com/topic/658220-get-monitor-manufacturer-model-and-serial-number

Griboed0ff
09-02-2021, 17:43
Как достать нужное я уже описал выше. Но вас не понял, как все таки из строки с двумя моделями мониторов достать только первую модель или вторую. Ваш код отрабатывает так: 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], квадратные скобки, я обычно ими выбираю нужные символы. По ссылке https://community.spiceworks.com/top...-serial-number »
почитаю перевод, может дойдет до меня, что не так.

Griboed0ff
09-02-2021, 18:06
Почитал по вашей ссылке, у них проблема другая. У меня все получается достать, просто не могу правильно форматировать. Есть пк, у него два монитора, команда обычно отрабатывает и выдает обе модели в одну строку. Мне нужно записать обе модели в разные переменные, для дальнейшей обработки. Фактически я уже добился этого таким кодом: $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 Но думал есть более красивые решения, для разделения строки на разные переменные.

Fors1k
09-02-2021, 19:00
думал есть более красивые решения »
$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] # тут второй
# и т. д.

DJ Mogarych
09-02-2021, 21:13
как все таки из строки с двумя моделями мониторов достать только первую модель или вторую »

$result[0]
$result[1]

Griboed0ff
10-02-2021, 07:27
$result[0]
$result[1] »
О, спасибо и ваш код заработал, только почему-то пропускает некоторые символы, например 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

$monitors[0] # тут первый
$monitors[1] # тут второй »
Спасибо, ваш код отработал без проблем: $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
10-02-2021, 09:22
дальше уже за гранью моего понимания. Хочу встроить код в готовый скрипт модуля get-systeminfo, так как он не умеет разделять мониторы, но умеет параллелить опрос множества пк. Как я понял модуль запрашивает всю инфу wmi, а далее уже выбирает нужное. То есть команды встречающиеся в скриптах идут без команды обращения к get-wmiObject. Изначально запускается командой:Get-SystemInfo -computername $name -Properties MonitorNameдалее скрипт запускается из скрипта MonitorName= '-Class wmiMonitorID -Script Monitor\MonName.ps1' содержимое скрипта MonName.ps1if ($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 (https://habr.com/ru/post/357974/)

DJ Mogarych
10-02-2021, 10:18
Griboed0ff, воспользуйтесь программой WinAudit (http://www.parmavex.co.uk/winaudit.html), она поддерживает командную строку и умеет выгружать отчёты в csv, откуда потом можно достать что угодно.

Я уже ранее упоминал эту программу в другой теме (http://forum.oszone.net/showthread.php?p=2935105&highlight=winaudit#post2935105), даже код приводил.

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

Griboed0ff
10-02-2021, 12:34
решение нашлось, опять невероятный костыль. Наверно есть более правильное решение, но тут получается, что модуль редактирован и работает как надо.
-костыль для первого монитора: 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"
}




© OSzone.net 2001-2012