标签 批处理 下的文章

批处理判断指定文件是否存在

@echo off
rem search specified file for debugging
set "FileName=tunps.com.tag"
for %%a in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
if exist %%a:\nul (
rem for /f "delims=" %%b in ('dir /a-d /b "%%a:\%FileName%"') do (
for /f "delims=" %%b in ('dir /a-d /b "%%a:\*%FileName%" 2^>nul') do (
if /i "%%b" equ "%FileName%" (
Set "varFound=1"
)
)
)
)

if "%varFound%"=="1" goto FoundDebugTag else goto NotFoundDebugTag

:NotFoundDebugTag
"%programfiles(x86)%\app.exe"
goto Q

:FoundDebugTag
cmd.exe
goto Q

:Q

以上批处理判断所有文件根目录下是否存在文件tunps.com.tag文件,如果存在运行cmd.exe,如果不存在运行app.exe。

(PHP+批处理 )ADSL断线法投票刷票

20天的一个晚上,哥在上网。QQ弹出消息,初中同学叫我帮他同学投票,哥点开他给我的地址。差点没把我雷到哦,原来是选“爱心大使”,与其叫“爱心大使”,不如叫“赌博大使”。

(PHP+批处理 )ADSL断线法投票刷票

然后看了看投票的方式,原来使用ajax来请求一个地址来完成票数的增加,没有验证码,没有ip限制,F5刷起来相当的过瘾。然后开始装b了起来,给他说可以刷任意多票。我千不该啊万不该,不该把b装起来。后面的悲剧故事紧接着发生鸟。开始用php+curl写了一个几行的小脚本1分钟之内可以刷到1W票以上。然后就没有管它了。

结果过了几天同学又找到我了,说刷不起了,哥一看,我kao,肯定是做了ip限制,然后仔细的分析了一下网页。

点击“投票”后,onclick了一个GetIP() ,函数定义如下:

function GetIP(id)
{
var pass = '8966B88D690F10908063AB2B5B6AD911';
// var a = parseInt(Math.random()*100000000)%10;
// var b = '5';
// var c = a * b;
// var str=prompt("输入下列运算结果后才能投票成功:"+ a + " x "+ b + " = ??" );
// if(str == c)
// {
var IP = '125.86.0.107';
var now=new Date();
var url = "ip.aspx?id="+id+"&ip="+IP+"&pass=" +pass +"&time=" +now ;
xmlH.open("GET", url, true);
xmlH.onreadystatechange = nowOpenUpdate;
xmlH.send(null);
// }
// else
// {
// alert("输入运算结果不正确,请重新投票。")
// }
}

js中的pass变量和哥的Ip是唯一对应了,也就是服务器把ip通过某个函数转成了类似于md5的32位密钥。因为投票已经结束了,所以管理员已经把某些代码用//注释了起来。 点击投票后会弹出来一个随意的乘法算术题,答对了才get ip.aspx,否则弹出错误提示。 对于机器人来说,这个算术题有个毛用,完全是摆设。请求方法是get,页面是 ip.aspx?id="+id+"&ip="+IP+"&pass=" +pass +"&time=" +now。 参数有id,id是选手的id,ip就是客户端ip,pass就是刚才的pass变量,time类似于这种格式“Mon Sep 13 2010 17:49:04 GMT+0800”的时间。

最后根据这样的环境,哥写了如下php代码:

<?php
/*
获取adsl公网ip
tunpishuang at gmail dot com [tunps.com]
2010.08.23
*/
$ch=curl_init();
$option=array(
CURLOPT_URL=>'http://www.123cha.com/',
CURLOPT_RETURNTRANSFER=>true
);
curl_setopt_array($ch,$option);
$data=curl_exec($ch);
preg_match("/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/",$data, $matches);
$ip=$matches[0];
/*
获取pass变量的
*/
$ch=curl_init();
$option=array(
CURLOPT_URL=>'http://xx.com/tp.aspx',
CURLOPT_RETURNTRANSFER=>true
);
curl_setopt_array($ch,$option);
$data=curl_exec($ch);
preg_match("/([A-Z0-9]{32})/",$data, $matches);
$pass=$matches[0];
/*
发送投票数据包
*/
$ch = curl_init();
$options=array(
CURLOPT_TIMEOUT=>5,
CURLOPT_URL=>"http://xx.com/ip.aspx?id=5&ip=".$ip."&pass=".$pass."&time=Sun%20Aug%2022%202010%2023:01:49%20GMT+0800",
CURLOPT_RETURNTRANSFER=>true,
CURLOPT_POST=>false,
);
curl_setopt_array($ch,$options);
$data = curl_exec($ch);
print_r($options);
echo $data;
curl_close($ch);

