我为什么要这么做:
当 Windows 更新毫无预警地运行时,占用了大量的资源,导致我的电脑长时间无法使用,
我曾经使用过:
net stop wuauserv
wmic service where name="TrustedInstaller" call stopservice
taskkill /f /im TiWorker.exe
并遇到了严重的后果(更新失败并且在(重新)启动时不断安装并不断回滚),但是为了安全起见,保持我的计算机更新是很重要的。
我想要实现的目标
安排时间自动扫描、下载和安装更新并防止不定期的自动更新,仅在我不使用计算机时安装更新,这样就不会降低我的电脑速度。
我曾尝试过
命令:
Reg Add HKLM\SYSTEM\CurrentControlSet\Services\TrustedInstaller /v Start /t REG_dword /d 3 /f
Reg Add HKLM\SYSTEM\CurrentControlSet\Services\UsoSvc /v Start /t REG_dword /d 3 /f
Reg Add HKLM\SYSTEM\CurrentControlSet\Services\WaaSMedicSvc /v Start /t REG_dword /d 3 /f
Reg Add HKLM\SYSTEM\CurrentControlSet\Services\wuauserv /v Start /t REG_dword /d 3 /f
我可以确认这些设置不会达到我想要的结果。
gpedit.msc “本地计算机策略”->“计算机配置”->“管理模板”->“Windows 组件”->“Windows 更新”->“配置自动更新”
我已将其配置为:
(每月第四周每周日00:00)
效果如下:
如果不是所有的更新都限制在时间表内,那么它就毫无意义;
我知道我可以暂停 Windows 更新,但手动操作会很累,尽管暂停 Windows 更新很有用。我可以使用 taskchd 为脚本文件创建计划任务,我想以编程方式暂停 Windows 更新并安排自动更新。
更新:
我在@TOOGAM 的帮助下完成了这些工作,使用来自此链接的信息:
https://erdentec.com/pausing-windows-10-updates-indefinitely/
我的成果:
$PauseStart=(Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")
$PauseEnd=(Get-Date).AddMonths(1).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" -Name "PauseFeatureUpdatesEndTime" -Type "String" -Value $PauseEnd
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" -Name "PauseQualityUpdatesEndTime" -Type "String" -Value $PauseEnd
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" -Name "PauseUpdatesExpiryTime" -Type "String" -Value $PauseEnd
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" -Name "PauseFeatureUpdatesStartTime" -Type "String" -Value $PauseStart
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" -Name "PauseQualityUpdatesStartTime" -Type "String" -Value $PauseStart
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "AUOptions" -Type "DWord" -Value 2
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "NoAutoUpdate" -Type "DWord" -Value 1
Start-Service -Name "Wuauserv"
但是我不能让它自动安装更新,我已经运行了这个:
Get-Command -Module *Update*
CommandType Name Version Source
----------- ---- ------- ------
Function Get-WindowsUpdateLog 1.0.0.0 WindowsUpdate
Function Get-WUAVersion 1.0.0.2 WindowsUpdateProvider
Function Get-WUIsPendingReboot 1.0.0.2 WindowsUpdateProvider
Function Get-WULastInstallationDate 1.0.0.2 WindowsUpdateProvider
Function Get-WULastScanSuccessDate 1.0.0.2 WindowsUpdateProvider
Function Install-WUUpdates 1.0.0.2 WindowsUpdateProvider
Function Start-WUScan 1.0.0.2 WindowsUpdateProvider
我运行了这个并遇到一个错误:
Start-WUScan
Invoke-CimMethod: C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\WindowsUpdateProvider\MSFT_WUOperations.psm1:13
Line |
13 | … $scanres = Invoke-CimMethod -Namespace root/Microsoft/Windows/Window …
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Provider load failure
Start-WUScan: Scan hit error: .ReturnValue
另外,我无法让 PowerShell 管理位于 taskschd 中的 \Microsoft\Windows\WindowsUpdate 中的计划任务(虽然我可以在 cmd 中使用 schtasks,并且我知道我可以在 pwsh 中使用 cmd 命令,但我想以纯粹的 PowerShell 精神来执行此操作...)
我能够使用 taskschd,并且可以创建一个计划任务来运行.ps1 文件(只需将“C:\Program Files\PowerShell\7\pwsh.exe”放入程序/脚本并使用 -file path\to\ps1 作为参数)
我怎样才能解决我遇到的问题?
更新:
我已经安装了模块:PSWindowsUpdate
Set-PSRepository -Name "PSGallery" -InstallationPolicy Trusted
Install-Module -Name PSWindowsUpdate
运行完毕,结果如下:
Get-WindowsUpdate
ComputerName Status KB Size Title
------------ ------ -- ---- -----
UTILCOM-466… ------- KB4577194 607MB SQL Server 2019 RTM Cumulative Update (CU) 8 KB4577194
UTILCOM-466… -D----- KB4592438 103GB 2020-12 Cumulative Update for Windows 10 Version 20H2 for x64-based Systems (…
注意 KB4592438 的大小...它是 103GB...
看看这个:
https://www.catalog.update.microsoft.com/Search.aspx?q=KB4592438
到底出了什么问题?
我整理了以下内容:
if ("PSWindowsUpdate" -notin (Get-Module -ListAvailable).name) {Set-PSRepository -Name "PSGallery" -InstallationPolicy Trusted;Install-Module -Name PSWindowsUpdate}
我知道我可以使用:
Get-WindowsUpdate
Install-WindowsUpdate
理论上它可以工作,但看看 Get-WindowsUpdate 显示的 KB4592438 的大小......
免责声明:
我知道我可以使用此 cmd 单行命令自动扫描、下载和安装 Windows 更新,但这不是 PowerShell,而且这完全违背了纯粹的 PowerShell 精神,我不得不明确地声明我打算使用“PowerShell Core 7”和“任务计划程序”来实现这一点,并且只使用它们,而不是cmd,在我看来这不够专业:
wuauclt /detectnow /updatenow