-1

Я уже часами гуглил, но не смог найти ответ.

'ServerSelection values
ssDefault = 0
ssManagedServer   = 1
ssWindowsUpdate   = 2
ssOthers          = 3

'InStr values
intSearchStartChar = 1

dim strTitle

Set updateSession = CreateObject("Microsoft.Update.Session")
Set updateSearcher = updateSession.CreateupdateSearcher()

updateSearcher.ServerSelection = ssWindowsUpdate
Set searchResult = updateSearcher.Search("IsInstalled=0 and Type='Software'")

For I = 0 To searchResult.Updates.Count-1
Set update = searchResult.Updates.Item(I)

If update.Title = "Intel Corporation driver update for Intel(R) HD Graphics" Then 
I need a code on this line to subtract 1 from searchResult.Updates.Count, so that Count = 0 and WScript.Quit will be run consequently.
End If

If searchResult.Updates.Count = 0 Then
WScript.Quit
End If

set objShell = createobject("wscript.shell")  
objShell.Run("ms-settings:windowsupdate") , 0

Next
WScript.Quit

Приведенный выше VBScript проверяет наличие обновлений Windows. Я хочу удалить некоторые обновления, такие как обновления драйверов, из searchResult.Updates.Count так что searchResult.Updates.Count = 0 и WScript.Quit будет запущен последовательно. Я хочу, чтобы он не выполнял никаких действий при обнаружении указанных обновлений и предпринимал действия только при обнаружении других обновлений.

3 ответа3

2

Надеюсь это поможет:

Dim nMyRes : nMyRes = 20

MsgBox "nMyRes before loop: " & nMyRes

For i = 0 To nMyRes-1
    If i = 5 Then nMyRes = nMyRes - 1
    If i = 10 Then nMyRes = nMyRes - 1
Next

MsgBox "nMyRes after loop: " & nMyRes

Этот фрагмент кода работает отлично. В вашем случае у вас есть объект (searchResult), и я не уверен, что вы можете изменить его. Вот почему я бы определил новую переменную и использовал бы ее так:

Dim nMyNewvar : nMyNewvar  = searchResult.Updates.Count - 1
' ...
' ...
For I = 0 To nMyNewvar  

' ...
If update.Title = "bla-bla" Then nMyNewvar = nMyNewvar - 1

[EDITED]

' Add this one row here
 Dim nMyNewvar : nMyNewvar  = searchResult.Updates.Count - 1
 'For I = 0 To searchResult.Updates.Count-1
 For I = 0 To nMyNewvar 
  Set update = searchResult.Updates.Item(I)

  If update.Title = "bla-bla" Then 
   'I need a code on this line to subtract 1 from ....
   nMyNewvar = nMyNewvar - 1
 End If

  If nMyNewvar  = 0 Then
   WScript.Quit
  End If

  set objShell = createobject("wscript.shell")  
  objShell.Run("ms-settings:windowsupdate") , 0

Next
1

Изменить:

If update.Title = "Intel Corporation driver update for Intel(R) HD Graphics" Then 
    subtract 1 from searchResult.Updates.Count,
    so that Count = 0 and WScript.Quit will be run consequently.
    End If

If searchResult.Updates.Count = 0 Then
WScript.Quit
End If

чтобы:

If update.Title = "Intel Corporation driver update for Intel(R) HD Graphics" Then 
WScript.Quit
End If

Тем не менее, похоже, что вы собираетесь добавить список вещей к этому. В этом случае ваша логика неверна, так как она остановит выполнение после нахождения какой-либо одной вещи в списке. Вам нужно будет как-то удалить элемент из фактического списка.

Кроме того, вы также не можете просто изменить count: это свойство только для чтения, которое устанавливается объектом, и оно не удалит элемент из индекса. Вы также запускаете цикл for, используя его как ограничение.

Лучший способ запустить цикл для набора значений, который вы также изменяете, - это использовать что-то вроде «while count> 0 do».

У Microsoft есть пример, где они выполняют итерацию по списку и, если они хотят загрузить (после выполнения некоторых тестов для каждого), они добавляют элемент во второй список, который передается в программу обновления.

0

Прочитав приведенный выше ответ duDE, я придумал следующее:

'ServerSelection values
ssDefault = 0
ssManagedServer   = 1
ssWindowsUpdate   = 2
ssOthers          = 3
'InStr values
intSearchStartChar = 1

Dim strTitle

Set updateSession = CreateObject("Microsoft.Update.Session")
Set updateSearcher = updateSession.CreateupdateSearcher()

updateSearcher.ServerSelection = ssWindowsUpdate
Set searchResult = updateSearcher.Search("IsInstalled=0 and Type='Software'")

If searchResult.Updates.Count = None Then 
WScript.Quit 
Else 
Dim value : value = searchResult.Updates.Count 
End If 

For I = 0 To searchResult.Updates.Count-1
Set update = searchResult.Updates.Item(I)

'The following excluded updates have to be hidden via 'Show or hide updates' beforehand.
'Otherwise, they will be downloaded and installed by Windows Update.
If update.Title = "The full update title" Then Value = Value - 1
If update.Title = "The full update title" Then Value = Value - 1
If update.Title = "The full update title" Then Value = Value - 1

An_item = "KB2267602" 
Set Act=CreateObject("wscript.shell")
If instr(update.Title, An_item) <> 0 Then 
Act.Run("""C:\Program Files\Windows Defender\MpCmdRun.exe"" ""-SignatureUpdate"""), 0
value = value - 1 
End If
Next

If Value = 0 Then 
WScript.Quit 
End If

result = MsgBox (_
"The number of available updates is(" & Value & ")." & vbNewLine &_
"Do you want to open【Windows Update】?", vbYesNo + vbQuestion,_
"【There are available updates.】")
Select Case result
Case vbYes
Act.run("ms-settings:windowsupdate")
Case vbNo
WScript.Quit
End Select

Это работает на моем конце. Диалоговое окно появится только при наличии доступных обновлений, исключая нежелательные. Пожалуйста, скажите мне, работает ли он на вашем конце или может быть улучшен.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .