No VBScript, eu preciso de um código para subtrair 1 de searchResult.Updates.Count, para que Count = 0 e WScript.Quit sejam executados consequentemente

-1

Eu já pesquisei por horas, mas não consegui encontrar a resposta.

'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

O VBScript acima verifica as atualizações do Windows. Desejo remover algumas atualizações, como as atualizações de driver de searchResult.Updates.Count , para que searchResult.Updates.Count = 0 e WScript.Quit sejam executados consequentemente. Eu quero que ele não tome nenhuma ação quando atualizações especificadas forem encontradas e execute ações somente quando outras atualizações forem encontradas.

    
por Matthew Wai 02.12.2016 / 13:59

3 respostas

0

Depois de ler a resposta acima de duDE, eu pensei no seguinte:

'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

Funciona no meu final. Uma caixa de diálogo aparecerá somente se houver atualizações disponíveis para a exclusão de outras indesejadas. Por favor, diga-me se funciona ao seu lado ou pode ser melhorado.

    
por 04.12.2016 / 15:38
2

Espero que isso ajude:

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

Este trecho de código funciona bem. No seu caso, você tem um objeto (searchResult) e não tenho certeza se pode alterá-lo. É por isso que eu definiria uma nova variável e a usaria assim:

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

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

[EDITADO]

' 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
    
por 02.12.2016 / 15:24
1

Alterar:

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

para:

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

No entanto, parece que você vai adicionar uma lista de coisas para isso. Nesse caso, sua lógica está errada, pois irá parar a execução depois de encontrar qualquer coisa na lista. Você precisará remover o item da lista real de alguma forma.

Além disso, você também não pode simplesmente alterar a contagem: é uma propriedade somente leitura que é definida pelo objeto e não removerá o item do índice. Você também está executando um loop for usando-o como limite.

A melhor maneira de executar um loop em um conjunto de valores que você também está alterando é usar algo como "while count > 0 do".

A Microsoft tem um exemplo onde eles percorrem a lista e, se quiserem baixar (depois de executar alguns testes em cada um), eles adicionam o item a uma segunda lista que é passada para o atualizador.

    
por 02.12.2016 / 18:26