我们单位里会议室里的Windows PC是最忙的PC这些PC连接着投影设备经常要运行PowerPoint之类的系统为了避免网络对幻灯放映效果的影响用户的典型做法是首先登录会议室的PC然后从自己的机器上把PowerPoint演示文稿复制到本地 由于会议室的PC很难做到定期维护往往要到无法正常使用时才会引起注意例如有人想把一个演示文稿复制到会议室PC却发现磁盘已经满了有人从会议室PC复制了一个文件却发现这个文件带有病毒有时会意外地发现另一个拥有管理权限的用户把C盘的全部访问权授予了Guests组为了解决诸如此类的问题我们让系统自动执行清理文件的任务并定期报告自己的状态 清理操作每周执行一次防止磁盘空间耗尽根据会议室PC的应用情况清理任务包括 删除过期的用户配置文件大多数用户经常忘记清理自己复制到会议室PC的演示文稿这些PC上过时的用户配置文件中充塞着大量被废弃的文档只要删除用户配置文件被废弃的演示文稿也就一起被删除从实际情况判断凡是天以上没有人使用的配置文件执行清理任务的脚本都可以安全地删除它们 删除email文件一些用户通过会议室PC收发邮件并把邮件留在了本地磁盘上(Outlook的pst文件)按照单位规定会议室PC不允许收发email所以必须删除所有pst文件 删除临时文件某些应用软件会留下庞大的tmp文件删除这类文件不影响正常使用 每月报告一次PC的状态虽然每周执行清理任务意外问题仍有可能出现为了保证PC尽可能正常地运行必须让PC自动生成状态报告并通过email发送给指定的收件人报告内容包括 可用的磁盘空间由于用户经常把庞大的多媒体文件复制到会议室PC虽然每周执行自动清理过期用户配置文件和临时文件的操作但磁盘空间仍是一个必须密切关注的问题 病毒定义文件的更新日期由于某些原因如网络故障杀毒软件McAfee VirusScan未能及时更新病毒定义信息部分机器的病毒定义信息过期使这些机器面临被新型病毒感染的风险由于每一台PC的配置更新情况不一致所以不能采用简单的重新安装软件的办法只能让脚本自动报告最后更新日期 Messenger服务的状态在会议室PC上为了防止Net Send网络消息在放映幻灯时突然跳出来所以禁用了Windows的Messenger服务某些用户可能在无意之中打开了Messenger服务脚本必须报告该服务的状态 我们用AutoReportbat批命令脚本完成上述任务虽然这个脚本是为了维护会议室PC编写的但只要稍加改变不难应用到其他场合 一删除过期的用户配置文件 为了删除不再使用的用户配置文件AutoReportbat用到了Delprof工具这个工具在Microsoft Windows Server Resource Kit和Microsoft Windows NT Server Resource Kit都有但不同操作系统的工具不能混用如果用了版本错误的Delprof会出现错误信息Entry point not found删除过期用户配置文件的命令为 delprofexe /q /d: /q选项表示Delprof以安静模式运行即在删除用户配置文件之前不必进行确认/d:选项指定了允许用户配置持续保持不激活状态的最长天数也就是说这里要求Delprof删除所有不激活时间超过天的用户配置文件 二删除pst和tmp文件 为了删除所有pst和tmp文件脚本运用了一个For命令For命令中的df是一个查找驱动器的免费工具可以从~chrisd/public/dfzip下载df的输出内容很多不仅仅是一个驱动器的清单所以要把输出重定向到Find命令Find命令查找输出内容中包含冒号(:)的字符串——即表示驱动器的字符串对于每一个找到的驱动器Del命令删除所有以pst和tmp扩展名结尾的文件/s选项要求Del命令搜索当前目录及其所有子目录/q选项要求Del命令以安静模式运行 三创建状态报告 AutoReportbat利用多个NTFS文件流来跟蹤什么时候发送状态报告email文件流以%ComputerName%maildatetxt的形式命名其中%ComputerName%是一个系统定义的环境变量它的值是用户当前登录的机器的名称这样每一台PC都有一个对应的隐藏流隐藏流包含了最后为该台机器发送状态报告的日期脚本运行时读取这个信息如果本月已经发送过状态报告则不再发送如果本月尚未发送状态报告则获取必要的数据写入并发送报告再把当前的日期写入与该台机器对应的隐藏流 获取数据在获取状态数据的过程中AutoReportbat脚本用到了多种工具和技术主要包括 空闲的磁盘空间脚本通过df工具获得这方面的信息df的输出中包含了每一个驱动器的总容量和空闲空间百分比 病毒定义文件的日期脚本获取C:\program files\ common files\network associates\virusscan engine\xx\cleandat文件的最后修改日由于各台会议室PC上该文件的位置不同脚本通过几个If Exist命令确定该文件的正确位置 Messenger服务的状态脚本用到了Windows K Resource Kit提供的Srvinfo工具执行Srvinfo时指定s选项可获得在各台PC上运行的服务清单如果Messenger服务正在运行脚本在状态报告中写入警告信息 写入并发送状态报告脚本把收集到的数据写入blattxt文件作为邮件的正文然后填写邮件的收件人发件人主题最后发送消息邮件发送任务由Blat工具完成Blat是一个能够在Windows命令行发送邮件的工具可以从免费下载它的README文件提供了完善的安装语法说明和应用实例 在blat命令中%SystemDrive%\blattxt指定了包含邮件内容的文件其中%SystemDrive%是系统定义的环境变量(表示系统盘位置)s选项指定了邮件的主题server选项指定了发送邮件时使用的SMTP服务器f选项指定了发送者的邮件地址t选项指定了收件人的邮件地址为了使脚本代码更容易维护和阅读这里没有直接在命令行指定SMTP邮件服务器发件人地址收件人地址而是使用了用户定义的环境变量分别是%MailServer%%Sender%和%Recipients% 记录当前日期把状态报告发送给指定的收件人之后接下来要做的是把当前日期写入隐藏流下次脚本运行时就可以通过检查这个日期确定是否发送状态报告 四如何使用 根据上述思路AutoReportbat的完整代码如下 @ECHO OFF CLS SETLOCAL :: 调试模式以AutoReportbat debug形式运行命令进入调试模式 :: 调试模式输出详细的屏幕信息 (SET comment=REM ) IF /I %==debug @ECHO ON & (SET comment=) & GOTO :Launch SET arg=% IF DEFINED arg (ECHO 执行 % debug 可看到详细的命令输出) IF DEFINED arg (ECHO 执行 % 不带参数隐藏命令输出) & (Pause) & (GOTO :EOF) :Launch GOTO :BEGIN :: ************************************************** :: 要用到的工具 :: :: 名称delprofexe和srvinfoexe :: 来自Windows 或NT Resource Kit :: :: 名称dfexe :: 来自~chrisd/public/dfzip :: :: 名称Blat :: 来自Http:///~tcharron/l :: ************************************************** :BEGIN :: 放置工具软件的位置 SET SharedDir=\\ServerDir\tools :: 用来发送邮件的SMTP服务器 SET MailServer= :: 邮件的发件人 SET Sender= :: 邮件的收件人清单用逗号分隔多个地址 SET Recipients=FSe :: 删除以前可能留存的Blattxt文件(如因为脚本被中止运行) IF EXIST %systemdrive%\Blattxt del %systemdrive%\Blattxt IF EXIST %systemdrive%\Blattxt del %systemdrive%\Blattxt :: 删除过期的用户配置文件 :: 该命令已被注释掉请在启用它之前仔细阅读Delprof的说明 :: 如必要调整允许保留的天数(/d:选项) :: echo yes|%SharedDir%\DELPROFEXE /Q /D: :: 清除PST和TMP文件 :: 该命令已被注释掉 :: 在启用它之前请确认不会出现负面影响 rem for /F tokens= %%i in (%SharedDir%\Dfexe ^| find :) do (del /Q /S %%i*pst) & (del /Q /S %%i*tmp) :: 检查本月是否已经发送过报告状态的email FOR /F tokens= delims=/ %%i in (Date /T) DO (SET curmonth=%%i) FOR /F %%i in (%:%COMPUTERNAME%maildatetxt) DO (SET olddate=%%i) IF %curmonth%==%olddate% ECHO 本月已经发送过邮件 & GOTO :skipmail :: 检查病毒定义文件 ECHO ******* %COMPUTERNAME% 的病毒定义文件*******>>%systemdrive%\Blattxt ECHO>>%systemdrive%\Blattxt SET Fi |