it-swarm.cn

如何从命令行安装Windows更新

是否可以从命令行安装Windows更新?图形更新工具在Windows 7中似乎不能很好地工作。有时候可以,有时不能。。。我的问题是,单击查看详细信息列表时,看不到任何更新。因此,当有默认情况下未选中的更新时,我无法安装它们...

那么,还有其他方法可以安装那些软件吗?

17
Svish

不确定Windows 7,但对于XP/Vista,可以运行以下命令来检测和下载更新:

wuauclt /detectnow /reportnow

如果您无法正常工作,请查看 WSUS Wiki

否则,如果您有所需的特定更新,只需从Microsoft网站下载即可。如果存在阻止您安装的问题,那么这是找出问题的最佳方法,因为Windows Update日志令人讨厌。

12
duffbeer703

您可以使用脚本来同步检查,下载和安装更新。我经常使用 此vbscript 的修改版本来手动修补Windows Core服务器。

Set updateSession = CreateObject("Microsoft.Update.Session")
updateSession.ClientApplicationID = "MSDN Sample Script"

Set updateSearcher = updateSession.CreateUpdateSearcher()

WScript.Echo "Searching for updates..." & vbCRLF

Set searchResult = _
updateSearcher.Search("IsInstalled=0 and Type='Software' and IsHidden=0")

WScript.Echo "List of applicable items on the machine:"

For I = 0 To searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    WScript.Echo I + 1 & "> " & update.Title
Next

If searchResult.Updates.Count = 0 Then
    WScript.Echo "There are no applicable updates."
    WScript.Quit
End If

WScript.Echo vbCRLF & "Creating collection of updates to download:"

Set updatesToDownload = CreateObject("Microsoft.Update.UpdateColl")

For I = 0 to searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    addThisUpdate = false
    If update.InstallationBehavior.CanRequestUserInput = true Then
        WScript.Echo I + 1 & "> skipping: " & update.Title & _
        " because it requires user input"
    Else
        If update.EulaAccepted = false Then
            WScript.Echo I + 1 & "> note: " & update.Title & _
            " has a license agreement that must be accepted:"
            WScript.Echo update.EulaText
            WScript.Echo "Do you accept this license agreement? (Y/N)"
            strInput = WScript.StdIn.Readline
            WScript.Echo 
            If (strInput = "Y" or strInput = "y") Then
                update.AcceptEula()
                addThisUpdate = true
            Else
                WScript.Echo I + 1 & "> skipping: " & update.Title & _
                " because the license agreement was declined"
            End If
        Else
            addThisUpdate = true
        End If
    End If
    If addThisUpdate = true Then
        WScript.Echo I + 1 & "> adding: " & update.Title 
        updatesToDownload.Add(update)
    End If
Next

If updatesToDownload.Count = 0 Then
    WScript.Echo "All applicable updates were skipped."
    WScript.Quit
End If

WScript.Echo vbCRLF & "Downloading updates..."

Set downloader = updateSession.CreateUpdateDownloader() 
downloader.Updates = updatesToDownload
downloader.Download()

Set updatesToInstall = CreateObject("Microsoft.Update.UpdateColl")

rebootMayBeRequired = false

WScript.Echo vbCRLF & "Successfully downloaded updates:"

For I = 0 To searchResult.Updates.Count-1
    set update = searchResult.Updates.Item(I)
    If update.IsDownloaded = true Then
        WScript.Echo I + 1 & "> " & update.Title 
        updatesToInstall.Add(update) 
        If update.InstallationBehavior.RebootBehavior > 0 Then
            rebootMayBeRequired = true
        End If
    End If
Next

If updatesToInstall.Count = 0 Then
    WScript.Echo "No updates were successfully downloaded."
    WScript.Quit
End If

If rebootMayBeRequired = true Then
    WScript.Echo vbCRLF & "These updates may require a reboot."
End If

