脚本编程

Windows下bat批处理脚本使用telnet批量检测远程端口小记

多年没写过批处理了,来新公司的第一个case却是需要写一个bat脚本,批量更新采集agent的配置文件,其中就涉及到远程IP的端口检测。 本以为会和Linux一样可以简单判断: 结果发现Windows下面telnet退出并没有执行结果的返回值: 一、借助工具 于是我优先开启懒人法则,找其他替代工具。果然,在Windows老娘家找到了: Portqry:https://support.microsoft.com/en-us/kb/310099/zh-cn 确实可以使用,不过检测速度不敢恭维,通与不通都很慢!鉴于手头没有更好的解决办法,就先试试看,贴一下我写的Portqry相关demo: Ps:check是一个被call调用的模块,里面的一些变量就不做介绍了。 于是兴冲冲的封装成exe,给IDC(server2003系统)执行,结果第一台就悲剧了!远程桌面直接断开了: 然后再也连不上了,要他们去机房看了下,结果告诉我系统没了!!??太震精了有木有?一个简单的文本操作脚本,居然把系统干掉了么?而且脚本中都不存在任何删除命令。。。 要那边提供了一下启动错误信息,原来是系统引导坏了: 个人分析了一下,应该是Portqry这个工具导致系统蓝屏关机,进而导致引导损坏! 尼玛,娘家人介绍时说好的“性格”良好呢? 唉,看来这个工具是不敢使用了,俗话说林子大了什么系统都有嘞! 二、另辟蹊径 既然工具不敢用了,还是继续折腾代码吧!周末睡觉前突然灵感一闪,想起了tasklist判断窗口名称这个“失传绝技”,于是把刚关闭的本子又打开,终于在GF的不断抱怨之下搞定了这个问题。 ①、窗口判断 思路比较简单:使用start命令在新窗口执行telnet -e 和 exit命令,如果端口畅通,那么新开的窗口将会立即关闭,而不通的窗口则会保持近半分钟左右,且窗口名称类似 telnet 192.168.1.1,这半分钟时间足够脚本来判断通还是不通了。 于是将上面check部分修改如下: 样就解决了Windows下telnet探测远程端口的问题了,而且检测速度比微软哪个portqry快多了,果然思路比技术更重要,只要有想法,任何技术都不应该成为瓶颈! ②、进程判断【最新补充】 当使用窗口判断的方案下发各大机房实施的时候,又一个问题出现了!窗口判断在某些版本的Windows下是行不通的,比如英文版下的命令提示符窗口名称和中文版的就不一样,所以这个方案也是不完善的! 于是,继续抓耳挠腮,想出了第二个方案:通过判断telnet进程数量来判断网络是否畅通。 方案思路: a. 先判断脚本执行之前是否存在 telnet.exe 的进程,如果存在则统计数量 b. 和窗口判断一样,利用start命令在新的cmd命令提示符中执行 telnet 命令 c. 延迟几秒后统计系统中存在的telnet.exe进程数(存在的telnet表示是不通的) d. 和最开始统计的 telnet 进程数比对计算,就知道有几个IP是不通的了 示例代码:   很明显,这样就可以知道我测试了所有IP当中有几个是不通的了。遗憾的是无法知道是哪个IP不通。不过在手头的这个case当中是不需要具体不通的IP的,只要知道通的IP是否达标就行。 好了,终于把这个问题给解决了。显然,任何时候都需要给出多个方案,而不是自满于一个方案。否则出问题就会焦头烂额了。当然,再次说明了想法比技术更重要。
阅读全文
Symantec更新包[XP-i32]在线下载脚本 脚本编程

Symantec更新包[XP-i32]在线下载脚本

