Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Мониторы, выбрать нужное значение. (http://forum.oszone.net/showthread.php?t=347924)

Griboed0ff 09-02-2021 16:37 2949426

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

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 2949433

Код:

$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/top...-serial-number

Griboed0ff 09-02-2021 17:43 2949447

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

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 »

почитаю перевод, может дойдет до меня, что не так.

Griboed0ff 09-02-2021 18:06 2949452

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

$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 2949462

Цитата:

Цитата Griboed0ff
думал есть более красивые решения »

Код:

$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 2949500

Цитата:

Цитата Griboed0ff
как все таки из строки с двумя моделями мониторов достать только первую модель или вторую »

Код:

$result[0]
$result[1]


Griboed0ff 10-02-2021 07:27 2949538

Цитата:

Цитата DJ Mogarych
$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

Цитата:

Цитата Fors1k
$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 2949542

дальше уже за гранью моего понимания. Хочу встроить код в готовый скрипт модуля 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

DJ Mogarych 10-02-2021 10:18 2949547

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

Я уже ранее упоминал эту программу в другой теме, даже код приводил.

Griboed0ff 10-02-2021 10:56 2949553

Цитата:

Цитата DJ Mogarych
воспользуйтесь программой WinAudit »

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

Griboed0ff 10-02-2021 12:34 2949569

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

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"
}



Время: 08:30.

Время: 08:30.
© OSzone.net 2001-