将以上代码保存为vote.php。首先到123cha上面获得ip(垃圾长城宽带的adsl是非常诡异的),然后到tp.aspx获取pass变量,time不管它,因为没有它没有做验证。然后curl模拟刷票。但是我们的问题还没解决,因为每次运行这个php脚本,ip都是一样的。然后哥继续在上网搜寻通过adsl连续断线连线的方法。找到两个命令:rasdialrasphone,前面一个用来adsl连线,后一个用来断线。为啥rasdial不能断线呢,这个我也百思不得其解。反正我本地测试没有断线成功,所以用rasphone替代。将以下批处理代码保存为vote.bat

@echo off
set /p choise= 确认按回车(Enter)开始刷票
:loop
rasdial 宽带连接 adsl用户名 adsl密码
.\php.exe -c .\php.ini vote.php
rasphone -h "adsl"
;rasdial adsl /disconnect
ping -n 10 127.1>nul
goto loop

先连线,然后刷一票,然后断线,然后用ping休息10秒钟,继续重复这个过程。另外要让php运行正常需要通过php.ini来配置扩展。将以下代码保存为php.ini

[PHP]
extension_dir = "./"
extension=.\php_curl.dll

指定php的扩展路径和扩展。然后拷贝php安装目录下面的ext目录下面的php_curl.dll到vote.bat的同一个目录。这个时候php+批处理的刷票“程序”算是完成了,在已经安装了php的机子上可以正常运行,但是没有安装的php的环境,还需要拷贝php运行必须的dll库文件,最终包含的文件列表是:

libeay32.dll
php.exe
php.ini
php5ts.dll
php_curl.dll
ssleay32.dll
vote.bat
vote.php

最后我的总结是:最近和regular expression灰常的有缘非,公司网站js验证多次用到这个,看来有必须系统的学习一下鸟。

批处理分解数据库连接字符串