编写初衷:公司用的是Symantec杀毒软件,在客户端更新失败的时候,维护人员总是需要手动去下载离线更新包然后到客户端执行,非常麻烦!于是写了这个脚本丢到服务器上建立任务计划,客户端要更新的时候直接脚本调用\\server\symantec\update\20131225-002-i32.exe即可。 脚本名称:Symantec更新包在线下载工具 脚本功能:主要用于Symantec服务器离线包的自动下载,适用于使用symantec杀毒的企业运维。 脚本使用:先在服务器上测试运行是否正常,若无问题直接新建任务计划每天执行一遍脚本,即可保证服务器离线包为最新。 脚本说明: 1.此脚本需要和命令行下载工具wget.exe组合使用(点击下载); 2.默认本地路径为D:\Symantec\Update,若要修改请自行搜索替换(请注意空格) 3.服务器需要联外网功能,若实际情况不允许,可将此脚本丢到能联网的机器上,再加上自动上传代码即可(已略,有需求的请留言) 脚本代码: 此脚本下载的更新包支持一下Symantec版本: Norton AntiVirus / Norton Internet Security 2007 Norton 360 version 1.0 Norton SystemWorks (all versions) Symantec Mail Security for Domino v 5.x Symantec Mail Security for Domino v 7.x Symantec Mail Security for Domino (32-bit) v 8.0.x Symantec Mail Security for Microsoft Exchange Symantec Scan Engine 5.x for Windows Symantec AntiVirus for Caching/Messaging/NAS for Windows 其他版本需要自行修改脚本链接地址(需要分析下载页面,有需求的可以留言)。 Ps:估计很多朋友也用不到,但是还是贴上来了,只要代码中能有供你参考的内容就好!
阅读全文
桌面白屏(Active故障)修复批处理 脚本编程

桌面白屏(Active故障)修复批处理

一年前我在做用户系统维护服务工作时发现AD域环境下,AD用户桌面经常会出现壁纸无法显示,ActiveDesktop桌面损坏之类的故障,当时从前人心得里学到的方法就是登入管理员,然后删除用户配置目录(%userprofile%),然后重新登入之后用户桌面就能正常了 如此确实能修复这白屏故障桌面,但是用户的所有事设置均被重置,加大了维护工作量,这不是做维护愿意看到的,于是左查右查,我终于找到了症结所在! 原来,加入AD后,域用户的桌面都是网域服务器来配置的,而Active桌面就是从网域获取的一个叫做Desktop.htt的配置文件来控制的,每次用户环境的刷新,都会从AD服务器重新获取新的配置文件,当出现故障的时候(没深究,大概就是网域通讯之类的故障),Desktop.htt文件内容将会改变,都是无法连接之类的描述,从而造成了Active桌面故障,一片惨白! 于是,最开始就有了手动解决的办法,从正常用户环境得到正常的文件,将里面的分辨率修改成目标电脑分辨率并拷贝这个文件去覆盖损坏的desktop.htt,然后立刻设置为只读属性(否则一刷新就被损坏文件重新覆盖,从网域抓取失败时,生成的错误文件)。 问题到这里,至少有了解决办法,但是还是挺麻烦,还是不是作为超级懒人的我所要的答案,于是我就动手写个批处理好了,于是就有了下面这个代码: 简单说明:代码先获取屏幕分辨率,然后重新生成一个正常格式的desktop.htt文件,然后替换损坏文件并设置只读权限即可完成修复。 注意事项: 1.由于这个desktop.htt文件是设置了壁纸路径的,所以如果你要使用,请将代码中的【C:\windows\web\wallpaper\youjbg.jpg】替换成你电脑的实际图片路径。 2.而如果是公司电脑或网吧之类的,可能用的就是统一桌面壁纸了,这时你只要将我这个代码和图片放到一起,然后把youjpg.jpg修改成你的图片名称就行了!也可以打包成exe文件,更方便!后续我会再写一篇利用winrar打包批处理的教程,敬请期待! 3.此代码仅在XP环境下测试过,其他环境请先测试后再使用。 代码使用过程若有任何问题请在留言处粘贴错误信息,我会第一时间答复你!
阅读全文
[持续更新]批处理全盘搜索系列案例 脚本编程

