Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] вопрос по VideoProcessor (http://forum.oszone.net/showthread.php?t=254095)

semen77 15-02-2013 15:00 2091146

вопрос по 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". Вот.

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

Iska 15-02-2013 16:12 2091234

Во-первых, убрать совершенно бессмысленный «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 2091261

Спасибо за ответ, кстати, мне помогли ещё вот таким вариантом:

Код:

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 2091356

Цитата:

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

Как было сформулировано задание — таково оказалось и решение. В предыдущем посте Вы это поняли. Выводы:
Цитата:

Цитата semen77
Ни одного 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 2091367

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

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

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

Iska 16-02-2013 05:33 2091701

semen77, ну, тогда это именно Ваш вариант. Заполняйте массив потребными наименованиями и пользуйте.

semen77 16-02-2013 16:22 2091980

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 2092054

Цитата:

Цитата semen77
On Error Resume Next »

Ох…


Время: 14:27.

Время: 14:27.
© OSzone.net 2001-