Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Мониторы, выбрать нужное значение.

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

Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


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

Отправлено: 16:37, 09-02-2021

 

Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
$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

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Последний раз редактировалось DJ Mogarych, 09-02-2021 в 17:05.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:59, 09-02-2021 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


Как достать нужное я уже описал выше. Но вас не понял, как все таки из строки с двумя моделями мониторов достать только первую модель или вторую. Ваш код отрабатывает так:
Код: Выделить весь код
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 »
почитаю перевод, может дойдет до меня, что не так.

Отправлено: 17:43, 09-02-2021 | #3


Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


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


Отправлено: 18:06, 09-02-2021 | #4


Аватара для Fors1k

Старожил


Сообщения: 193
Благодарности: 112

Профиль | Отправить PM | Цитировать


Цитата 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] # тут второй
# и т. д. 
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:00, 09-02-2021 | #5


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


Цитата Griboed0ff:
как все таки из строки с двумя моделями мониторов достать только первую модель или вторую »
Код: Выделить весь код
$result[0]
$result[1]

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 21:13, 09-02-2021 | #6


Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата 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 в 07:36.


Отправлено: 07:27, 10-02-2021 | #7


Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


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


Отправлено: 09:22, 10-02-2021 | #8


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


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

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

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:18, 10-02-2021 | #9


Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


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

Отправлено: 10:56, 10-02-2021 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Мониторы, выбрать нужное значение.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Как получить значение параметра из реестра, добавить значение в текстовый файл etc.? Dark Ange1 Скриптовые языки администрирования Windows 28 22-06-2022 14:37
Обновление БИОС - как выбрать нужное egorus2010 Материнские платы и память 4 17-06-2021 12:15
Загрузка - XP SP3. Значение «громкость» сбрасывается в среднее значение при перезагрузке. mitkadritka Microsoft Windows 2000/XP 9 24-02-2012 20:37
Wireless - [решено] Помогите выбрать нужное оборудование Vlademort Сетевое оборудование 7 24-03-2011 12:06
Нужна програма для автоматического скачивание из интернета в нужное время нужное мест Месроп Хочу все знать 6 10-12-2009 21:19




 
Переход