[持续更新]批处理全盘搜索系列案例

虽然现在全盘搜索相关的实用软件很多也很强大,但是在手头上无法下载的时候,批处理这个"资深前辈"又得派上用场了,接下来介绍的代码均为全盘范围的批处理: 案例一、列出我的电脑中的所有硬盘分区 简单说明:代码使用for依次循环读取C到Z,并加上:\进而使用if exist判断路径是否存在,存在则打印到屏幕上。 案例二、全盘查找某个文件 (来自我的百度回答) 知友问: 不知道文件路径,只知道名字,怎么制作bat运行文件? 如题,要做1个打开文件的bat,知道是用star +路径。但是我没有路径只知道名字,而且我这个电脑没有那个文件。是学校的机子。。。求一个指令可以搜索直接运行,就像菜单中的”运行“那样 我给出的代码: 简单说明:在案例一的基础上嵌套了一个for /r 遍历目录循环,但存在某一个分区的时候,则执行内嵌的for循环,遍历分区搜索关键字,若找到含有关键字的文件则打开(其实那个判断文件是否存在有点多此一举,为了代码不出错我还是加上了)。 案例三、全盘搜索并删除包含关键字的所有文件 (来自我的百度回答) 知友问: Dos批量删除文件名带有~$的.doc文件 请看问题内容 我的电脑里大量的带有~$的.doc文件 想用DOS命令手动删除 文件夹搜 这个办法的 别凑热闹 回答 修改Offic 先选项 也别凑热闹 我给出的答案: 以下代码保存为bat文件,执行后全盘搜索符合你要求的doc文件,然后删除,并将删除结果写到批处理同目录的result.log,为避免误删除,已将删除功能屏蔽,仅显示目标文件具体位置,若要让删除生效,直接将代码第四行的【echo】删除即可,希望对你有用: 简单说明:此代码和案例二非常相似,只是这个代码中不是匹配完整文件名,而是前后使用*号包裹关键字进行通配搜索。 更多案例,待后续更新,敬请期待!若有其他需求,请留言~
阅读全文
[持续更新]批处理重命名系列案例 脚本编程

[持续更新]批处理重命名系列案例

批处理用于文本/文件的操作确实非常简单有力!不用多么复杂的代码,仅一个记事本加上简洁的代码即可搞定大部分文本/文件的操作,下面记录下我用过的一些代码,基本都是我在百度回答知友的一些代码,既给涧客们参考,也让起到备忘的作用。。。。(本文是系列博文,将持续更新,敬请关注!) 案例一、 百度原址 知友问: 想把一个文件夹里的全部文件都命名成001,002……这样按顺序,什么顺序无所谓,只要名字都变了就行,谁帮忙写个 我给出的代码: 简单解释: 1.使用for /r 遍历当前目录(%~dp0)下所有文件,效率比for /f + dir /s /b 高; 2.if not语句用于排除bat文件本身,全路径是%0,拓展到bat文件名:%~nx0; 3.利用变量1000开始累加,每次利用!var:~-3!取得后三位,即依次为001、002、003... Ps:var=1000,那么此脚本最多重命名999个文件,再多将出现覆盖错误,如何修改?请涧客思考,最好能在评论中留下您的代码,呵呵!(比较简单,大虾请勿拍砖!) 案例二、 百度原址 知友问:   “比如,我有一个文件夹里的文件都是X1,、X2…X51,我有个的文件名字是X15.ass,用完以后变成 Soul Eater 14 .ass代码如下: 如何才能让顺序变正确,顺便说一下,最后一个51变成了1. 我给出的代码: 简单解释:因为a的值,被初始化为0,所以第一个文件就是0,第二个是1,那么第15个就是14了。。。代码调换了下顺序,先给a+1,让重命名时a的值为1即可。 Ps:此处使用for+dir 的方式,效率虽然会低一点,但是出错率也降低了,容易懂!当然一样可以用for /r。
阅读全文