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