用批处理文件阻止win10强制更新

2022-09-05 11:12:14 浏览数 (2)

大家好,又见面了,我是你们的朋友全栈君。

  1. win10更新下载的位置
  2. win10更新进程
  3. 隐藏窗口运行和提升执行权限
  4. 实现反复运行和开机自启

win10这个商业巨头微软的最新之作,以流氓行径著称,尤其是它的自动更新最受诟病。用户无权选择是否下载和安装更新。你选择不更新,他就在后台下载,下次开机自动安装。何况,这些更新有的没必要,有的装上反而起副作用。我之前就被装上的更新弄坏网卡驱动,重装一次系统;去年3月大范围爆发的更新bug,导致众多用户USB驱动坏掉,又重装一次系统。再后来,我知道了更新的危害,就每天手动删除那些更新安装包,结果有一次它后台下载吃掉我3GB流量。看来,强行阻止win10自动更新已成必要。

我一年多来和win10的艰苦卓绝的斗争,现在终于取得了完全的胜利,洗雪了重置两次系统的奇耻大辱(滑稽~)。下面我就把经验分享给大家,其实也没那么残酷,就是多观察,多搜索,写出一个10行左右的小脚本即可。主要功能就是,随时阻止win10更新进程,并删掉已下载的安装包。为了完整地实现上述功能,要认真地看完这篇文,虽然比较长,但这是一劳永逸的事,多好!大家最好动手写一遍,不要直接复制粘贴,这样就对这一系列命令有了解,以后做这样的脚本也得心应手。

1、win10更新下载的位置

根据我的观察以及搜索引擎的帮助,可知,win10下载的更新是一些压缩包,需要系统专门进程来引导安装。我曾经在某个更新被安装后手动卸载,但这已经迟了,其实它根本卸载不了,**关键要在它被安装之前拦截住,删掉安装包。**这些安装包在下面的路径:

代码语言:javascript复制
C:WINDOWSSoftwareDistributionDownload

如果你发现这里有好多文件,就要手动把它删掉。但是,这太麻烦了。据我观察,win10更新程序玩的嗨的时候,两分钟就能运行一次,所以必须有一种自动化的删除方法。 懂DOS命令的童鞋都知道有一个del命令能帮我们删除这些文件。del命令有几个选项,我们要用到的就是/f /s /q三个选项。/f表示强制删除,/s表示递归删除目录下所有文件,/q表示不提示用户选择而直接删除。所以应当这样写:

代码语言:javascript复制
del /f /s /q C:WINDOWSSoftwareDistributionDownload

如果我们在cmd命令行中输入这个命令,会反馈“拒绝访问”。这表明我们的权限不够。在Linux里面可以用sudo,win10怎么办呢?别急,反正方法已经有了,权限的事情很简单,我们稍后会专门讨论。

2、win10更新进程

刚才说了,仅仅靠删除安装包是不行的。如果你用的宽带那无所谓,如果你用手机热点,好家伙,一次下载更新需要2~3GB的流量,如果不是王卡我觉得没人承受得起。所以,还要找到win10更新的关键进程,一旦运行立即结束。我们知道结束进程的命令是taskkill,下面就来讨论这个。 win10更新有两个关键进程。这些进程不是用程序文件名来表示的,而是用服务名来表示的。服务就是后台进程,所以从文件名是找不到的,必须用taskkill命令中的一些特殊选项。 我根据CPU风扇声就能判断win10是否在下载更新(这就是常年斗争磨练出来的,比如我就打开一个office,风扇异响,那肯定是后台高消耗进程)。这时观察网速,如果没有下载任务,网速异动(比如突然飙升到最快),那无疑是更新程序在作怪。这时打开任务管理器,按网速排序,最快的那个就是关键下载程序。 这个进程我已经摸索到了,大家以后直接针对它就行。那就是dosvc服务。 还有一个win10更新主进程,叫做wuauserv服务。 不知道服务进程的小伙伴有点懵,这都是什么玩意?别着急,我们慢慢来说。 打开任务管理器,如下图

以“服务主机”开头的进程,就是服务进程。这不是废话吗,哈哈。我们并不需要知道具体是哪一个之下的。我们刚才已经知道关键进程了,所以想办法kill掉! taskkill命令有一个/fi选项。它是用来指定筛选器的。筛选器,顾名思义就是选择符合指定条件的进程来杀掉。所以关键在后面的筛选条件。 筛选条件不言自明,就是名称为 dosvc 的服务进程,和名称为wuauserv的服务进程。 筛选条件就是下面的格式(注意必须有引号):

代码语言:javascript复制
"name operator value"

name叫做筛选器名称。我们要结束服务进程,所以筛选器名称就是services。 opeartor叫做运算符,包括eq–等于,ne–不等于。我们选择eq。 value叫做筛选值,这里要筛选服务,所以指定名称,那就是dosvc和wuauserv。 另外,taskkill还需要加上/f选项,表示强制结束。 所以,结束这两个进程的命令,就写成