WScript.Echo  vbCRLF & "Would you like to install updates now? (Y/N)"
strInput = WScript.StdIn.Readline
WScript.Echo 

If (strInput = "Y" or strInput = "y") Then
    WScript.Echo "Installing updates..."
    Set installer = updateSession.CreateUpdateInstaller()
    installer.Updates = updatesToInstall
    Set installationResult = installer.Install()

    'Output results of install
    WScript.Echo "Installation Result: " & _
    installationResult.ResultCode 
    WScript.Echo "Reboot Required: " & _ 
    installationResult.RebootRequired & vbCRLF 
    WScript.Echo "Listing of updates installed " & _
    "and individual installation results:" 

    For I = 0 to updatesToInstall.Count - 1
        WScript.Echo I + 1 & "> " & _
        updatesToInstall.Item(i).Title & _
        ": " & installationResult.GetUpdateResult(i).ResultCode   
    Next
End If

这样做似乎很吸引人,但是我当然没有在Windows 7下对其进行过测试。如果需要的话,还有指向另一篇文章的链接,该文章用于定位特定的更新。

还有一个 一个Powershell模块 可以提供类似的体验。

快速浏览后,我还发现 此第三方应用程序 也使用了更新API,但有更多选择(尽管需要您信任第三方代码)。

4
Oskar Duveborn

Windows Update从命令行:

www.sysadminsoftware.com/udc.html

该工具(更新部署指挥官)可以满足您的要求。您还可以传递参数来避免某些补丁,定位特定的更新,在完成后N分钟重新启动,以CSV创建报告等等。它也附带了几个GUI实用程序。

2
sysadmin

如果您必须打补丁Windows操作系统,尤其是在全新安装后,请认真看一下 Offline Updater

它使用脚本来下载您建议的所有修补程序(因此酌情选择Win2000,Win XP,Win 2003,Vista,Win2008,Win2012 32和64位),多语言,Service Pack,.NET框架和Office修补程序(XP,2000 ,2003,2007)。

一旦下载了所有补丁,您只需在星期二更新每个补丁,然后仅获取更改。虽然它确实会引起轰动,并且它们每天都在变长(每个OS/Office版本现在有很多兆)。

一旦下载了本地计算机上的文件,就会有一个脚本来制作它们的CD/DVD映像(如果需要,它将自动针对每个OS的DVD映像自动生成CD/DVD映像)。

我要做的是在SD卡读卡器中使用4GB SD存储卡,该读卡器具有写保护选项卡。我曾经使用2GB的卡,但是我几乎无法容纳Win XP,现在大多数Office都基于它构建,所以我转到了4GB的卡上。

因此,在对机器进行故障排除时,我相信将这个以前可写的设备插入到不受信任的,可能是受病毒感染的机器中(因为我对此一无所知,因此我假设它已被感染),并且知道我的设备已被写保护。

因此,我可以将其更新为第一步。

如果您使用自动运行,或在设备(密钥,外部HD,CD,DVD,无论您在何处写入)上启动可执行文件,它将启动一个脚本,该脚本使用本地计算机上的Windows Update服务来应用所有更新,但是只需下载本地副本即可。

因此,将WinXP计算机更新到最新的SP和补丁程序)可能仍需要1个多小时,但是在此过程中网络流量为零,您可以在完全拔掉以太网电缆的情况下进行操作。

非常有用的工具!

不应该像Microsoft那样,像AutoUpdate的家伙那样运行Microsoft,他们要预先构建补丁CD,该CD会分发CD映像。该工具将更新脚本,并且您必须在许可的Windows工作站上获取所有补丁。

2
geoffc

我目前无法通过 duffbeer7answer 添加评论,因此在这里作为单独的答案:

Internet存档上存档的WSUSwiki链接的最后一个“良好”版本是 this 。原始答案中给出的选项在此 常见问题解答条目 中进行了描述。

1
Olaf Mandel