It's a good thing that I wrote about Installing Windows Updates via Shell Script some time ago because today I needed to reuse that bit of a script and could not find it anywhere on my PC or our corporate network.
This time I'm reusing most of the functionality, but additionally do the following:
- Make sure that the Windows Update service is started
- Run a PowerShell script that passes a folder where the Windows update files are stored to the VbScript file
- Execute VbScript to install all updates in a folder
- Repeat. (I want to keep my "required" and "optional" updates separate
I was caught for a while trying to use PowerShell Set-Service and Start-Service commands and getting permission errors. I did not quite solve it, but found a simple workaround by utilising a command line:
@ECHO OFF sc config wuauserv start= auto net start wuauserv
Next, the PowerShell script is used to pass parameters to VbScript:
cscript .\Common\InstallUpdates.vbs $updatesFolder
Finally, the VbScript is almost the same as in the previous version, but note how the argument passed by PowerShell is parsed. The argument is the name of the folder where I placed the updates downloaded from Microsoft Update Catalog
Set args = WScript.Arguments
sfolder = args.Item(0)
Dim objfso, objShell
Dim iSuccess, iFail
Dim files, folderidx, Iretval, return
Dim fullFileName
Set objfso = CreateObject("Scripting.FileSystemObject")
Set folder = objfso.GetFolder(sfolder)
Set objShell = CreateObject("Wscript.Shell")
With (objfso)
If .FileExists("C:\log.txt") Then
Set logFile = objfso.OpenTextFile("C:\log.txt", 8, TRUE)
Else
Set logFile = objfso.CreateTextFile("C:\log.txt", TRUE)
End If
End With
Set files = folder.Files
iSuccess = 0
iFail = 0
For each folderIdx In files
fullFileName = sfolder & "\" & folderidx.name
If Ucase(Right(folderIdx.name,3)) = "MSU" then
logFile.WriteLine("Installing " & folderidx.name & "...")
iretval=objShell.Run ("wusa.exe " & fullFileName & " /quiet /norestart", 1, True)
If (iRetVal = 0) or (iRetVal = 3010) then
logFile.WriteLine("Success.")
iSuccess = iSuccess + 1
Else
logFile.WriteLine("Failed.")
iFail = iFail + 1
End If
ElseIf Ucase(Right(folderIdx.name,3)) = "EXE" Then
logFile.WriteLine("Installing " & folderidx.name & "...")
iretval = objShell.Run(fullFileName & " /q /norestart", 1, True)
If (iRetVal = 0) or (iRetVal = 3010) then
logFile.WriteLine("Success.")
iSuccess = iSuccess + 1
Else
logFile.WriteLine("Failed.")
iFail = iFail + 1
End If
End If
Next
wscript.echo iSuccess & " update(s) installed successfully and " & iFail & " update(s) failed. See C:\log.txt for details."Disable the Windows Update service again if necessary
net stop wuauserv sc config wuauserv start= disabled
References:
Managing Windows Services from the command lineWorking with Command-Line Arguments
How do you pass a variable to VBS script in a powershell command?
Enable/Disable a Service via PowerShell
PowerShell queryService – Wait for a Dependency Starting Service
by Evgeny. Also posted on my website
No comments:
Post a Comment