代码语言:javascript复制
taskkill /f /fi "services eq wuauserv"
taskkill /f /fi "services eq dosvc"

运行的时候,又是可恶的拒绝访问。好了,第三步到了,我们要新账老账一起算,解决权限问题。

3、隐藏窗口运行和提升执行权限

我们知道Linux里面有sudo命令,用来以root身份执行命令。但是Windows的cmd里面没有。你要双击运行,改成右键以管理员身份也行。但是我们要开机自启的,怎么右键呢?所以我们要请来一个更神奇的工具–vbs。 cmd中用来调用vbs脚本命令的命令(有点绕口是吧)就是mshta。这个vbs我用的不太熟,所以百度了一下,真有大神会弄。所以我直接粘贴一下,做点简单的解释。

代码语言:javascript复制
cd /d %~dp0
%1 start "" mshta vbscript:createobject("shell.application").shellexecute("""%~0""","::",,"runas",0)(window.close)&exit

第一行是进入某个特殊目录,我也不懂这个目录是什么,但和访问权限检测有关。第二行就是用vbs里面的 shellexecute 函数来提升访问权限的。 函数格式就是:

代码语言:javascript复制
shellexecute(file, arguments, directory, operation, show)

第一个参数是要执行的文件,第二个是赋予的参数字符串,第三个是文件所在路径,第四个是管理员权限操作符runas,第五个是是否打开窗口。我们执行这种后台程序,最好的模式就是管理员身份运行,并且不弹出黑窗口,所以runas要打开,show要赋值0。 把这两行放到我们批处理文件的头部,就可以做出一个完整的脚本了。不过,还有一点需要注意,为了隐藏窗口,需要我们把运行时的echo回显器关掉,所以这两行后面再加一行

代码语言:javascript复制
@echo off

这就完了?No。我刚才说了,win10喜欢对着干,你刚结束它又重启,而且是会开机自启的。所以,魔高一尺道高一丈,我们也得自动反复运行和开机自启。

4、实现反复运行和开机自启

反复运行这个很简单,就是用goto命令构造一个死循环。我们把刚才结束进程和删除文件的命令总结一下,把它们放到循环体中。 死循环也得有个度,不能间隔太短,不然你的CPU会炸了的。据我观察,一个更新进程10秒钟重启是不太可能的,所以我们把间隔调成10秒。 这就是timeout命令。有两个选项,/nobreak表示不等待用户按键,只等待计时器。/t用来指定延时。所以写成

代码语言:javascript复制
timeout /nobreak /t 10

合起来就是:

代码语言:javascript复制
:loop
taskkill /f /fi "services eq wuauserv"
taskkill /f /fi "services eq dosvc"
del /f /s /q C:WindowsSoftwareDistributiondownload
timeout /nobreak /t 10
goto loop

冒号开头的:loop表示标号,下面的goto语句就是返回标号,这就实现了反复执行。

下面来看开机自启 需要知道win10启动项所在位置。如果作为用户启动项,那就是

代码语言:javascript复制
C:UsersUsernameAppdataRoamingMicrosoftWindowsStart MenuProgramsStartUp

username表示你的用户名。这个目录必须在窗口下从C盘起一级一级点下去,不能直接复制粘贴到地址栏,否则会权限不够拒绝访问。 我们来整合一下完整的bat文件:

代码语言:javascript复制
cd /d %~dp0
%1 start "" mshta vbscript:createobject("shell.application").shellexecute("""%~0""","::",,"runas",0)(window.close)&exit

@echo off
:loop
taskkill /f /fi "services eq wuauserv"
taskkill /f /fi "services eq dosvc"
del /f /s /q C:WindowsSoftwareDistributiondownload
timeout /nobreak /t 10
goto loop

把它写在记事本里,然后保存,后缀名改为bat。双击运行一下,看看是不是没有小黑窗口了?打开任务管理器,看到有Windows命令管理程序,还有一个超时什么的,这就是成功了。 最后呢?开机自启,那我们就把这个bat放在刚才打开的那个目录里。大功告成啦!重启一下电脑,看看它有没有开机自启。注意一定要检查国产安全软件中开机启动项的设置,把刚才制作的脚本放行。不然,开机不自启那叫什么东西啊。

5、总结

我们一共用了taskkill,timeout,del,goto,mshta五种命令,并学到了开机自启等方法。其实DOS命令很强大,它可以帮我们做自动化处理,尤其是文件管理方面的工作,用户可以从繁琐、重复性的工作中解放双手,去做有意义的事情。 同时,我们也看到微软作为垄断企业的巨大权力,它可以随意控制用户的计算机。所以,发展国产操作系统也是势在必行。如果中国有足够多的优秀Linux开发者,打破微软的垄断地位也就不是不可行了。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/136050.html原文链接:https://javaforall.cn

0 人点赞