Показать полную графическую версию : [решено] вопрос по VideoProcessor
Нужна помощь корректно составить полный скрипт.
Есть скрипт возвращающий значение 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". Вот.
Соответственно, массив с значениями, как его жестко захардкодить в скрипте?
Как пробежаться по нему и выполнить условие?
Во-первых, убрать совершенно бессмысленный «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
Спасибо за ответ, кстати, мне помогли ещё вот таким вариантом:
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"
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
Смысл - определить, присутствует ли в системе хотя бы один видеоадаптер удовлетворяющий заданным условиям (простое перечисление некоторых моделей).
Если все присутствуют - вывести "Match"; (ситуация, когда оба адаптера присутствуют в проверочном списке)
Если присутствует хотя бы один - вывести "Match"; (ситуация наличия разных моделей, одна из которых отсутствует в проверочном списке, а другая присутствует)
А если же таких видеоадаптеров нет совсем - вывести "Don't Match". (ситуация, когда отсутствует одна или несколько моделей в проверочном списке)
Это тест видеосистемы средствами WMI, не более.
semen77, ну, тогда это (http://forum.oszone.net/post-2091356.html#post2091356) именно Ваш вариант. Заполняйте массив потребными наименованиями и пользуйте.
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
On Error Resume Next »
Ох…
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.