Войти

Показать полную графическую версию : [решено] вопрос по VideoProcessor


semen77
15-02-2013, 15:00
Нужна помощь корректно составить полный скрипт.
Есть скрипт возвращающий значение VideoProcessor в эхе:
On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_VideoController",,48)
For Each objItem in colItems
Wscript.Echo objItem.VideoProcessor
Next

Здорово! Но нужно, чтобы это значение, которое выводится, например "GeForce GTS 250", сравнивалось с другими значениями (моделей видеокарт) и если текущий VideoProcessor = VideoProcessor из массива, то вывести стандартный мессаджбокс "Match", в противном случае вывести "Don't Match". Вот.

Соответственно, массив с значениями, как его жестко захардкодить в скрипте?
Как пробежаться по нему и выполнить условие?

Iska
15-02-2013, 16:12
Во-первых, убрать совершенно бессмысленный «On Error Resume Next». Во-вторых, зачем Вам «Don't Match»? И что вообще даёт «Match»/«Don't Match» в информативном плане без знания какой именно это «Match»/«Don't Match»?! А если два адаптера?

Впрочем:
Option Explicit

Dim arrVideoProcessors
Dim strVideoProcessor

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim collSWbemObjectSet
Dim objSWbemObjectEx


arrVideoProcessors = Array( _
"GeForce GTS 250", _
"GeForce GTS 251", _
"GeForce GTS 252", _
"GeForce GTS 253", _
"GeForce GTS 254" _
)

strComputer = "."

Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_VideoController")

For Each objSWbemObjectEx In collSWbemObjectSet
'WScript.Echo objSWbemObjectEx.VideoProcessor

For Each strVideoProcessor In arrVideoProcessors
If strVideoProcessor = objSWbemObjectEx.VideoProcessor Then
WScript.Echo "Match"
Else
WScript.Echo "Don't Match"
End If
Next
Next

Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator = Nothing

WScript.Quit 0

semen77
15-02-2013, 16:45
Спасибо за ответ, кстати, мне помогли ещё вот таким вариантом:


On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_VideoController",,48)
For Each objItem in colItems
Wscript.Echo CheckVideoProcessor(objItem.VideoProcessor)
Next

Function CheckVideoProcessor(s)
Dim all
all = "GeForce GTS 240,GeForce GTS 250,GeForce GTS 260" 'разделитель - запятая!
If InStr("," & all & ",", "," & s & ",") > 0 Then
CheckVideoProcessor = "Match"
Else
CheckVideoProcessor = "Don't Match"
End If
End Function


Действительно, лишнее можно убрать. Но вы совершенно верно заметили по поводу второй проблемы:"Если 2 видеоадаптера..."
В теории 3 варианта возможно:
1. Все VideoProcessor есть в массиве --> "Match"
2. Хотя бы один VideoProcessor есть в массиве --> "Match"
3. Ни одного VideoProcessor нет в массиве --> "Don't Match"
Проблема.
Как её решить... вот вопрос.

P.S.: Проверил ваш скрипт - он не корректно отрабатывает, сначала выводит "Match", нажимаем Ok - и 5 раз подряд получаем "Don't Match"

Iska
15-02-2013, 18:44
P.S.: Проверил ваш скрипт - он не корректно отрабатывает, сначала выводит "Match", нажимаем Ok - и 5 раз подряд получаем "Don't Match" »
Как было сформулировано задание (http://forum.oszone.net/post-2091146.html#post2091146) — таково оказалось и решение. В предыдущем посте Вы это поняли. Выводы:
Ни одного VideoProcessor нет в массиве --> "Don't Match" »
сделали, задачу сформулировали. Однако глубинный смысл и этого ТЗ мне по-прежнему не понятен.

Решение (в упрощённом виде):
Option Explicit

Dim arrVideoProcessors
Dim strVideoProcessor

Dim objSWbemObjectEx

Dim boolFound


arrVideoProcessors = Array( _
"GeForce GTS 250", _
"GeForce GTS 251", _
"GeForce GTS 252", _
"GeForce GTS 253", _
"GeForce GTS 254" _
)

boolFound = False

For Each objSWbemObjectEx In WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2").ExecQuery("SELECT * FROM Win32_VideoController")
For Each strVideoProcessor In arrVideoProcessors
If strVideoProcessor = objSWbemObjectEx.VideoProcessor Then
boolFound = True

Exit For
End If
Next

If boolFound Then Exit For
Next

If boolFound Then
WScript.Echo "Match"
Else
WScript.Echo "Don't Match"
End If

WScript.Quit 0

semen77
15-02-2013, 18:56
Смысл - определить, присутствует ли в системе хотя бы один видеоадаптер удовлетворяющий заданным условиям (простое перечисление некоторых моделей).

Если все присутствуют - вывести "Match"; (ситуация, когда оба адаптера присутствуют в проверочном списке)
Если присутствует хотя бы один - вывести "Match"; (ситуация наличия разных моделей, одна из которых отсутствует в проверочном списке, а другая присутствует)
А если же таких видеоадаптеров нет совсем - вывести "Don't Match". (ситуация, когда отсутствует одна или несколько моделей в проверочном списке)

Это тест видеосистемы средствами WMI, не более.

Iska
16-02-2013, 05:33
semen77, ну, тогда это (http://forum.oszone.net/post-2091356.html#post2091356) именно Ваш вариант. Заполняйте массив потребными наименованиями и пользуйте.

semen77
16-02-2013, 16:22
Iska, Отлично! В качестве альтернативы можно и так написать:

On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_VideoController",,48)
match = False 'в начале - нет совпадений
For Each objItem in colItems
match = match Or CheckVideoProcessor(objItem.VideoProcessor)
Next
If match Then
Wscript.Echo "Match"
Else
Wscript.Echo "Don't Match"
End If

Function CheckVideoProcessor(s)
Dim all
all = "GeForce GTS 240,GeForce GTS 250,GeForce GTS 260" 'разделитель - запятая!
CheckVideoProcessor = InStr("," & all & ",", "," & s & ",") > 0
End Function

Iska
16-02-2013, 17:48
On Error Resume Next »
Ох…




© OSzone.net 2001-2012