学习windows批处理有啥实际用途吗

只会用批处理的飘过实话 熟悉了批处理,然后继续学习简单的编程吧
■网友
你还是学 powershell 吧
■网友
做为一个已经在技术支持职位上工作了近二十年的老鸟要说,批处理在有些时候要远比你想象的有用。

这里我要用一个七年前写的脚本做例子。为什么要用这么久之前的脚本?因为在我创建了这个脚本后的第五年,公司里还有人向我要脚本,这让我意识到,无论多高级的编程工具,多高集成度的系统,在特定场合的需求缺失的情况下,使用脚本解决问题是唯一途径。

言归正传,事情发生在2012年,我刚换了新公司。领导大概想考考我的水平,便出了一道难题:如何在域环境下部署公司的客户端软件?

那个时候公司的客户端产品还是msi类型的,按理说直接使用域分发策略也可以,但是这是安全相关软件,用户希望部署的时候可以后台安装并自动重启系统,这就需要在运行安装包的时候添加额外的参数,这一点直接通过域分发策略是无法做到的。而且最新版本里,产品客户端改成了EXE模式,批处理脚本的需求已经呼之欲出了。

所以脚本的最初雏形是这样的

【学习windows批处理有啥实际用途吗】 msiexec /i 32FullInteract.msi /quiet /forcerestart

但是实际部署的时候现场会比较复杂,比如说目标机器的操作系统可能是32位的或者64位的,部署的时候需要按照操作系统类型按照对应的32位或64位的客户端。那么如何判断呢?

下面用来检查注册表键值的方法判断OS类型,后来又延伸到判断是否已经安装了客户端:

------- check OS 32bit or 64bit-------
for /f "tokens=3" %%a in (\u0026#39;reg query "HKEY_LOCAL_MACHINE\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0" /v Identifier\u0026#39;) do set t=OS%%a
echo %t% | find "64"
goto OSType%errorlevel%
------- Follow action for 32bit OS-------
:OSType1
如果目标机器是32位,那么echo命令的反馈报错值一定是1
reg query "HKEY_LOCAL_MACHINE\\SOFTWARE\\Websense\\Agent" /v InstallVersion
goto Detect32Agent%ERRORLEVEL%
:Detect32Agent1

如果目标机器没有装过客户端,那么Query的反馈报错值为1
msiexec /i \\\\192.168.88.104\\TestAgent\\76Agent\\32FullInteract\\32FullInteract.msi /quiet /forcerestart
------- If EP has been installed, check if EP version is at 7.6-------

因为客户端版本不同,还需要检测是否安装了老版本的客户端
:Detect32Agent0
for /f "tokens=3" %%a in (\u0026#39;reg query "HKEY_LOCAL_MACHINE\\SOFTWARE\\Websense\\Agent" /v InstallVersion\u0026#39;) do set n=Version%%a
if NOT "%n%" == "Version7.6.1045" (msiexec /i \\\\192.168.88.104\\TestAgent\\76Agent\\32FullInteract\\32FullInteract.msi /quiet /forcerestart) else exit

如果检测到的客户端键值不是7.6版本的,那么运行覆盖安装,否则放弃重复安装。

如果安装需要本地管理员权限而登录用户没有怎么办?

网上有第三方的工具runasspc.exe 可以使用 (获取方法请自行百度)

脚本如下

\\\\192.168.88.104\\TestAgent\\763Agent\\32FullInteract\\runasspc.exe /program:"\\\\192.168.88.104\\TestAgent\\763Agent\\32FullInteract\\WebsenseEndpoint_32bit.exe" /domain:"dsstestdc" /user:"administrator" /password:"WebTest" /param:"/v\u0026#39;/quiet /forcerestart\u0026#39;"
exit

当然,和领导汇报的时候,领导有一点不满意的地方在于,集成脚本里的用户名和密码是明文的,在有些环境下是不允许的。好在这个工具还有商业版,附带以DES加密字符串的功能,这样可以做到脚本里的登录密码是以加密形式呈现在用户眼前的。


推荐阅读