@echo off
rem tunpishuang[http://tunps.com]
rem 连接字符串格式:
rem provider password security "user id" "initial catalog" "data source"
rem provider server database uid pwd
rem 211条记录
setlocal enabledelayedexpansion
set num=1
for /f "usebackq" %%a in (`dir C:\Users\Administrator\Desktop\ConnectString4Web /s /b /a-d`) DO (
for /f "delims=; tokens=1,2,3,4,5,6" %%b in (%%a) DO (
for /f "delims== tokens=1,2,3,4,5,6,7,8,9,10,11,12" %%h in ("%%b=%%c=%%d=%%e=%%f=%%g") DO (
set /a num=!num!+1
rem echo [%%h %%i] [%%j %%k] [%%l %%m] [%%n %%o] [%%p %%q] [%%r %%s] !num!
if "%%n"=="UID" echo www.xxx.com %%o %%q >>conn.txt
if "%%n"=="User ID" echo www.xxx.com %%o %%k >>conn.txt
rem if "%%j"=="Password" echo %%k
rem if "%%p"=="PWD" echo %%q
rem echo !num!
)
)
)
endlocal

解释一下:

C:\Users\Administrator\Desktop\ConnectString4Web 目录下面有很多数据库连接字符串的文件,内容有两种:

一种是Provider=SQLOLEDB;Server=localhost;Database=xx;UID=xxxx;PWD=xxxxxx

还有一种是:Provider=SQLOLEDB.1;Password=xx;Persist Security Info=True;User ID=xx;Initial Catalog=xx;Data Source=(local)

如果通过批处理,将所需要的Server(Data source)、UID(user id)、PWD(password)提取到一个文件,格式为:

server1 uid1 pwd1
server2 uid2 pwd2
server3 uid3 pwd3

以上为题是发到cndos上面的一个帖子,但是没有鸟我,自己搞定。

批处理里面的符号详解

1.    @

不 显示命令自己,如@dir /a

此 一般只在批处理中,与echo off配合使用。

如@echo off关 闭回显,并不显示echo off自己

2.    & , && , ||

一 个&的 意思是连接两条命令,如:

<1>echo hello & dir /a

<2>echo hello

dir /a

<1>与<2>的 结果一样,都是先显示hello然后执行dir /a

用&可 以将两条命令放在一行

&&的 意思也是连接两条命令,但是要作一个判断,也就是说在&&前面的命令执行成功的时候才会执行&&后 面的。如果&&前 面的执行失败,&&后面的就不执行。

而||刚 好与&&是 相反的,即||前 面的命令执行失败,||后面的才运行,否则||后面的不运行。

举 个例子:

ping /n 2 127.1 & cls    //无论成功与否都清屏

ping /n 2 www & cls     //无论成功与否都清屏

ping /n 2 127.1 && cls   //ping通了才清屏

ping /n 2 www && cls //ping不通不清屏

ping /n 2 127.1 || cls    //ping通了不清屏

ping /n 2 www || cls    //ping不通才清屏

ping 127.1也 就是ping 自己,ping自己当然能ping的 通啦,而www什 么都不是,当然ping不通。

将 上面的每行命令自已实验一下就明白了

3.    |

管 道符,即“|”前面的输出作为后面的输入,例如:

echo list volume | diskpart

dir /b /s c:\windows | more

4.    <

重 定向输入。正常情况下,命令是接收键盘输入的,例如,在CMD下用del删 除一个文件夹下的所有文件,如del f:\music 会出现提示是否删除[y/n]?这 时按了y 就 删了,按n 就退出。我们还可以建立一个文本如a.txt,里面写个y,然 后输入del f:\music < a.txt这时就从a.txt里 取出字母y输 入到命令里,就相当于在键盘上按了个y一样

当 然在这里我们也可以用“|”来让他自动删除,不用你来确认,如:

echo y | del f:\music

5.    > , >> , 2> , 2>>

这 四个符号都是重定向输出的意思,但各有区别。正常情况下输入一命令,其结果会输出到屏幕上,而我们在后面加上重定向输出符号,可以把结果输出到一个文件 中,或直接输出到打印机里。例如:

“>” 重定向输出到文件,并覆盖原文件内容,如:dir /b /s c: >c:\a.txt

“>>” 重定向输出到文件,并追加到文件结尾,如:dir /b /s d:>> c:\a.txt

“2>” 错 误重定向输出到文件,并覆盖原文件内容,如:dir /b /s z:\ 2> c:\a.txt (假 设没有z盘)

“2>>” 错 误重定向输出到文件,并追加到原文件结尾,如:dir /b /s z:\ 2>> c:\a.txt (假 设没有z盘)

6.    %

这 个符号不太好讲,除了在set /a 里面是表示两数相除取余,其它地方一般都是用来表示一个变量的,但用的地方不同, 其表示方式不同。如%1用来表示一个变量;%userprofile%是使用userprofile环 境变量;如果是在cmd 下运行for用%a表 示一个传递的参数;而在批处理下运行for 就要用%%a来表示;而在变理的嵌套使用 的时候,外层就要在加一对%,如:%%num:~0,%a%%%。虽说有这么多表示方式,但每 个地方怎么用都是固定的,这里不用刻意的去记,多看看别人写的代码,自己多练练就知道哪里该怎么用了。

7.    : , ::

用 来写注释的,写注释一般用“::”或rem,而一个“:” 一般是用来作标记的,和goto 或call配合使用

8.    !

在 开启延迟环境变量后,代替“%”,在后面讲延迟环境变量时细讲,其它用法貌似没有呵

9.   */?

通 配符,“*” 代表任意字符,“?”代表任意一个字符。

10.   ()

用 来表示一组命令。后面讲for 和if 的时候细讲

11.   “”

用 来表示字符串,在CMD里面空格是用来分格两个字符串的,如果一个字符串里面有空格,就用“”引起来,就表示一个 字符串了,如:

dir “c:\program file”

‘’ 单引号在for里 面表示使用命令结果作为字符串,在for 里面在细讲。

12.   ^

转 意思字符。CMD里 以上这么多符号,如果不想使用这些符号所表示的意思,而是只想使用符号自己,在符号前面加上^就 可以了。如:

echo hello & echo world

echo hello ^& echo world

via

批处理操作递归目录下的文件

情况: 某php cms系统使用zend guard加密,解密程序是cli模式下面运行,并且每次只能解密单个文件,所以需要使用批处理来解密所有目录下面的php文件。 代码:

for /f "delims=" %%a in ('dir d:\xxcms\*.php /s /b') do decode.exe %%a

update(2011.3.30)有时候不能用两个百分号,否则提示:

此时不应有 %%a。 改为一个百分号就可以了

for /f "delims=" %a in ('dir d:\xxcms\*.php /s /b') do decode.exe  %a