Что нового

вывод pnputil.exe

Tuxzer92

Новичок
Сообщения
63
Репутация
0
Всем привет.

Есть задача получить список подключенных устройств и узнать их ID + сколько их и установить драйверы в зависимости от их состояния.

Хочется узнать как можно проще получить:
Список подключенных устройств с нужными VID и PID(полный список, а не только их ID)
Посчитать сколько устройств с одними VID и PID и сколько с другими.
Узнать только VID и PID этих устройств(чтобы в дальнейшем их перезапускать по их ID)
Узнать их состояние, т.е.: Проблема, Запущено.

Пока есть такие мысли:
Код:
#include <Array.au3>
#include <Constants.au3>
#RequireAdmin

#pragma compile(Console, True)
Func _StdOut($pid)
    Local $data
  ProcessWaitClose($pid)
  $data = StdOutRead($pid)
  If $data Then
    Return $data
  Else
    MsgBox(0, "", "Не удалось получить вывод программы.")
    Exit(4)
  EndIf
EndFunc

Func _Encoding_ANSIToOEM($strText)
    Local $sBuffer = DllStructCreate("char[" & StringLen($strText) + 1 & "]")
    Local $aRet = DllCall("User32.dll", "int", "CharToOem", "str", $strText, "ptr", DllStructGetPtr($sBuffer))

    If Not IsArray($aRet) Then Return SetError(1, 0, '') ; DLL error
    If $aRet[0] = 0 Then Return SetError(2, $aRet[0], '') ; Function error

    Return DllStructGetData($sBuffer, 1)
EndFunc

$Title = "TEST"
$etc = @ScriptDir & "\etc\"
$DrvDamaskPath=$etc & "Drv\Damask\*.inf"
Global Const $IDSvetovod="FTDIBUS\VID_0403+PID_6001"
Global Const $IDamask="USB\VID_1A86&PID_7523"

Local $pid = Run("pnputil.exe /enum-devices /connected", "", @SW_HIDE, $STDOUT_CHILD) ;Выводим список подключенных устройств
Local $DataSearch = _StdOut($pid)
$ArrayDataSearch=StringSplit($DataSearch,@CRLF,0) ;Делим строки на подстроки
$NewArraySvetovod = _ArrayFindAll($ArrayDataSearch,$IDSvetovod,"","",0,1)
$NewArrayDamask = _ArrayFindAll($ArrayDataSearch,$IDamask,"","",0,1)
$CountDevicesSvetovod=Ubound($NewArraySvetovod)
$CountDevicesDamask=Ubound($NewArrayDamask)
ConsoleWrite(_Encoding_ANSIToOEM(" CheckConnDevices()>> Кол-во пультов ""Дамаск"": "& $CountDevicesDamask) & @CRLF)
_ArrayDisplay($NewArrayDamask)

for $i=0 To UBound($NewArrayDamask)-1
     msgbox(0,"D",$ArrayDataSearch[$NewArrayDamask[$i]])
Next

ConsoleWrite(_Encoding_ANSIToOEM(" CheckConnDevices()>> Кол-во пультов ""Световод"": "& $CountDevicesSvetovod) & @CRLF)
_ArrayDisplay($NewArraySvetovod)

for $i=0 To UBound($NewArraySvetovod)-1
      msgbox(0,"S",$ArrayDataSearch[$NewArraySvetovod[$i]])
Next


Тут у меня определяется кол-во пультов, их ID, но хочется это делать как-то более оптимально и меньшим-кол-вом кода, к примеру с помощью регулярок, но я не силен в них.
 

Вложения

  • 3 пульт.PNG
    3 пульт.PNG
    4.2 КБ · Просмотры: 2
  • ID второго пульта.PNG
    ID второго пульта.PNG
    2.7 КБ · Просмотры: 1
  • ID первого пульта.PNG
    ID первого пульта.PNG
    2.7 КБ · Просмотры: 2
  • ID третьего пульта.PNG
    ID третьего пульта.PNG
    4 КБ · Просмотры: 2
  • Два одинаковых пульта.PNG
    Два одинаковых пульта.PNG
    5 КБ · Просмотры: 2
  • Список устройств в pnputil.PNG
    Список устройств в pnputil.PNG
    22.1 КБ · Просмотры: 2
  • Три пульта.PNG
    Три пульта.PNG
    2.3 КБ · Просмотры: 2

vovsla

Осваивающий
Сообщения
605
Репутация
35
Информацию об устройствах и драйверах можно получить через WMI - Win32_PnPEntity и Win32_PnPSignedDriver
Для чего нужен VID?
 
Верх