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

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

Ответить
Настройки темы
PowerShell - [решено] извлечь данные о мониторах из реестра

Старожил


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

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


Изменения
Автор: Griboed0ff
Дата: 17-09-2021
Доброго всем времени суток! Есть задача получить данные о мониторах в винде, а именно модель и серийный номер. Данные хранятся в реестре ("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY") в бинарном виде. Есть батник DispEDID, который умеет считывать и переводить в читабельный вид модель и серийник. Проблема в том, что данный батник выдает данные только 1 монитора, а если их 2 или 3 то, покажет данные последнего. Мозгов переписать такой сложный батник не хватает. Подумал может эту задачу проще решить через ps, по идее надо просто снять данные, конвертировать на человеческий, отправить в .cvs

Отправлено: 12:07, 17-04-2020

 

Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Vadikan:
можно мозг сломать »
или глаза, как минимум

Цитата Griboed0ff:
как направить вывод в .csv, в виде таблицы как на картинке. »
Вывод в csv, просто. А про таблицы уже сказали.
Лучше так выводить:
Код: Выделить весь код
gcim wmimonitorid -name root\wmi|%{$n=1}{
    [pscustomobject]@{
        'Монитор' = $n
        'Модель'= -join [char[]]$_.UserFriendlyName
        'Серийный номер' = -join [char[]]$_.SerialNumberID
    }
    $n++
}|export-csv out.csv -notype -enc utf8 -d ';'

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 17-04-2020 в 19:36.

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

Отправлено: 19:31, 17-04-2020 | #11



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

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


Старожил


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

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


Цитата Iska:
приводит к лишним пробелам. Без приведения к [string] — отображение нормальное: »
в переписке такое решение:
Скрытый текст
$ofs="";[string][char[]] ($m.UserFriendlyName) -join ""
$ofs="";[string][char[]] ($m.SerialNumberID) -join ""

тоже без пробелов получается.

Цитата YuS_2:
Лучше так выводить: »
Спасибо! Мне как раз нужно было просто понятное представление.

что-то мне подсказывает, что сюда же можно сделать выведение информации о мак адресе\ах, которые есть на этом пк. Или лучше отдельную тему завести?

Отправлено: 08:20, 18-04-2020 | #12


Ветеран


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

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


Цитата Griboed0ff:
Или лучше отдельную тему завести? »
Или.

Отправлено: 08:39, 18-04-2020 | #13


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Griboed0ff:
$ofs="" »
автоматическая переменная, имеющая значение по умолчанию:
Цитата:
$OFS
$OFS is a special variable that stores a string that you want to use as an output field separator. Use this variable when you are converting an array to a string. By default, the value of $OFS is " ", but you can change the value of $OFS in your session, by typing $OFS="<value>". If you are expecting the default value of " " in your script, module, or configuration output, be careful that the $OFS default value has not been changed elsewhere in your code.
Examples:
PS> $a="1","2","3","4"
PS> $a
1
2
3
4

PS> [string]$a
1 2 3 4
PS> $OFS="";[string]$a
1234

PS> $OFS=",";[string]$a
1,2,3,4

PS> $OFS="--PowerShellRocks--";[string]$a
1--PowerShellRocks--2--PowerShellRocks--3--PowerShellRocks--4
PS> $OFS="`n`n";[string]$a
1

2

3

4

-------
scio me nihil scire. Ѫ

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

Отправлено: 08:48, 18-04-2020 | #14


Ветеран


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

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


YuS_2, с какой версии она появилась?

Отправлено: 11:51, 18-04-2020 | #15


Ветеран


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

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


Цитата Griboed0ff:
в переписке такое решение:
Код: Выделить весь код
$ofs="";[string][char[]] ($m.UserFriendlyName) -join ""
»
очередные заклинатели компьютеров писали
либо
Код: Выделить весь код
$ofs="";[string]
либо
Код: Выделить весь код
-join ""
И в мультимониторной конфигурации оно выдаст кашу в ответ

