有些人使用 批处理文件 来自动安装windows 的补丁,但是由于 windows 主要有2类不同补丁程序,而且需要不同的参数,参数错误的话,会导致无法安装,所以对不同的补丁需要使用不同的参数。下面我就来具体分析。
我把windows 2003 server 的补丁文件放在同一个目录,可以清楚地看到补丁文件名字前面的图标有2种类型,一种是简单的可执行文件的图标,另外一种是标志压缩文件的可执行文件的图标。
WindowsServer2003-KB823559-x86-ENU.exe文件的图标是一个简单的可执行文件的图标,如图update.png,察看该补丁的帮助信息,可以看出WindowsServer2003-KB823559-x86-ENU是使用微软的update程序来安装补丁的,从图KB823559ver.png,察看该补丁的版本信息,可以看出WindowsServer2003-KB823559-x86-ENU这个补丁是由SFXCAB.EXE而来的,所有其它的具有普通可执行文件的图标的补丁程序都有类似的性质。
DirectX9-KB819696-x86-ENU.exe文件的图标是一个标志压缩文件的可执行文件的图标,如图如图directx9.png,察看该补丁的帮助信息,它所认识的参数不包括/U和/Z,如果使用/U 参数来运行就会产生错误,如图error.png。如图directx9ver.png,察看该补丁的版本信息,可以看出DirectX9-KB819696-x86-ENU这个补丁是由WEXTRACT.EXE而来的,所有其它的具有标志压缩文件的可执行文件的图标的补丁程序也都有类似的性质。
现在很清楚了windows有2类不同的补丁,使用了不同的补丁程序,需要的参数也不一样。
那么如何在批处理文件中区分这2类不同的补丁呢?最稳妥的办法是找一个小程序可以检测补丁文件的资源信息,如果补丁的资源中包括了一个标志压缩文件的可执行文件的图标,那么该补丁就是第2类补丁,仅仅使用/Q参数,如果补丁的资源中不包括图标,那么就是第一类补丁,可以使用/U /Q /Z参数来安装补丁。
这里我给出一个更加简单的方法,仅仅使用windows的内部命令,不需要额外的程序了,就是查找补丁文件中的特征字符串,如果一个字符串仅仅在某一类补丁程序中存在,我们就可以根据这个来区分补丁的类型。
如图 特征字符串.png,用文本编辑器分别打开WindowsServer2003-KB823559-x86-ENU.exe 文件和DirectX9-KB819696-x86-ENU.exe文件,可以找到很多特征字符串,如字符串“_SFX_CAB_EXE_PATH”仅仅存在于SFXCAB.EXE类型的补丁,而字符串“CABINET”和“WEXTRACT”仅仅存在于WEXTRACT.EXE类型的补丁文件中。所以可以 用查找字符串的方法来决定补丁文件的类型,
如下命令,就可以指明该补丁文件需要的参数:(@findstr _SFX_CAB_EXE_PATH 补丁文件名字 >nul && @echo 参数 /U /Q /Z) || @echo 参数 /Q
上面的命令的意思是如果查找到字符串_SFX_CAB_EXE_PATH,就说明补丁使用 /U /Q /Z参数 ,否则的话,使用/Q参数。
运行结果如图findstr.png。
最后给出完整的批处理命令:
FOR /R %%F IN (*.exe) DO @((@findstr _SFX_CAB_EXE_PATH "%%F" >nul && @start /wait %%F /U /Q /Z ) || @start /wait %%F /Q )
qchain.exe
把该批处理文件放在补丁的目录,不需要把补丁文件集中到同一个目录中,for命令的/R参数会自动搜索所有的子目录。
注意对于2002,12月份后的补丁,基本上不需要 使用qchain这个命令,新的补丁都内置了这个命令。