Лучше получать данные так:
Код: Выделить весь код
$ofs = ''
gwmi wmimonitorid -Namespace root\wmi | Select @{n='UserFriendlyName';e={([string][Char[]]$_.UserFriendlyName).SubString(0,$_.UserFriendlyNameLength)}}, @{n='SerialNumberID';e={[string][Char[]]$_.SerialNumberID}}
Как показывает практика, SerialNumberID не всегда то, что написано на наклейке, и может выдавать разное на разных разъёмах одного и того же монитора.
У встроенных мониторов (ноутбуки, моноблоки) нет ни модели, ни серийного номера.
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:06, 18-04-2020 | #16


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Iska:
с какой версии она появилась? »
с версии 2.0 она точно есть... правда там описание своеобразное:
$OFS
Цитата:
$OFS
----
Output Field Separator. Задает знак, разделяющий элементы
массива при преобразовании массива в строку.

Допустимые значения: любая строка.
Значение по умолчанию: пробел

По умолчанию переменная $OFS не существует и знаком-разделител
ем для выходных файлов является пробел, но пользователь может
добавить эту переменную и присвоить ей в качестве значения
любую строку.

ПРИМЕРЫ

Этот пример показывает, что при преобразовании массива в строку
для разделения значений используется пробел. В данном случае
массив целых чисел сохраняется в переменной, а затем переменная
приводится к типу string.

PS> $array = 1,2,3 # Сохраняется массив целых чисел.

PS> [string]$array # Массив приводится к типу string.
1 2 3 # Элементы разделяются пробелами


Чтобы изменить разделитель, добавьте переменную $OFS, назначив ей
значение. Для корректной работы переменная должна называться $OFS.

PS> $OFS = "+" # Создается переменная $OFS, ей присваивается значение "+"

PS> [string]$array # Команда повторяется
1+2+3 # Элементы разделяются знаками плюс


Чтобы восстановить поведение по умолчанию, можно присвоить пробел
(" ") в качестве значения переменной $OFS или удалить переменную.
Следующая команда удаляет переменную, затем выполняется проверка,
что разделителем является пробел.

PS> Remove-Variable OFS # Удаление переменной $OFS
PS>

PS> [string]$array # Команда повторяется
1 2 3 # Элементы разделяются пробелами

-------
scio me nihil scire. Ѫ

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

Отправлено: 16:33, 18-04-2020 | #17


Ветеран


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

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


YuS_2, спасибо, ясно. Значит, я как обычно «прощёлкал».

Нет, PowerShell точно повёрнутый на всю голову язык.

Отправлено: 17:58, 18-04-2020 | #18


Старожил


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

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


Цитата Busla:
И в мультимониторной конфигурации оно выдаст кашу в ответ
Лучше получать данные так: »
Код предложенный ранее и ваш выдают одинаковые значения на пк где 2 монитора.

Последний раз редактировалось Griboed0ff, 17-09-2021 в 15:33.


Отправлено: 09:51, 19-04-2020 | #19


Старожил


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

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


Цитата Busla:
Как показывает практика, SerialNumberID не всегда то, что написано на наклейке, и может выдавать разное на разных разъёмах одного и того же монитора.
У встроенных мониторов (ноутбуки, моноблоки) нет ни модели, ни серийного номера. »
как проводить инвентаризацию непонятно, но просматривать наклейки, а где-то их вообще и нет, не вариант.

Отправлено: 09:57, 19-04-2020 | #20



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - [решено] Как из архивного образа системы извлечь нужные данные реестра? ZurabK Microsoft Windows Vista 5 10-09-2020 12:08
Прочие БД - Восстановить или извлечь данные из Jetxxx.tmp, временного файла MS Access DB tweaxl Программирование и базы данных 2 18-06-2012 02:03
CMD/BAT - [решено] как извлечь все значения определенного ключа реестра из определенной ветки baza450 Скриптовые языки администрирования Windows 6 27-12-2011 13:41
HDD - Как извлечь данные с жёсткого диска Alla65 Накопители (SSD, HDD, USB Flash) 8 17-04-2009 18:27
MySQL - [решено] Извлечь данные одним запросом Strange_V Программирование и базы данных 4 20-02-2008 23:18




 
Переход