Board logo

标题: [转贴] plp626的批处理学习笔记 [打印本页]

作者: Batcher    时间: 2009-3-18 19:59     标题: plp626的批处理学习笔记

【0】前言杂记

1、windows,xp下的cmd共有71个内置命令,每个命令都自带了帮助信息,现在先把这些帮助全部导出来放到桌面的cmdhelp目录里
这里给个代码:
  1. @echo off&mode con lines=5 cols=50
  2. md cmdhelp ||(pause&exit)
  3. title 正在导出cmd帮助信息到cmdhelp目录内, 稍等...
  4. chcp 437>nul&call :help E
  5. graftabl 936>nul&call :help C
  6. cd cmdhelp
  7. set mark=───────────────────────────────────
  8. for %%i in (*.E) do (
  9.     echo.>>%%i &echo %mark%>>%%i
  10.     copy %%~ni.E+%%~ni.C EC_%%~ni.txt>nul
  11.     echo %mark%>>EC_%%~ni.txt &echo.>>EC_%%~ni.txt
  12. )
  13. del *.c;*.e
  14. find /v "" *.txt>ALL.help
  15. title 已完成 按任意键查看. &pause>nul
  16. start notepad ALL.help
  17. goto :eof
  18. :help
  19. for /f %%i in ('help^|findstr "^[A-Z]"') do help %%i>>cmdhelp\%%i.%1
  20. goto :eof
复制代码
本人还是推荐看英文原版帮助的,这个把英文的版本与中文版本放在一起了,英语差点可以结合着看,
本想做成htm格式,这个我还没想好,论坛里已经有人写过相关代码,搜下借鉴着改*改,就可以了.

下面的帖子是我边学别写的,有收获就添,所以修改是难免的,里面的用法有些可能帮助里没有解释,那这些大都是我从论坛里前辈那总结的,

掌握变量截取%str:~x,y%即:%str%的偏移量为x处,长度为y的字符

经常要用到变量的截取,所以这个命令自然得熟练掌握,这里x,y有正有负,总共也就4种情况,分别都是怎么截取呢?
做个小试验,命令提示符下演示结果:
  1. @echo off
  2. set str=%date%
  3. echo %str%
复制代码
2008-01-28 星期一
这个显示结果是说, 变量%str%的值为"2008-01-28 星期一"
  1. set a=%str:~2,4%
  2. echo %a%
复制代码
08-0
这个说明,从%str%第2个字符右侧,往后截取4个字符, 就是变量%a%的值.下同理
  1. set b=%str:~6,-2%
  2. echo %b%
复制代码
1-28 星
从%str%第6个字符右侧,往后截取%str%最后2个字符所剩余的字符, 就是变量%b%的值
  1. set c=%str:~-3,2%
  2. echo %c%
复制代码
星期
从%str%的倒数第3个字符左侧,往后截取2个字符, 就是变量%c%的值
  1. set d=%str:~-6,-2%
  2. echo %d%
复制代码
28 星
从%str%的倒数第6个字符左侧,往后截取%str%最后2个字符所剩余的字符,就是变量%d%的值

上面4种情况记忆是不方便的,重要的是抓住共性,下面是我的理解(很不专业!因为偶不是jsj专业的):

观察上面4个赋值语句并归纳得到语句:
set s=%str:~x,y%
的作用就是:在字符串%str%的偏移量x处,取"长度"为y的字符,然后赋给变量s.
理解与掌握:

记:   左->右 ---正方向
       右->左 ---负方向
       x为正或0时,偏移量x处表示沿着正方向第x个字符的右侧处.
       x为负时,   偏移量x处表示沿着负方向第x个字符的左侧处.

例如  abcdefg的偏移量为-4处就是字符d的左侧处

       y为正或0时,取"长度"为y的字符表示沿正方向获取y个字符.
       y为负时,   取"长度"为y的字符表示沿负方向舍弃|y|(y的绝对值)个字符所得的剩余字符.

例如  abcdefg的偏移量为-4处,获取长度为2的字符,就是字符d的左侧处,沿正方向获取2个字符即:"de"
        abcdefg的偏移量为2处,获取长度为-4的字符,就是字符b的右侧处,沿负方向舍弃4个字符即得到剩余的字符:"c"   
另外:
       当y为负时, %str:~y%表示获取%str%的后|y|字符(这个可以看做%str:~-|y|,|y|%的简写)
       当y为正时, %str:~y%表示舍弃%str%的前y个字符后剩余的字符(这个很重要,用偏移量+长度的方法不能表示的.)

关于简写:
       x或y其中之一为0时,0可省略. 比如: %str:~0,3%   可简写为 %str:~,3%
       x为正时 :                        %str:~-x,x'% 可简写为 %str:~-x% (这里x'是大于x的任意正数)

最后说下,不合理的截取将会得到"空"值.
比如现在执行
           set str=abcde
           set f=%str:~-2,y%
显然%str%的偏移量-2处为字符"d"的左侧,由于不管y为多少,所获取的字符串都是剩余字符串"de"的子集,所以要想%f%不为空,就要合理截取.
当y取0,±1,2其中之一时%f%不为空;当y小于或等于-2时%f%为空,而当y大于或等于2时%f%恒为"de".

另外:
环境变量替换已有如下增强:

    %PATH:str1=str2%

会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的
开始到 str1 剩余部分第一次出现的地方,都一直保持相配。

比如执行:

set a=123456123456
set b=123456123456
echo %a:2=+%
echo %b:1=%

将显示: 1+34561+3456
           2345623456

原文地址:http://www.cn-dos.net/forum/viewthread.php?tid=37382
作者: Batcher    时间: 2009-3-18 19:59     标题: 【1】很重要的set 命令

set共两个参数/a 与/p
直接键入"set" 会显示系统化境变量及当前环境变量,
而 键入"set p" 会显示所有以字母 P 打头的变量,并且以变量名排序
缺省参数的情况不用多说,注意两点
1.赋空值:
  set "a="
2.养成好的习惯,以免多赋值一个空格出错.
   比如:
        set str=abc
   时加上一对双引号
        set "str=abc"

对于/a 参数

/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式
评估器很简单并以递减的优先权顺序支持下列操作:

    ()                                - 分组
    ! ~ -                            - 一元运算符
    * / %                          - 算数运算符
    + -                              - 算数运算符
    << >>                        - 逻辑移位
    &                                - 按位“与”
    ^                                - 按位“异”
    |                                 - 按位“或”
    = *= /= %= += -=       - 赋值
      &= ^= |= <<= >>=
    ,                                 - 表达式分隔符

注意前提:
1. 8进制数0?(0<=?<=7)与16进制数0x?(0<=?<=15),首字符不为0者为10进制数.

2. /a参数只对-(2^31-1)至2^31之间整数进行操作(注意是xp版本).
这点可以用代码来测试:
  1. @echo off&setlocal enabledelayedexpansion
  2. :支持最大数为1.9950631168807583848837421626836e+3010
  3. set m=1
  4. for /l %%a in (1 1 10000) do (
  5.    for /l %%b in (1 1 %%a) do (
  6.       set /a m*=2
  7.       set /a n+=1
  8.       echo !m!=2^^^^!n!
  9.       if "!m:~,1!" == "-" echo !m!&set /a mm=!m!-1&echo !mm!=!m!-1 &pause&exit
  10. )  )
复制代码
一元运算符~ ! -

~取反
将-(2^31-1)至2^31看做一个数轴,"原点O"为0的左侧与-1的右侧
(此数轴可以看做一个首尾封闭的数轴,对2^31-1加1将得到-2^31)
这样可以将计算机里的二进制数(全是整数)的取反看做求"相反数"了:

-2^31 ...︺︺︺︺︺︺︺︺︺︺︺︺︺︺︺O︺︺︺︺︺︺︺︺︺︺︺︺︺︺︺... 2^31-1
                                            ... -3 -2 -1  0 1  2 3 ...                     
~[x]就表示[x]的反数
比如:
  1. set /a a=~-1
复制代码
%a%就等于0
  1. set /a a=~5
复制代码
%a%就等于-6

!取非
![非0正数]为0
![0]为1
比如:
  1. set /a a=!2
复制代码
%a%就等于0
  1. set /a a=!0
复制代码
%a%就等于1

"-"取负数
-[x]与数学上的-x是一致的,只是要注意发生溢出时的状况
比如:
  1. set /a a=-(-2147483648)
复制代码
%a%为-2147483648而非2147483648,这是因为2147483648已溢出:
2147483648=(2^31-1)+1

算术运算符 * / % ﹢ -
算术运算符: *  /   %          ﹢  - 分别对应
  数学符号: x ÷ mod(取余) +  -
需要注意的是"%"是在命令行下,而在bat中则要用%%

逻辑移位: << >>
注意在批处理中或命令行下要加上一对双引号""或用^对<,>进行转义.
set /a [x]"<<"[y]
表示对[x]的二进制数左移[y]位
比如:
  1. set /a a=15"<<"1
复制代码
%a%就等于30
这是因为:15=bin(00 00000 00000 00000 00000 00000 01111)
左移1位就成了bin(0 00000 00000 00000 00000 00000 011110)
而bin(0 00000 00000 00000 00000 00000 011110)=2^4+2^3+2^2+2^1=30

经过简单的数学推导就可以知道:
[x]"<<"[y]==[x]*2^[y]
[x]">>"[y]==[x]/2^[y](注意溢出)

同理">>"就是右移,原理一样,这里略.

逻辑 "异", "或", "与": "^", "|", "&"
注意在批处理中或命令行下要在运算符前加上^
这里的:                ^            |             &    对应于
离散数学上的: 异或⊕     析取∨     合取∧
规则: 合取∧(有0则0)  析取∨ (有1则1) 异或⊕ (同0反1)
比如:
  1. set /a a=15^^5
复制代码
%a%就等于10
这是因为:
     01111
⊕) 00101
─────
=)  01010
而bin(01010)=10

对于"|", "&"原理一样,这里略.

赋值运算符
"=" 这个不用说了
对于 *= /= %= += -= &= ^= |= <<= >>
拿"+="为例,其他同理.
这只是一种简写
比如下面两行代码等效:
  1. set /a a+=2
  2. set /a a=a+2
复制代码
表达式分隔符","
这个运算符可以用来简化代码:
比如:
  1. set /a a=1
  2. set /a b=2
  3. set /a c+=3
复制代码
就可以简写为:
  1. set /a a=1,b=2,c+=3
复制代码
  1. @echo off
  2. ::分数化小数,徒手除法
  3. set/a a=1,b=7
  4. set/a c0=a/b, r0=a%%b*10
  5. set/a c1=r0/b,r1=r0%%b*10
  6. set/a c2=r1/b,r2=r1%%b*10
  7. set/a c3=r2/b,r3=r2%%b*10
  8. echo %c0%.%c1%%c2%%c3%
  9. pause
复制代码
另外:
set /a ... 与 set /p ...
可以省略掉set 与 /之间的空格写成
set/a ... 与 set/p ...
关于这类省略空格的用法,还有不少,后续再补充.
set/a的指针用法(有点像指针姑且这么叫吧):
数值定义:
  1. @echo off
  2. call:arr arr 1 2 3 4 + d d+ 258 68 944 ddd pp dd
  3. set arr
  4. pause
  5. :arr
  6. set/a n+=1
  7. if %2.==. goto:eof
  8. set %1%n%=%2
  9. shift /2
  10. goto:arr
复制代码
统计字符串中各种字符出现次数:
  1. @echo off
  2. set "str=aferefwfwerergrgreaaffwafwa"
  3. set/p= %str% 中有<nul
  4. :loop
  5. set /a %str:~0,1%+=1&set str=%str:~1%&if defined str goto loop
  6. echo  a %a% 个
  7. pause
复制代码
关于参数/P
1.接收键盘的输入
  1. @echo off
  2. :begin
  3. SET /p a=请输入一个字符串:
  4. echo %a%
  5. goto begin
复制代码
注意能用来作为变量的字符不能是常量数字,可以是字母,汉字等,及其字符串.
当输入特殊字符^&|<>时,前要加上^,否则出现语法错误.
语句"SET /p a=请输入一个字符串:"
类似c++里的:
  1. cout << "请输入一个字符串:\n";
  2. cin >> a;
复制代码
2.接收文件的首行.
这个用下面两个代码可以理解%0表示批处理本身:
代码一:
  1. :::::::::::::::::::
  2. @echo off
  3. set /p a=<%0
  4. echo %a%&pause>nul
复制代码
代码二:
  1. ::::::&color 02
  2. @echo off
  3. set /p a=<%0
  4. echo %a%&pause>nul
复制代码
3, set/p 特殊用法 .
左对齐(注意代码中的是制表符):
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (1 10 999) do (set/a n+=1&set /p=^%%i <nul
  3. if !n!==5 set n=0&echo.
  4. )
  5. pause
复制代码
删回车符延迟(也可用ping)显示:
  1. @echo off
  2. for /f "tokens=*" %%i in (1.txt) do echo.|set /p=%%i
  3. pause
复制代码
删除1.txt每行的回车符后输出到2.txt里(拼成一行):
  1. @echo off
  2. for /f "tokens=*" %%i in (1.txt) do set /p=%%i<nul >>2.txt
  3. pause
复制代码
一般地set /p 的这种用法都会与|或<nul 联系起来.
<nul使得输出的最后一个字符没有换行符,这点很有用.
作者: Batcher    时间: 2009-3-18 20:00     标题: 【2】for 命令详解

FOR [/d|/r|/l|f] [[drive:]path] ["options"] %variable IN (set) DO command [command-parameters]

1.  参数缺省
    for %i in (cn dos 5 2 1 ! ??.* cmd\*) do echo %i
   //依次打印字符串:cn,dos,5,2,1,!,"当前路径下与??.*匹配的非隐藏文件全名","当前路径下cmd目录内所有非隐藏文件全名".这里用空格对元素进行分界.
   //对于? *这两个字符,for会当作通配符去匹配文件名,而不会显示这两个字符

2. 参数d 是dirctory目录的缩写,作用在于集合里有通配符时匹配目录名而非文件名.

    for /d %a in (cn dos  5 2 1 ! * cmd\*)  do echo %a
   //依次打印cn,dos,5,2,1,!,"当前路径下所有非隐藏目录的目录名" “当前路径下cmd目录内所有非隐藏目录名”
   
3. 参数r 是road路径的缩写,作用在于它将会给集合里的元素加上指定路径下的目录树(请注意目录树包含了隐藏目录,子母录)再打印
    for /r %windir% %i in (plp626 . *) do echo %i
   //依次打印"%windir%目录树\plp626" "%windir%目录树\." "%windir%目录树\相应的文件全名(注意相应目录内的文件不包含隐藏属性的!)"
   //当%windir%缺省时,默认为当前路径.

4.  参数l 是ladder阶梯的缩写,作用就是按照 "起步 步长 结束"的递进方式来循环,这三个元素必须是自然数,当步长为0时,将成为死循环.
    for /l %a in (-10 1 10) do echo %a
   //依次显示 -10 -9 ... 10 这句表示 开始之为-10 以步长为1递增,当递增到10时循环结束
   
5.  参数 f 这个很要紧,认真看,f是file文件的缩写,和其他参数不同,这一个参数就有3种用法,个个神通广大:

    5.1 集合的元素是文件名
         for /f "eol=; skip=3 tokens=2,3* delims=, " %a in (test_1.txt test_2.txt) do echo %a %b %c
       //会依次分析 test_1.txt test_2.txt 中的每一行,忽略以分号打头(eolith原始的,开头)的那些行,跳过(skip)前3行
         以","为界定符(delimit划界),显示第2个,第3个,和剩余的字符串(token记号).

    5.2 集合的元素是外部命令的输出结果
        for /f "delims=" %a in ('more test.txt') do echo %a
       //取消默认的分割符(空格)对more test.txt打印的结果进行逐行分析,空格也会成为有效字符串.
        for /f "tokens=*" %a in ('more test.txt') do echo %a
       //对more test.txt打印的结果进行逐行分析,由于此时默认的分割符为空格,行前的空格字符将不会显示.
       //请注意括号里这对单引号,它有执行的意思,将执行对象的输出作为"文件"分析,这就决定了对象的输出必须是写入内存的,如果它没有这样,比如将more test.txt改为start test.txt或着test.txt它将打开test.txt,而%a由于没有接收到回车符这个命令,....
       //两外,这个外部命令还支持复合句,比如:
       for /f %%a in ('if exist 1.txt ^(echo ++^) else echo -- ')do echo %%a

    5.3 集合的元素是字符串
        for /f "tokens=*" %a in (" cn dos 帅 !") do echo %a
        for /f "delims=" %a in (" cn dos 帅 !") do echo %a
      //这两句都会显示cn dos 帅 !但不同的是前者将cn前的空格略去,后者原样打印.
        对于5.1如果有个test 3.txt(文件名为test 3)即文件名含空格,得用双引号将它括起来以表示文件名正确解释.
       但是这样就成立5.3的字符串用法,为了解释器能正确解释,它是个文件名,而非字符串,得用关键字"usebakeq",
        下面这句显示文件test 3.txt的相关内容(默认分割符为空格)解释器会把test 3.txt当作文件名,而非字符串.
        for /f "usebackq" %i IN ("test 3.txt") DO echo %i

有时要对移动硬盘或u盘进行判断,用这个命令
  1. wmic logicaldisk get name,description,drivetype
复制代码
6. for 变量的扩充
      以C:\Documents and Settings\pp365\桌面\ 路径下的 "test.bat"为例,对for 语句的变量测试如下
      (这里是用%0为例,在for语句中可以用相应的变量代换0):
用百分号0得到本批处理文件的带双引号的自身完整路径:
"C:\Documents and Settings\pp365\桌面\test.bat"

用 百分号~0
打印结果: C:\Documents and Settings\pp365\桌面\test.bat
用 百分号~f0
打印结果: C:\Documents and Settings\pp365\桌面\test.bat
用 百分号~d0
打印结果: C:
用 百分号~p0
打印结果: \Documents and Settings\pp365\桌面\
用 百分号~n0
打印结果: test
用 百分号~x0
打印结果: .bat
用 百分号~s0
打印结果: C:\DOCUME~1\pp365\桌面\test.bat
用 百分号~a0
打印结果: --a------
用 百分号~t0
打印结果: 2008-03-05 15:51
用 百分号~z0
打印结果: 947
用 百分号~$PATH:0
打印结果: C:\Documents and Settings\pp365\桌面\test.bat
----------------可以用组合修饰符来得到多重结果:

用 百分号~dp0
打印结果: C:\Documents and Settings\pp365\桌面\
用 百分号~nx0
打印结果: test.bat
用 百分号~fs0
打印结果: C:\DOCUME~1\pp365\桌面\test.bat
用 百分号~dp$PATH:0
打印结果: C:\Documents and Settings\pp365\桌面\
用 百分号~ftza0
打印结果: --a------ 2008-03-05 15:51 947 C:\Documents and Settings\pp365\桌面\test.bat

[ 本帖最后由 Batcher 于 2009-3-18 20:21 编辑 ]
作者: Batcher    时间: 2009-3-18 20:00     标题: 【3】熟练掌握 CALL start

call------单进程”传递“
start-----开启一个新的进程。

用call对变量进行截取:
call 具有二次预处理功能,这源于它的函数调用功能(个人愚见) .
由于%v:~%x%,%y%%会对%预处理,比如直接%v:~%x%,%y%%对最外边的一对%留下,这让我们想到用call再进一步进行预处理读取.
  1. @echo off
  2. ::在命令行下不能正确显示
  3. set a=12345678901234567890
  4. set /p b=输入两个正整数(不大于9)用空格隔开:
  5. call echo %%a:~%b:~,1%,%b:~-1%%%
  6. pause
复制代码
call :标签 "参数1" "参数2" ...
从:开始到首次出现的空格,当作标签的结束符.(标签可作为%0参数,即标签前与后的空格将被视作参数分隔符,)
call :^^^.... 将会是个空语句.
主标签中&(非^&)后的字符被当作语句执行.执行完后再跳转到副标签处.
副标签中含|&><:5个字符其中之一时,后面的字符被当作注释,将不进行任何解释.
标签字符不能为单独的<space> &()^=;%+,:|但以下特殊字符作为的标签是合法的:
`, '  ,^^ , ^^& ,  "<space>"  ,  "   ,  "", @,[,],{,},?,/,\,*,-,$,#,~,.,
当启用延迟环境变量时,!不能作为标签.
汉字,与其他扩展字符,以及混合字符也可以作为标签.
虽然不提倡用这些特殊字符作为标签,但是它们可以实现一些一般方法难以实现的脚本.
参数最多9个,再多就要借助"shift"命令(见后面)
call 在跳转的标签时遵循下面规则:
1, 大小写不区分,
2, 先在call 语句后面找,后面没有再在前面找.
3, 多个相同标签时只执行找到的第一个标签.
将这三点归纳成一句话就是:
,大小写不分,先后再前,执行一次.

另外
A.bat文件
  1. @echo off
  2. call %*
  3. goto :eof
  4. :a
  5. echo a任务 %*
  6. goto :eof
  7. ...
复制代码
若想要执行a任务,B.bat文件里可以这样调用(若是命令行下可以省去call)
  1. @echo off
  2. call A.bat :a 1 2 5
  3. pause
复制代码
这里在非命令行下运行B.bat时,B.bat内那个call是必须的,若是在命令行下直接B.bat调用则B.bat内那个call则可以省去l

模板:
  1. @echo off & setlocal ENABLEEXTENSIONS
  2. set x=2
  3. set y=3
  4. call :Area %x% %y% answer
  5. echo/The area is: %answer%
  6. pause
  7. goto :EOF
  8. :Area %width% %height% result
  9. setlocal
  10. set /a res=%1*%2
  11. endlocal & set "%3=%res%"
  12. goto :EOF
复制代码

[ 本帖最后由 Batcher 于 2009-3-18 20:23 编辑 ]
作者: Batcher    时间: 2009-3-18 20:00     标题: 【4】if ... else ...用法

if 条件? command A
if 条件? (command A) else command B

EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
==与equ不同,当command A为赋值语句时条件?若是?==?则需用?equ?
注意复合语句内的变量赋值.

[ 本帖最后由 Batcher 于 2009-3-18 20:24 编辑 ]
作者: Batcher    时间: 2009-3-18 20:00     标题: 【5】查找命令find & findstr

find

Searches for a text string in a file or files.

FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]

  /V         Displays all lines NOT containing the specified string.
  /C         Displays only the count of lines containing the string.
  /N         Displays line numbers with the displayed lines.
  /I         Ignores the case of characters when searching for the string.
  /OFF[LINE] Do not skip files with offline attribute set.
  "string"   Specifies the text string to find.
  [drive:][path]filename
             Specifies a file or files to search.

If a path is not specified, FIND searches the text typed at the prompt
or piped from another command.

如果没有指定路径,FIND 将搜索键入的或者由另一命令产生的文字。
使用find [参数] "?" 文件
查找文件后到结果总会在首行来个(表示下面的内容是来自*.*这个文件)
---------- *.*
当/v /c 参数连用时是(n为整数)
---------- *.*: n
现在来说参数的用法:
/v参数 不含"str"的行 如帮助所说,显示不包含指定字符串的行
find /v "?" ...    显示不包含?的行
但是常用find /v "" ...
它是打印文件所有内容,因为文件不会包含空字符.
/c 参数count 行数不会显示内容,只显示包含搜索字符串的行数,
这里要理解find在分析一个文件时它将回车换行符作为标志来认定为一行的结束与下行的开始,
find /c "?"...  不显示含?的行,但显示含?的行数,
find /c /v "?" ... 不显示行的内荣, 显示不包含?的行的行数,
find /c /v "" ... 仅显示不含空字符的行的行数,即文件的总行数.
/n参数 nember of lines若显示行的内容则给行首带上行号[:n]
  /n总是与/v连用时才能有效,与/c参数连用是无效.
/i 参数Ignores 对?忽略大小写.
若"string"含有空格,则空格不会被解释为逻辑或,而是有效字符串
find 参数 "?" *.txt *.c在当前路径的所有txt文件里进行[参数]查找(文件也可以枚举的格式:1.txt 2.txt 3.txt)
常用格式:
find /c "?" *.txt *.bat
find /v "?" *.txt *.bat
find /n "?" 1.txt
find /c /v "" *.*

findstr

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:file]
        [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
        strings [[drive:][path]filename[ ...]]

  /B         Matches pattern if at the beginning of a line.
  /E         Matches pattern if at the end of a line.
  /L         Uses search strings literally.
  /R         Uses search strings as regular expressions.
  /S         Searches for matching files in the current directory and all
             subdirectories.
  /I         Specifies that the search is not to be case-sensitive.
  /X         Prints lines that match exactly.
  /V         Prints only lines that do not contain a match.
  /N         Prints the line number before each line that matches.
  /M         Prints only the filename if a file contains a match.
  /O         Prints character offset before each matching line.
  /P         Skip files with non-printable characters.
  /OFF[LINE] Do not skip files with offline attribute set.
  /A:attr    Specifies color attribute with two hex digits. See "color /?"
  /F:file    Reads file list from the specified file(/ stands for console).
  /C:string  Uses specified string as a literal search string.
  /G:file    Gets search strings from the specified file(/ stands for console).
  /D:dir     Search a semicolon delimited list of directories
  strings    Text to be searched for.
  [drive:][path]filename
             Specifies a file or files to search.

Use spaces to separate multiple search strings unless the argument is prefixed
with /C.  For example, 'FINDSTR "hello there" x.y' searches for "hello" or
"there" in file x.y.  'FINDSTR /C:"hello there" x.y' searches for
"hello there" in file x.y.

Regular expression quick reference:
  .        Wildcard: any character
  *        Repeat: zero or more occurances of previous character or class
  ^        Line position: beginning of line
  $        Line position: end of line
  [class]  Character class: any one character in set
  [^class] Inverse class: any one character not in set
  [x-y]    Range: any characters within the specified range
  \x       Escape: literal use of metacharacter x
  \<xyz    Word position: beginning of word
  xyz\>    Word position: end of word

For full information on FINDSTR regular expressions refer to the online Command
Reference.

最多搜索字符串字节数为127
一般表达式举例:
1.
   findstr . 2.txt 或 findstr "." 2.txt
   从文件2.txt中查找任意字符(包括空格),不包括空字符或空行(过滤空行),此用法对unicode的字符也有效,下同.

2.
   findstr .* 2.txt 或 findstr ".*" 2.txt
   从文件2.txt中查找任意字符包括空行(原样打印)

3.
   findstr "[0-9]" 2.txt
   从文件2.txt中查找包括数字0-9的字符串或行

4.
   findstr "[a-zA-Z]" 2.txt
   从文件2.txt中查找包括任意字符(52个英文字母)的字符串或行

5.
   findstr "[abcezy]" 2.txt
   从文件2.txt中查找包括a b c e z y字母的字符串或行

6.
   findstr "[a-fl-z]" 2.txt
   从文件2.txt中查找小写字符a-f l-z的字符串,但不包含g h I j k这几个字母。

7.
   findstr "M[abc][hig]Y" 2.txt
   从文件2.txt中可以匹配 MahY , MbiY, MahY等…..

8.
   ^和$符号的应用
   ^ 表示行首,"^step"仅匹配 "step hello world"中的第一个单词
   $ 表示行尾,"step$"仅匹配 "hello world step"中最后一个单词

9.
   finstr "[^0-9]" 2.txt
   任何不在字符集0-9中的字符,即存在字符不属于0-9就打印,
   比如dfd41210   的对方的45  等 就会打印;而54545158将不被打印.

10.
   findstr "[^a-z]" 2.txt
   任何不在字符集a-z中的字符,即存在字符不属于a-z就打印.
   比如adfdfd2225 dfdfdfdfd大富大贵 等将被打印;而dfdfdffd不被打印

11.
   *号的作用
   前面已经说过了 ".*"表示搜索的条件是任意字符,*号在正则表达式中的作用不是任何字符,而是表示左侧字符或者表达式的重复次数,*号表示重复的次数为零次或者多次。

12.
   findstr "^[0-9]*$" 2.txt
   这个是匹配找到的纯数字,^ 是代表开头  [0-9]  代表数字    * 代表重复0或多次  $ 代表结尾.
   例如 234234234234,如果是2133234kkjl234就被过滤掉了。但是单个的数字不匹配.
   Findstr "^[a-z]*$" 2.txt
   这个是匹配找到的纯字母,例如 sdfsdfsdfsdf,如果是213sldjfkljsdlk就被过滤掉了
   如果在搜索条件里没有*号,也就是说不重复左侧的搜索条件,也就是[0-9] [a-z]那只能匹配字符串的第一个字符也只有这一个字符,因为有行首和行尾的限制,"^[0-9]$"第一个字符如果是数字就匹配,如果不是就过滤掉,如果字符串是 9 就匹配,如果是98或者9j之类的就不可以了。

13.
   "\<…\>"这个表达式的作用
    这个表示精确查找一个字符串,\<sss 表示字的开始位置,sss\>表示字的结束位置
    echo hello world computer|findstr "\<computer\>"这样的形式
    echo hello worldcomputer|findstr "\<computer\>" 这样的形式就不成了,他要找的是 "computer"这个字符串,所以不可以。
    echo hello worldcomputer|findstr ".*computer\>"这样就可以匹配了

14. "."表示任意字符.
    findstr /rc:" 01...... " test.txt>>a1.txt
    findstr /rc:" 02...... " test.txt>>a2.txt

15.
    查找英文状态下的句号"."
    在"."的前面加转义字符"\"

    set abc=abc de.f
    echo %abc%|findstr /c:"\."

16. 查找"\"

    set abc=abc E:\123 1111
    echo %abc%|findstr "E:\\"

17. /g用法
    将1.txt的每行作为搜索字符串,在2.txt中搜索.(如果1.txt的某行含有空格也视为有效字符,不解释为"或")
    findstr /g:1.txt 2.txt

    加上/b/e 就是行首行尾完全匹配
    findstr /b /e /g:1.t 2.t(或findstr /beg:1.t 2.t)

18. /o参数
    ((echo.%str%&echo.        )|findstr /o .)|findstr /c:"        "

范例:
findstr . test.txt
过滤空行打印
findstr .* test.txt
原样打印,这个不同与find /v "" 后者会给结果前加上 ---------- 目标文件全名
findstr . test.txt|findstr /v /r /c:"^ * $"
过滤空行,纯空格行打印
-------------
有一A.TXT文件,在其中找到JKLJHLL时,删除含有JKLJHLL字符串的行(不分大小写).
findstr /ivc:"JKLJHLL" a.txt >b.txt

[ 本帖最后由 Batcher 于 2009-3-18 20:27 编辑 ]
作者: Batcher    时间: 2009-3-18 20:00     标题: 【6】查看命令 echo type more sort

占位编辑

[ 本帖最后由 Batcher 于 2009-3-18 20:27 编辑 ]
作者: Batcher    时间: 2009-3-18 20:00     标题: 【7】访问命令 dir cd

先说dir(directory)
Displays a list of files and subdirectories in a directory.

DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]
  [/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]

  [drive:][path][filename]
              Specifies drive, directory, and/or files to list.

  /A          Displays files with specified attributes.
  attributes   D  Directories                R  Read-only files
               H  Hidden files               A  Files ready for archiving
               S  System files               -  Prefix meaning not
  /B          Uses bare format (no heading information or summary).
  /C          Display the thousand separator in file sizes.  This is the
              default.  Use /-C to disable display of separator.
  /D          Same as wide but files are list sorted by column.
  /L          Uses lowercase.
  /N          New long list format where filenames are on the far right.
  /O          List by files in sorted order.
  sortorder    N  By name (alphabetic)       S  By size (smallest first)
               E  By extension (alphabetic)  D  By date/time (oldest first)
               G  Group directories first    -  Prefix to reverse order
  /P          Pauses after each screenful of information.
  /Q          Display the owner of the file.
  /S          Displays files in specified directory and all subdirectories.
  /T          Controls which time field displayed or used for sorting
  timefield   C  Creation
              A  Last Access
              W  Last Written
  /W          Uses wide list format.
  /X          This displays the short names generated for non-8dot3 file
              names.  The format is that of /N with the short name inserted
              before the long name. If no short name is present, blanks are
              displayed in its place.
  /4          Displays four-digit years

Switches may be preset in the DIRCMD environment variable.  Override
preset switches by prefixing any switch with - (hyphen)--for example, /-W.其中/a,/o,/t还各自有参数(只能选其一),
/a attribute(属性)
共5个参数:d(directorys),r(read-only),h(hidden),a(archiving),s(system)及否定开关"-"
/o order(顺序)
共5个参数:n(name), s(size), e(extension), d(date), g(group directorys)及一个"反序"开关"-"
    /o:n
     名称优先级(高者在前)一般为:空格!()-,._`+12...9aAbB...zZ 汉字转换为拼音首字母ab...z
    /os
     文件字节数:小者优先
    /oe
     扩展名优先级:空(无扩展名) 字符 数字  字母 汉字 的顺序
    /od
     时间先着优先
    /og
     优先级待定
    /tc
     创建日期
    /ta
     访问日期
    /tw
     写入日期

/t time(时间)
共3个参数:c(creation) a(last access) w(written)
另外:
dir |dir .|dir .\      /* 当前路径,文件,目录
dir ..|dir ..\          /* 上一路径下,...
dir \                    /* 根目录下...

-----------------------------------------------------
cd ..               进入上级目录
cd\                 进入根目录
cd                  显示当前目录

[ 本帖最后由 Batcher 于 2009-3-18 20:27 编辑 ]
作者: Batcher    时间: 2009-3-18 20:00

【8】comp与fc
【9】文件操作 命令 copy xcopy md move del rd attrib ren replace
【10】cmd与command
【11】权限cacls与计划at 详解.
【12】
【13】特殊字符<>/\%!&^|以及*.?,;
【14】prompt 与 debug
【15】其他内置命令

[ 本帖最后由 Batcher 于 2009-3-18 20:31 编辑 ]
作者: Batcher    时间: 2009-3-18 20:00

  1. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2. ::作者:{plp626@cn-dos.net|08-4-25|1.0}
  3. ::效率:?次/s  {xp 5.1/单核2.4G/256M}
  4. ::算法简述:先将两个时间点ab:cd:ef.gh 转换为跑秒,相减后再将差值(跑秒)转换为ab:cd:ef.gh的格式。
  5. ::参数个数:3
  6. ::格式说明:call:Timediff [%t1%] [%t2%] [par|0]
  7. ::          变量t1,t2必须是系统环境变量%time%的某个值。
  8. ::          时间t2必须在时间t1之后,第三个参数若为0,将直接显示时间差。
  9. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  10. ::/* -----------------Timediff ----------------------
  11. ::最好能给出参数是否符合要求的判定代码,(虽然这个在使用时可能会被省去)
  12. ::但这个代码应该非常高效,用findstr的命令肯定不行
  13. for %%a in (+%1 +%2 +%3)do if "%%a"=="+" echo 参数缺失!&exit/b
  14. ::参数列表,[]、|、小写、大写字母、的含义同cmd里面的含义,我不多说。
  15. :Timediff [%t1%] [%t2%] [par|0]
  16. ::这个很必要,最起码要给个setlocal,保证参数只在本函数内有效。
  17. setlocal enabledelayedexpansion
  18. ::下面是函数体
  19. :timediff_1
  20. set P2=%~1&set "P2=!P2::=!"
  21. set/a P2=%P2:.=%-4000*(%P2:~,4%+60*%P2:~,2%)
  22. if not "%3"=="" set P1=!P2!&shift&goto:timediff_1
  23. if !P2! geq !P1! (set/a df=!P2!-!P1!) else set/a df=!P2!-!P1!+8640000
  24. set/a h=df/360000,m=df%%360000/6000,s=df%%6000/100,pt=df%%100
  25. if %pt% leq 9 set pt=0%pt%
  26. ::结束本函数内变量的作用域,同时将返回参数赋给变量,使它在函数外有效。
  27. endlocal&set %2=%h%:%m%:%s%.%pt%&goto:eof
  28. :: ------------------- Timediff --------------------- */
复制代码
  1. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2. ::输出彩色字符
  3. ::call:Colstr <attr> <sp> <"str"> <bk> <sp> <enter>  
  4. ::效率:      约18次/s  (XP 5.1/2.4GHz/256M)      
  5. ::例:
  6. ::call:colstr 0c 3 "abcdef" 1 2 2
  7. ::用0c色(鲜红色)依次输出3个空格 abcdef: [光标左移1位] 2个空格 2个回车
  8. ::出处:http://www.cn-dos.net/forum/viewthread.php?tid=38940
  9. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  10. @echo off
  11. ::Colstr函数演示。
  12. mode con lines=24 cols=69
  13. set s=I am from www.cn-dos.net
  14. echo\&echo\&echo\&echo\&echo\&echo\&echo/
  15. call:colstr e 15 "%s%" 0 1 0
  16. call:colstr 0100 0 0 17 0 0
  17. title 按任意键继续...&pause>nul
  18. call:colstr a 1 "中国 DOS 联盟" 0 1 0
  19. call:colstr c 0 "%s:~-15%" 0 1 9
  20. pause>nul
  21. call:colstr 2c 21 "谢谢测试!    有bug请吱一声" 0 1 9
  22. title Jvive QQ∶275928264
  23. pause>nul&exit/b
  24. rem /*--------- colstr 函数 -------------
  25. :Colstr <attr> <sp> <"str"> <bk> <sp> <enter>
  26. for %%a in (+%2 +%4 +%5 +%6) do (
  27.    if "%%a"=="+" echo 控制参数不能为空&exit/b
  28.    if %%a lss +0 echo 参数越界-&exit/b
  29.    if %%a geq +a echo 参数越界+&exit/b)
  30. if %3 == "" echo 字符串不能为空&exit/b
  31. pushd %tmp%&setlocal ENABLEEXTENSIONS
  32. del/a/q "%~3?">nul 2>nul
  33. if %2 gtr 0 call%0_bs %2 sp " "&call set/p=%%sp%%<nul
  34. if %4 gtr 0 (call%0_bs %4 bk "") else set "bk="
  35. call%0_bs %5 sp " "
  36. set/p=%bk%%sp%<nul>"%~3"&findstr /a:%1 .* "%~3?" 2>nul
  37. if not %6 equ 0 for /l %%a in (1 1 %6)do echo.
  38. endlocal&popd&goto:eof
  39. :Colstr_bs
  40. set "p="&for /l %%a in (1 1 %1)do call set "p=%%p%%%~3"
  41. set "%2=%p%"&goto:eof
  42. rem ------------------------------------*/
复制代码
一句话隐藏:
code 1:
  1. @if %1* neq 0* mshta vbscript:createobject("wscript.shell").run("%~s0 0",0)(window.close)&exit
复制代码
code 2:
  1. @if %1* neq 0* (goto c) else mshta vbscript:createobject("wscript.shell").run("%~s0 0",0)(window.close)&exit
复制代码
code 3这个最短,嘿嘿,my code)
  1. @if exist .vbs (del .vbs) else echo createobject("wscript.shell").run "%~s0",0 >.vbs&.vbs&exit
复制代码
隐藏调用:
  1. @echo off
  2. if not %1.==. call%*
  3. pause
  4. goto:hid
  5. :code
  6. set set1=ping -n 2 127.1 1^>nul 2^>nul
  7. for /l %%i in (1 1 5) do md test-%%i&%set1%
  8. for /l %%i in (5 -1 1) do rd test-%%i&%set1%
  9. msg %username% /v /w "~~~~~测试完毕,点确定退出cmd~~~~"
  10. exit
  11. rem --------subprocess----------
  12. :hid
  13. if not %1.==. (goto:code) else mshta vbscript:createobject("wscript.shell").run("%~s0 :hid 0",0)(window.close)
复制代码
不知道还有多少热情,快了...呵呵
半年了,学到了些东西,趁着现在还有热度,把这些自己认为的好方法与大家共享,算是给大家的回报。遗憾的是从头到尾还只会bat。

call的一些用法
  1. @echo off
  2. ::这个是一维数组的,大家可以扩展为2维,的定义。
  3. call:arr arr + d d+ 258 68 944 ddd pp dd plp df
  4. for /l %%a in (0 1 10) do set arr%%a
  5. pause
  6. :arr
  7. set/a n+=1
  8. if %2.==. goto:eof
  9. set %1%n%=%2
  10. shift /2
  11. goto:arr
复制代码
  1. @echo off
  2. ::将输入的字符串作为变量然后赋值。这个用处可大了
  3. set/p var=[输入个字符串]
  4. call:x %var% plp626
  5. for /f %%a in ("%var%")do call echo %%%%a%%
  6. pause
  7. :x
  8. set %1=%2
复制代码
for 的集合里,还支持复合语句:
  1. for /f %%a in ('if exist 1.txt ^(echo ++^) else echo -- ')do echo %%a
复制代码
大家不妨将if换成for在发现发现。

有关start的用法
  1. @echo off&if not %1.==. goto%*&exit/b
  2. ::将子过程作为for的集合的分析对象。(这个还可以再递归,)可以最大限度减少产生临时文件
  3. for /f "delims=" %%a in ('%~s0 :a 1 2 3')do echo %%a
  4. pause
  5. for /f "delims=" %%a in ('%~s0 :b')do echo %%a
  6. pause
  7. ::多进程
  8. start/b %~s0 :a + - * /
  9. pause&exit
  10. :a
  11. echo %*
  12. exit/b
  13. :b
  14. echo ---b
  15. exit/b
复制代码
这个 第一行语句“if not %1.==. call%*&exit”我在许多代码经常用,位置已经固化了。它使代码可读性增强许多,同时也简洁了许多。

vbs知道一点点,下面这个代码包含的混合编程的思想,和批处理技巧不可小觑:
  1. @echo off&if not %1.==. call%*&exit
  2. ::隐藏"调用" 原帖请搜索借尸还魂(请不要用这个来干坏事)
  3. pause
  4. goto:hid
  5. :code
  6. set set1=ping -n 2 127.1 1^>nul 2^>nul
  7. for /l %%i in (1 1 5) do md test-%%i&%set1%
  8. for /l %%i in (5 -1 1) do rd test-%%i&%set1%
  9. msg %username% /v /w "~~~~~测试完毕,点确定退出cmd~~~~"
  10. exit
  11. :: /*-------- hideme ----------
  12. :hid
  13. if not %1.==. (goto:code) else mshta vbscript:createobject("wscript.shell").run("%~s0 :hid 0",0)(window.close)&exit
  14. :: -------- hideme ----------*/
复制代码
多进程的:(这两个代码我也不知能说明什么)
  1. @echo off&if not %1.==. call%*&exit||by plp626@cn-dos.net
  2. for /l %%a in (0 1 9) do start/b %~s0 :%%a
  3. exit
  4. :0
  5. :1
  6. :2
  7. :3
  8. :4
  9. :5
  10. :6
  11. :7
  12. :8
  13. :9
  14. echo 进程%0开始于%time%
  15. title 右键暂停,左键继续,注意看时间先后顺序
  16. for /l %%a in (1 1 1000)do echo 我是进程%0 当前时间:%time%
  17. goto:eof
复制代码
  1. @echo off&if not %1.==. call%*&exit||by plp626@cn-dos.net
  2. for /l %%a in (0 1 9) do start/b %~s0 :%%a
  3. exit
  4. :0
  5. :1
  6. :2
  7. :3
  8. :4
  9. :5
  10. :6
  11. :7
  12. :8
  13. :9
  14. echo 进程%0开始于%time%
  15. title 右键暂停,左键继续,注意看时间先后顺序
  16. for /l %%a in (1 1 1000)do echo 我是进程%0 当前时间:%time%>%tmp%\txt
  17. goto:eof
复制代码
如果你的机子是10核的:
  1. @echo off
  2. ::六为纯数字,需要外部工具unrar.exe
  3. set file=6位破解
  4. if not "%1"=="" call%*&exit
  5. for /l %%a in (0 1 9) do start/b %~s0 :%%a
  6. exit
  7. :0
  8. :1
  9. :2
  10. :3
  11. :4
  12. :5
  13. :6
  14. :7
  15. :8
  16. :9
  17. echo 进程%0 开始时间:%time%
  18. for /l %%a in (0 1 9)do if "%0"==":%%a" set p=%%a
  19. for /l %%a in (0 1 9)do for /l %%b in (0 1 9)do for /l %%c in (0 1 9)do for /l %%d in (0 1 9)do for /l %%e in (0 1
  20. 9)do call:key %%a %%b %%c %%d %%e %0
  21. echo 进程%0 结束时间:%time%
  22. goto:eof
  23. :key
  24. title 进程%6 正在试探:%p%%1%2%3%4%5  当前时间:%time%
  25. unrar t -p%p%%1%2%3%4%5 "%file%.rar">nul 2>nul &&(
  26.     echo %p%%1%2%3%4%5 >key.txt
  27.     msg %username% /v "密码为%p%%1%2%3%4%5"
  28.     tskill /a cmd
  29.    
  30. )
  31. goto:eof
复制代码
多进程之间通信
现在用临时文件的方法还算可靠,修改系统环境变量的方法比如date我还没试,
另外,用exit/b?(?为0-9数字)然后用errorlevel来确定那个子过程退出的方法在简单情况下可以起这个作用。

一个进程"pause"(实际上它还是处于执行态只是执行pause命令暂停罢了),另一个进程处于执行状态,若当这个进程变为也pause时,不管这个进程的优先级有多高,按键相应第一个执行pause的进程,
  1. @echo off&if not "%1"=="" call%*&exit
  2. ::纯批实现等待指定输入
  3. :begin
  4. call:timeout 5 :tsk1 626 :tsk2
  5. :tsk1
  6. echo\&echo "默认计划"
  7. echo\&echo 按回车键退出
  8. exit
  9. :tsk2
  10. echo "自定义计划"
  11. pause
  12. exit
  13. :: /*----------------- timeout --------------------
  14. :timeout [num] [:label1] [STR] [:LABEL2]
  15. setlocal&del/a/q %tmp%\' 2>nul||(echo 未知错误!&pause&exit)
  16. start/b/REALTIME %~s0 :timeout_1 %1 %2 %3 %4
  17. :timeout_2
  18. set "v="
  19. set/p v=
  20. if %v%.==%3. title %ComSpec%&cd.>%tmp%\'&endlocal&goto%4
  21. if exist %tmp%\' exit ::没有输入,退出timeout
  22. goto:timeout_2
  23. :timeout_1 [num] [:label1] [STR] [:LABEL2]
  24. for /l %%a in (%1 -1 0)do (
  25.    title 倒计时:%%a /输入:%3 跳过默认计划 %2/
  26.    if exist %tmp%\' title %ComSpec%&exit
  27.    ping/n 2 127.1 >nul)
  28. title %ComSpec%&cd.>%tmp%\'&goto%2
  29. :: --------------------- timeout -------------------*/
复制代码
关于call的用法很多,主要是参数,得把setlocal掌握好,大家有空多关注下面两个帖子。

【共同参与】"批处理函数库"
http://www.cn-dos.net/forum/viewthread.php?tid=38969&fpage=1  
【共享】常用子过程、函数收集【专用帖】
http://www.cn-dos.net/forum/viewthread.php?tid=39777&fpage=2
多与别人分享,受益匪浅

[ 本帖最后由 Batcher 于 2009-3-18 20:35 编辑 ]
作者: Batcher    时间: 2009-3-18 20:00     标题: 变量延迟与命令扩展

  1. @echo off
  2. ::显示源代码
  3. more %0&pause
  4. for /l %%a in (1 1 4) do set t=%time% & echo %random% /%t%/
  5. echo -----------&pause>nul
  6. setlocal enabledelayedexpansion
  7. for /l %%a in (1 1 4) do set t=%time% & echo !random! /!t!/
  8. endlocal
  9. echo -----------&pause>nul
  10. for /l %%a in (1 1 4) do set t2=%time% & call echo %%random%% /%t2%/ \%%t2%%\
  11. echo -----------&pause>nul
复制代码
请按任意键继续. . .
23520 //
23520 //
23520 //
23520 //
-----------
25655 / 3:22:09.42 /
23230 / 3:22:09.42 /
29496 / 3:22:09.42 /
30091 / 3:22:09.42 /
-----------
2940 // \ 3:22:16.28 \
12893 // \ 3:22:16.28 \
1357 // \ 3:22:16.28 \
28853 // \ 3:22:16.28 \
-----------
  1. set n=1
  2. set/a n+=1&call echo %%n%%&pause
复制代码
2
按任意键继续......

[ 本帖最后由 Batcher 于 2009-3-18 20:37 编辑 ]
作者: Batcher    时间: 2009-3-18 20:01     标题: 常用子过程、函数收集

如题,本帖主要对批处理脚本中频繁要用到的子过程或函数进行收集

欢迎大家把自己感觉很实用的小函数或这子过程发来与大家分享,请参照后面的四个尽量发来,也许有更好的算法可以改进,你也必定会受益匪浅, 当然好的东西大家还会加分。

为了保证大家浏览方便,严禁灌水,请不要在此发表与本帖无关的话题,违者斩!

你若不支持请减分,支持请加分。后续我会不断充实“函数库”的。

大家可以在下面的帖子讨论,交流意见:

http://www.cn-dos.net/forum/viewthread.php?tid=38969&fpage=1   "批处理函数库"

以前我曾发过这个”【共同参与】批处理函数库“的讨论的帖子,效果不是很好,虽然论坛里有不少会员并不暂成这样的做法

,但毫无疑问,”代码重用“可以减少我们编写代码所花费的时间,提高工作效率,虽然这些子过程不能完全扮演高级语言的函数

的角色,但它确实给大家提供了方法或者思想,大家可酌情修改少量部分代码---”为我所用“,有的甚至可以直接照搬过去。

为了这些子过程或类函数真正能起到这些作用,我不得不做些要求,

函数要尽量通用、高效、封装、简洁。
通用---大部分人都用得上,且常用到,几乎不需要修改或者直接照搬就可以直接使用。

高效---调用一次函数所花费的时间尽量少。
封装---函数一旦给点不必去管它如何实现,它只起到一个批文件的作用,

简洁---代码简短,结构紧凑。

先举个例子来说明这点:
拿jvive的Timediff函数为例
原帖:http://www.cn-dos.net/forum/viewthread.php?tid=39775&fpage=1
  1. @echo off
  2. set TA=%time%&echo %time%--A
  3. pause::这里一般插入自己的代码段。
  4. set TB=%time%&echo %time%--B
  5. call:Timediff %TA% %TB% TAB
  6. echo 时间点A到时间点B的时间差为:%TAB%秒
  7. pause>nul&exit/b
  8. ::/* -----------------Timediff ----------------------
  9. :Timediff [time1] [time2|par] [par]
  10. setlocal enabledelayedexpansion
  11. :timediff_1
  12. set P2=%~1&set "P2=!P2::=!"
  13. set/a P2=%P2:.=%-4000*(%P2:~,4%+60*%P2:~,2%)
  14. if not "%3"=="" set P1=!P2!&shift&goto:timediff_1
  15. if !P2! geq !P1! (set/a df=!P2!-!P1!) else set/a df=!P2!-!P1!+8640000
  16. set/a h=df/360000,m=df%%360000/6000,s=df%%6000/100,pt=df%%100
  17. if %pt% leq 9 set pt=0%pt%
  18. endlocal&set %2=%h%:%m%:%s%.%pt%&goto:eof
  19. :: -------------------Timediff --------------------- */
复制代码
下面分析Timediff
通用:用它可以测试自己编写的代码的执行时间,从而可以判断自己的代码是否高效。
高效:这个函数不可能频繁地使用,所以它不存在这方面的问题。
      即使频繁被调用它的效率也非常高,因为它总共只用到了12次set赋值语句,两个逻辑判断。
封装:函数中用到的变量只在函数内有效。它也可以当一个批处理文件来使用。
简洁:够简洁了。

最后,函数共享时能尽量详细:我仍然已Timediff做为例子:

详解:
  1. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2. ::功能:显示两个时间点的差,精确到0.01秒
  3. ::作者:{jvive@cn-dos.net|08-4-25|1.0}
  4. ::效率:208次/s  {xp 5.1/单核2.4G/256M}
  5. ::算法简述:先将两个时间点ab:cd:ef.gh 转换为跑秒,相减后再将差值(跑秒)转换为ab:cd:ef.gh的格式。
  6. ::参数个数:3
  7. ::格式说明:call:Timediff [%t1%] [%t2%] [par|0]
  8. ::          变量t1,t2必须是系统环境变量%time%的某个值。
  9. ::          时间t2必须在时间t1之后,第三个参数若为0,将直接显示时间差。
  10. ::出处:http://www.cn-dos.net/forum/viewthread.php?tid=39775&fpage=1
  11. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
复制代码
原型:
  1. ::/* -----------------Timediff ----------------------
  2. ::最好能给出参数是否符合要求的判定代码,(虽然这个在使用时可能会被省去)
  3. ::但这个代码应该非常高效,用findstr的命令肯定不行
  4. for %%a in (+%1 +%2 +%3)do if "%%a"=="+" echo 参数缺失!&exit/b
  5. ::参数列表,[]、|、小写、大写字母、的含义同cmd里面的含义,我不多说。
  6. :Timediff [%t1%] [%t2%] [par|0]
  7. ::这个很必要,最起码要给个setlocal,保证参数只在本函数内有效。
  8. setlocal enabledelayedexpansion
  9. ::下面是函数体
  10. :timediff_1
  11. set P2=%~1&set "P2=!P2::=!"
  12. set/a P2=%P2:.=%-4000*(%P2:~,4%+60*%P2:~,2%)
  13. if not "%3"=="" set P1=!P2!&shift&goto:timediff_1
  14. if !P2! geq !P1! (set/a df=!P2!-!P1!) else set/a df=!P2!-!P1!+8640000
  15. set/a h=df/360000,m=df%%360000/6000,s=df%%6000/100,pt=df%%100
  16. if %pt% leq 9 set pt=0%pt%
  17. ::结束本函数内变量的作用域,同时将返回参数赋给变量,使它在函数外有效。
  18. endlocal&if %2.==0. (echo\%h%:%m%:%s%.%pt%) else set %2=%h%:%m%:%s%.%pt%&goto:eof
  19. :: ------------------- Timediff --------------------- */
复制代码

[ 本帖最后由 Batcher 于 2009-3-18 20:40 编辑 ]
作者: Batcher    时间: 2009-3-18 20:01     标题: Colstr 单行彩色字符控制输出

函数详解:
  1. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2. ::输出彩色字符{code by jvive@cn-dos.net|2008-4-9}
  3. ::call:Colstr <attr> <sp> <"str"> <bk> <sp> <enter>  
  4. ::               |     |     |      |    |     |
  5. ::             颜色   空格  字符串   退格  空格 回车换行
  6. ::效率:      约18次/s  (XP 5.1/2.4GHz/256M)  
  7. ::算法简述:findstr /a .... (提供了好几万种颜色)
  8. ::     set/p=<nul>输出不换行退格字符,"<nul"实现单行彩色. 退格字符”删“冒号.
  9. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  10. ::说明:
  11. ::   attr   16进位数字颜色属性。请参考16进位数字颜色属性配置演示代码。
  12. ::   sp     范围:{0,正整数} 表示输出空格的格数
  13. ::  "str"   要显示的字符串。注意当字符串中含有空格时带上双引号。
  14. ::   bk     范围:{正整数} 退格数,即光标左移位数,若设定左移位数为0,函数将强制转换为1
  15. ::   sp     范围:{0,正整数} 0将输出1个冒号,其他正整数表示空格数
  16. ::   enter  范围:{0,正整数} 0表示不换行(光标不动),其他正整数表示<enter>个数
  17. ::   字符串中可以包含除/\:*?,<>|"字符外的任何字符,但不可以全是“空格”或“.”等。
  18. ::   判断字符串是否合法的一个有效的办法是看它是否可以作为文件名来使用
  19. ::   请勿试图尝试不合法的参数,函数只保证合法的参数有正确的效果。
  20. ::   另外,对某些特殊要求可以尝试用0100色(黑色)字符来“隐藏”冒号
  21. ::例:
  22. ::call:colstr 0c 3 "abcdef" 1 2 2
  23. ::用0c色(鲜红色)依次输出3个空格 abcdef: [光标左移1位] 2个空格 2个回车换行符。
  24. ::出处:http://www.cn-dos.net/forum/viewthread.php?tid=38940
  25. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
复制代码
原型:
  1. :: /*-------------- Colstr -----------------
  2. :Colstr <attr> <sp> <"str"> <bk> <sp> <enter>
  3. for %%a in (+%2 +%4 +%5 +%6) do (
  4.    if "%%a"=="+" echo 控制参数不能为空&exit/b
  5.    if %%a lss +0 echo 参数越界-&exit/b
  6.    if %%a geq +a echo 参数越界+&exit/b)
  7. if %3 == "" echo 字符串不能为空&exit/b
  8. pushd %tmp%&setlocal ENABLEEXTENSIONS
  9. if exist "%~3?" del/a/q "%~3?">nul 2>nul
  10. if %2 gtr 0 call:%0_bs %2 sp " "&call set/p=%%sp%%<nul
  11. if %4 gtr 0 (call:%0_bs %4 bk "") else set "bk="
  12. call:%0_bs %5 sp " "
  13. set/p=%bk%%sp%<nul>"%~3"&findstr /a:%1 .* "%~3?" 2>nul
  14. if not %6 equ 0 for /l %%a in (1 1 %6)do echo.
  15. endlocal&popd&goto:eof
  16. :Colstr_bs
  17. set "p="&for /l %%a in (1 1 %1)do call set "p=%%p%%%~3"
  18. set "%2=%p%"&goto:eof
  19. :: --------------- Colstr ----------------*/
复制代码
使用举例:(如果是将函数做为P文件使用,将call后面的:改为空格即可)
  1. @echo off
  2. ::Colstr函数演示。
  3. mode con lines=24 cols=69
  4. set s=I am from www.cn-dos.net
  5. echo\&echo\&echo\&echo\&echo\&echo\&echo/
  6. call:colstr e 15 "%s%" 0 1 0
  7. call:colstr 0100 0 0 17 0 0
  8. title 按任意键继续...&pause>nul
  9. call:colstr a 1 "中国 DOS 联盟" 0 1 0
  10. call:colstr c 0 "%s:~-15%" 0 1 9
  11. pause>nul
  12. call:colstr 2c 21 "谢谢测试!    有bug请吱一声" 0 1 9
  13. title Jvive QQ∶275928264
  14. pause>nul&exit/b
复制代码

[ 本帖最后由 Batcher 于 2009-3-18 20:42 编辑 ]
作者: Batcher    时间: 2009-3-18 20:01

ANY2VBS
  1. TargetFileName="*.*"
  2. MD5=...
  3. HexString=...
  4. Set oStream = CreateObject("Adodb.Stream")
  5. Hex2Bin HexString,TargetFileName
  6. Sub Hex2Bin(strHex,strFileName)
  7. Set objStream = Createobject("Adodb.Stream")
  8. Set objXML = Createobject("Microsoft.XMLDOM")
  9. Set objElement = objXML.CreateElement("oTmpElement")
  10. objElement.DataType = "bin.hex"
  11. objElement.NodeTypedValue = strHex
  12. With objStream
  13. .Type = 1
  14. .Mode = 3
  15. .Open
  16. .Write objElement.NodeTypedValue
  17. .SaveToFile strFileName
  18. End With
  19. End Sub
复制代码
目前最全的Regsvr32命令集锦,可解决不少问题
  1. 1/出现“lscw.exe应用程序(Procedures)(Procedures)错误”
  2. 解决途经:在“开始→运行”中键入“regsvr32 C:\GENERSOFT\LSCW\gif89.dll”(当中C:\GENERSOFT\LSCW为安装路径,请参照您的安装路径进行更改),然后单击“确定”,重新启动操作系统就可以了.
  3. II.IE不能打开新的窗口,用鼠标单击超链接也没有任何反应.
  4. 解决途经:在“开始→运行”中键入“regsvr32 actxprxy.dll”系统命令,单击“确定”按钮.然后再在“开始→运行”中键入“regsvr32 shdocvw.dll”系统命令,单击“确定”就可以了.
  5. III.全部修复IE浏览器(解决网页显示不完整,JAVA效果(Effect)不出现,网页不自动跳转,打开某一些网站时总提示‘根本没有办法显示该页’等)
  6. 在“开始→运行”中依次键入以下系统命令并“确定”执行
  7. regsvr32 Shdocvw.dll  
  8. regsvr32 Oleaut3II.dll  
  9. regsvr32 Actxprxy.dll  
  10. regsvr32 Mshtml.dll  
  11. regsvr32 Urlmon.dll
  12. regsvr32 browseui.dll
  13. IV.解决Windows根本没有办法在线升级的基本问题
  14. 在“开始→运行”中键入“regsvr32 wupdinfo.dll”,单击“确定”按钮.重新启动操作系统后解决问题.
  15. V.防范网络脚本病毒的新招(禁用FSO对像)
  16. 在“开始→运行”中键入“regsvr32 /u scrrun.dll” 单击“确定”按钮;如果需要恢复使用FSO对像,键入“regsvr32 scrrun.dll”系统命令就可以了.
  17. VI.卸载Win XP自带的ZIP功能,以减少操作操作系统资源消耗
  18. 在“开始→运行”中键入“regsvr32 /u zipfldr.dll”,单击“确定”按钮;要恢复ZIP功能,键入“regsvr32 zipfldr.dll”就可以了.
  19. VII.让Windows Media Player支持RM格式
  20. 以Win XP为例,最开始下载一个RM格式插件,解压缩后得到两个文件夹:Release(用于Windows 9x)和Release Unicode (用于Windows 2000/XP);将Release Unicode文件夹下的RealMediaSplitter.ax文件拷贝到“C:\WINDOWS\System32\”目录下;在“开始→运行”中键入“regsvr32 RealMediaSplitter.ax”,单击“确定”就可以了.接着下载解码器,如Real Alternative,安装后就可以用WMP播放RM格式的影音文件了.
  21. 8,修复根本没有办法缩略图查看文件问题
  22. 2000:开始→运行,输入regsvr32 thumbvw.dll
  23. XP:开始→运行,输入regsvr32 shimgvw.dll;禁用缩略图查看文件,则输入regsvr32   /u shimgvw.dll
  24. 9,解决打开操作操作系统功能时无反应(有时从开始菜单里单击XP操作操作系统“搜索”,“帮助和支持”或“管理工具”等,但就是根本就没有任何反应)
  25. 开始→运行,输入regsvr32 shdocvw.dll
  26. 10,添加/彻底删除程序(Procedures)(Procedures)打不开(打开“控制面板”中的“添加/彻底删除程序(Procedures)(Procedures)”,双击他的图标后无反应,或者打开后自动关闭)
  27. 开始→运行,依次输入regsvr32 appwiz.cpl  
  28. regsvr32 mshtml.dll  
  29. regsvr32 j.dll  
  30. regsvr32 msi.dll  
  31. regsvr32 "c:\Program Files\Common Files\System\Ole DB\Oledb3II.dll"
  32. regsvr32 "c:\Program Files\Common Files\System\Ado\Msado1V.dll"
  33. regsvr32 mshtmled.dll  
  34. regsvr32 /i shdocvw.dll
  35. regsvr32 /i shell3II.dll
  36. 11,浏览器不支持脚本或是Windows Media Player打开时提示“出现内部应用程序(Procedures)(Procedures)错误”等问题.当然了,下面的系统命令还有一些意想不到的作用,譬如WIN 2000下“添加/彻底删除程序(Procedures)(Procedures)”打开后一片空白等.
  37. 开始→运行,依次输入regsvr32 j.dll,regsvr32 vb.dll
  38. 1II.根本没有办法从右键菜单启动操作系统网际快车或迅雷
  39. 网际快车:注册fgiebar.dll和Jccatch.dll动态连接库,
  40. 迅雷:注册WebBrowserEx.dll和WebBrowserEx.dll以及boost_thread-vc6-mt-1_3I.dll
  41. 注册方法:
  42. 从程序(Procedures)(Procedures)文件中把以上所需dll文件拷贝到Windows安装路径的system32/目录下,然后在“开始-运行”中输入“regsvr32 刚刚拷贝的.dll文件”就可以了.
  43. 1III.恢复“电脑的桌面显示”(我们会不小心把快速启动操作系统栏中的“显示电脑的桌面”的图标彻底删除)
  44. 开始→运行,输入regsvr32 /n /i:u shell32
  45. 1IV.XP的控制面板中的“用户帐户”选项根本没有办法打开
  46. 开始→运行,依次输入regsvr32 nusrmgr.cpl
  47. regsvr32 mshtml.dll
  48. regsvr32 jscript.dll
  49. regsvr32 /i shdocvw.dll
  50. 1V.Intel集成显卡的电脑的桌面右键菜单迟缓的基本问题
  51. 开始→运行,输入regsvr32 /u igfxpph.dll
  52. 1VI.关闭AVI等影片的预览功能(有的朋友预览时会弹出explorer出错,可以用这一个方法)
  53. 开始→运行,输入regsvr32 /u shmedia.dll
  54. 1VII.禁止Windows scripting host(爱虫病毒就是靠他来发作的)
  55. 开始→运行,依次输入regsvr32/u wshom.ocx
  56. regsvr32/u wshext.dll
  57. 18,解决计算机内存不能为read等问题,一次注册所有dll文件操作操作系统文件
  58. 操作操作系统dll文件没有注册,可能引起各种各样各样不可知的基本问题,譬如根本没有办法打开二级链接,经常出现“计算机内存不能为read或written”等错误.如何一下把所有的dll文件重新注册一遍呢?
  59. 运行中输入cmd,在系统命令提示符下输入:
  60. for %1 in (%windir%\system32\*.dll) do regsvr3II.exe /s %1
  61. 19,拯救失落的“搜索”
  62. 开始→运行,输入“regsvr32 urlmon.dll”,回车后,重新运行搜索窗口,就可以了恢复.
  63. 20,纠正IE保存mht网页错误
  64. 单击Internet Explorer“文件→另存为”系统命令菜单,在“保存类型”中选择(Choose)“Web电子邮件档案(.mht)”格式后保存文件错误.
  65. 开始→运行,输入“regsvr32 inetcomm.dll”,回车就可以了解决.
  66. 如果在使用 OE时提示“根本没有办法启动操作系统Outlook Express;电脑计算机内存不足或磁盘已满,请与Microsoft支持部门联系以获取更多的帮助 (0x8007000E,14000)”,单击“确定”后又弹出“MSOE.dll根本没有办法初始化,Outlook Express根本没有办法启动操作系统等也可通过这一个方法解决.
  67. 21,在使用Windows Update更新操作时,提示“IEXPLORE错误”,根本没有办法继续更新操作
  68. 最开始在运行输入框中输入“regsvr32 /u wuv3is.dll”反注册此链接库,接着进入“C:\Program Files\Windows Update”,彻底删除wuv3is.dll文件.最后重新执行Windows Update操作,操作操作系统会重新生成wuv3is.dll文件,错误提示也不怎么会再弹出.
  69. 2II.Microsoft Windows media player 10损坏了,每次启动操作系统都提示“出现了内部应用程序(Procedures)(Procedures)错误”
  70. 开始→运行,输入regsvr32 jscript.dll修复Java动态链接库
  71. 再输入regsvr32 vbscript.dll修复VB动态链接库
  72. 2III.MSN根本没有办法登录(Logon)(不一定有效)
  73. 开始→运行,输入regsvr32 softpub.dll
  74. 2IV.取消inter显卡电脑的桌面右键菜单
  75. 开始→运行,输入“regsvr32 /u igfxpph.dll” ;如果想恢复就输入“regsvr32 igfxpph.dll”
  76. 2V.不能阅读HTML帮助文件的解决
  77. 开始→运行,输入regsvr32 c:\Microsoft Windows\system32\hhctrl.ocx
  78. 2VI.恢复Windows默认的文件关联
  79. 开始→运行,依次输入
  80. rundl32l setup.dll,InstallHinfSection DefaultInstall 132 c:\Microsoft Windows\inf\shell.inf
  81. regsvr3II.exe /i shdocvw.dll
  82. regsvr32 /i shell3II.dll
  83. regsvr3II.exe /i shdoc40I.dll
  84. 2VII.彻底彻底删除"我的文档"
  85. 开始→运行,输入regsvr32 /u mydocs.dll;想要恢复输入regsvr32 mydocs.dll
  86. 28,彻底删除Live Messenger共享(Sharing)文件夹
  87. 开始→运行,输入regsvr32 /u "C:\Program Files\MSN Messenger\fsshext.dll";想要恢复输入regsvr32 "C:\Program Files\MSN Messenger\fsshext.dll"
  88. 29,彻底删除多媒体文件右键(排队,添加到播放列表,复制到CD或设备...)
  89. 开始→运行,输入regsvr32 /u wmpshell.dll;想要恢复输入regsvr32 wmpshell.dll -------
复制代码
防止cmd被杀
  1. ren cmd.exe cnd.exe
  2. 运行bat文件方法:
  3. cnd/c my.bat
  4. 法二:
  5. ftype/?
  6. assoc/?
  7. cnd="C:\mytool\notepad2.exe" %1 %*
  8. assoc .bat=cnd
复制代码
----006 真正的全屏打开网页
start "" "%systemdrive%\program files\internet explorer\iexplore.exe" -k "www.baidu.com

----007 进入一些特别的路径
我的电脑
       start ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}
网络邻居
       start ::{208D2C60-3AEA-1069-A2D7-08002B30309D}
我的文档
       start ::{450D8FBA-AD25-11D0-98A8-0800361B1103}
回收站
       start ::{645FF040-5081-101B-9F08-00AA002F954E}

----008 禁用/解禁任务管理器
禁用:
    reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\system /v DisableTaskMgr /t REG_DWORD /d 00000001
解禁:
    reg delete HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\system /v DisableTaskMgr /f

----009 弹出光驱
mshta "javascript:new ActiveXObject('WMPlayer.OCX').cdromCollection.Item(0).Eject();window.close();"

----010 右键添加 "新建 zjw.bat" (不需重启)
reg add HKCR\.bat\ShellNew /v nullfile /f >nul
reg add HKCR\batfile /ve /d zjw /f >nul

----011 右键添加打开MS-DOS (不需重启)
reg add "HKCR\*\shell\ms-dos" /ve /d ms-dos /f
reg add "HKCR\*\shell\ms-dos\command" /ve /d "cmd.exe /k cd %%1" /f
reg add "HKCR\Folder\shell\ms-dos" /ve /d ms-dos /f
reg add "HKCR\Folder\shell\ms-dos\command" /ve /d "cmd.exe /k cd %%1" /f

----012 显示/隐藏扩展名
显示:
    reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v HideFileExt /t reg_dword /d 00000000 /f
隐藏:
    reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v HideFileExt /t reg_dword /d 00000001 /f

----013 显示/隐藏 文件
显示:
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v Hidden /t reg_dword /d 1 /f
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v HideFileExt /t reg_dword /d 0 /f
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v ShowSuperHidden /t reg_dword /d 1 /f
                      ***第一句是显示一般隐藏文件,后两句加上就是显示系统隐藏文件
隐藏:将键值改“非“就可以了
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v Hidden /t reg_dword /d 0 /f
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v HideFileExt /t reg_dword /d 1 /f
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v ShowSuperHidden /t reg_dword /d 0 /f
                      ***刷新后就隐藏了

----014 用*.inf 实现重启
echo [version] > reboot.inf
echo signature=$chicago$ >> reboot.inf
echo [defaultinstall] >> reboot.inf
rundll32 setupapi,InstallHinfSection DefaultInstall 1 reboot.inf
del reboot.inf

standard cout of string or number
  1. @echo off||author:plp626&setlocal enabledelayedexpansion
  2. for /l %%a in (1 1 50)do (
  3. set/a n=%%a%%5
  4. if !n!==0 echo.
  5. call:CoutSN "ss!random!" 8 r
  6. )
  7. pause
  8. exit
  9. :CoutSN ["str"] [num] [L|R] <\n> <return>
  10. setlocal enabledelayedexpansion
  11. set str=%~1& set num=%2& set LR=%3& set "sp="
  12. for /l %%a in (1 1 %num%)do set "sp= !sp!"
  13. :CoutSNLoop
  14. set str=%str:~1%& set "sp=%sp:~1%"
  15. if defined str goto:CoutSNLoop
  16. if /i %LR%.==R. (set str=%sp%%~1) else (set str=%~1%sp%)
  17. if %4.==\n (echo %str%) else (set/p %5=%str%<nul)
  18. exit/b 0
复制代码
CMD下修改IP地址和网关
  1. 修改网关的命令如下:
  2. cmd /c netsh interface ip set address name=" 本地连接" source=static addr=192.168.1.2 mask=255.255.255.0 gateway=192.168.1.1 gwmetric=1
  3. 修改DNS
  4. cmd /c netsh interface ip set dns name="本地连接" source=static addr=61.134.1.34
  5. 类似贴:
  6. DOS下修改IP
  7. C:\>ipconfig (首先用ipconfig这个命令看一下更改之前的ip地址)
  8. Windows 2000 IP Configuration
  9. Ethernet adapter 本地连接:
  10. Connection-specific DNS Suffix . :
  11. IP Address. . . . . . . . . . . . : 192.168.0.250 (本地连接更改之前的ip)
  12. Subnet Mask . . . . . . . . . . . : 255.255.255.0
  13. Default Gateway . . . . . . . . . : 192.168.0.1
  14. PPP adapter 拨号连接:
  15. Connection-specific DNS Suffix . :
  16. IP Address. . . . . . . . . . . . : 211.149.128.147
  17. Subnet Mask . . . . . . . . . . . : 255.255.255.255
  18. Default Gateway . . . . . . . . . : 211.149.128.147
  19. C:\>netsh (然后执行netsh这个命令)
  20. netsh>interface (netsh命令的子命令)
  21. interface>ip (interface命令的子命令)
  22. interface ip>set (interface ip命令的子命令)
  23. 下列指令有效:
  24. 此上下文中的命令:
  25. set address - 设置指定的接口的 IP 地址或默认网关。
  26. set dns - 设置 DNS 服务器模式和地址。
  27. set wins - 设置 WINS 服务器模式和地址。
  28. interface ip>set address "本地连接" static 192.168.0.2 255.255.255.0 192.168.0.1
复制代码
计算圆周率任意位
  1. @echo off&title 计算圆周率 by plp626@cn-dos.net
  2. setlocal enabledelayedexpansion
  3. if not %1.==. (set c=%1) else set c=100
  4. set/a c=(c*100/3)+70,cc=c/10,count=0
  5. for /l %%a in (1 1 %cc%)do set/a f_%%a=2000
  6. for /l %%a in (%c% -132 100)do (set/a n=%%a/10,m=2*n-1
  7. set/a "d=f_!n!*10000,f_!b!=d%%m,d=d/m,n-=1"
  8. for /l %%b in (!n! -1 1)do (set/a n=%%b,m=2*n-1
  9.    set/a "d=d*n+f_!n!*10000,f_!n!=d%%m,d=d/m,n-=1"
  10. )
  11. set/a "an=e+d/10000,e=d%%10000"
  12. if !an! lss 1000 set an=000!an!
  13. set/p=!an:~-4!<nul
  14. )
  15. echo\&echo/&set/p=数学爱好者加我QQ:275928264,验证号:plp626
复制代码
gougushu
  1. @echo off||Code By plp626
  2. if not %1.==. goto%*
  3. for /f "delims=" %%a in ('%~s0 :rtnum^|sort')do echo %%a
  4. pause
  5. :rtnum
  6. setlocal enabledelayedexpansion
  7. set MAX=20&set "s=        "
  8. for /l %%n in (1 1 %MAX%)do (set/a tp=%%n+1
  9. for /l %%m in (!tp! 2 %MAX%)do (call:ifprime %%m %%n prm
  10.     if !prm! equ 1 (
  11.       set/a mm=%%m*%%m,nn=%%n*%%n,a=mm-nn,b=2*%%m*%%n,c=mm+nn
  12.         set a=%s%!a!&set b=%s%!b!&set c=%s%!c!
  13.         if !a! lss !b! (echo !a:~-7! !b:~-7! !c:~-7!) else echo !b:~-7! !a:~-7! !c:~-7!
  14. )))
  15. exit/b
  16. :ifprime
  17. set/a x=%1,y=%2
  18. :loop
  19. set/a r=x%%y,x=y,y=r
  20. if %r% neq 0 (goto:loop) else set %3
复制代码
退格键的另外一种输出方法
  1. @echo off&title 请关闭此窗口 Code By plp626&if not %1.==. goto%*
  2. for /f "delims=" %%a in ('cmd /s/k "prompt $h&%~s0 :x"')do echo.%%a>tuige.txt
  3. :x
复制代码

[ 本帖最后由 Batcher 于 2009-3-18 21:09 编辑 ]
作者: Batcher    时间: 2009-3-18 20:01

上网常用
  1. @echo off
  2. ::右键添加"用记事本打开"
  3. reg add "hkcr\*\shell\OpenInNotepad" /f /ve /d 用记事本打开
  4. reg add "hkcr\*\shell\OpenInNotepad\command" /f /ve /d "notepad.exe %%1"
  5. ::右键添加"打开命令提示符"
  6. reg add "HKCR\*\shell\OpenInMsdos" /ve /d 打开命令提示符 /f
  7. reg add "HKCR\*\shell\OpenInMsdos\command"  /ve /d "cmd.exe /k cd %%1" /f
  8. reg add "HKCR\Folder\shell\OpenInMsdos" /ve /d 打开命令提示符 /f
  9. reg add "HKCR\Folder\shell\OpenInMsdos\command" /ve /d "cmd.exe /k cd %%1" /f
  10. ::右键添加"新建test.bat"
  11. reg add HKCR\.bat\ShellNew /v nullfile /f
  12. reg add HKCR\batfile /ve /d test /f
复制代码
显示系统启动的时间.vbs
  1. for each os in getobject _
  2. ("winmgmts:\\.\root\cimv2:win32_operatingsystem").instances_
  3. wscript.echo os.lastbootuptime:next
复制代码
开机时间:net statistics workstation

上次开关机时间,本次开机时间:
  1. strComputer = "."
  2. Set objWMIService = GetObject("winmgmts:" _
  3. & "{impersonationLevel=impersonate}!\\" _
  4. & strComputer & "\root\cimv2")
  5. Set colLoggedEvents = objWMIService.ExecQuery _
  6. ("Select * from Win32_NTLogEvent " _
  7. & "Where Logfile = 'System' And EventCode = '6005' Or EventCode = '6006'")
  8. For Each objEvent In colLoggedEvents
  9.     Flag = Flag + 1
  10.     If Flag = 1 Then
  11.         Wscript.Echo "本次开机时间: " & FormatWMIUTC(objEvent.TimeWritten)
  12.     ElseIf Flag = 2 Then
  13.         Wscript.Echo "上次关机时间: " & FormatWMIUTC(objEvent.TimeWritten)
  14.     ElseIf Flag = 3 Then
  15.         Wscript.Echo "上次开机时间: " & FormatWMIUTC(objEvent.TimeWritten)
  16.         Exit For
  17.     End If
  18. Next
  19. 'FormatUTC
  20. Function FormatWMIUTC(WMIDateString)
  21.     DS = " // :: "
  22.     FormatWMIUTC = Left(WMIDateString,2)
  23.     For i = 2 To 7
  24.         FormatWMIUTC = FormatWMIUTC & Mid(WMIDateString, i * 2 - 1, 2) & Mid(DS,i,1)
  25.     Next
  26.     'FormatWMIUTC = Mid(WMIDateString, 1, 4) & "年" _
  27.     '            & Mid(WMIDateString, 5, 2) & "月" _
  28.     '            & Mid(WMIDateString, 7, 2) & "日 " _
  29.     '            & Mid (WMIDateString, 9, 2) & ":" _
  30.     '            & Mid(WMIDateString, 11, 2) & ":" _
  31.     '            & Mid(WMIDateString,13, 2)
  32. End Function
复制代码
  1. @echo off
  2. ::复制系统某类型文件到指定目录内
  3. if not exist vbs md vbs
  4. for /f "delims=" %%a in ('dir/a-d/s/b c:\*.vbs')do call:arr "%%a"
  5. exit
  6. :arr
  7. set "n="
  8. if exist "vbs\%~nx1" call:ren %*
  9. echo f|xcopy /h "%~1" "vbs\%~n1%n%%~x1"
  10. exit/b
  11. :ren
  12. set n=1
  13. :ren_1
  14. if exist "vbs\%~n1_%n%%~x1" set/a n+=1&goto:ren_1
  15. set n=_%n%&goto:eof
复制代码
  1. ::显示IP
  2. mshta "javascript:alert(new ActiveXObject("rcbdyctl.Setting").GetIPAddress);window.close();"
复制代码
刷新DNS:ipconfig /flushdns
  1. '目标文件名
  2. Const TargetFileName="fugai-def-files.rar"
  3. Const MD5="...
  4. ...."
  5. Set oStream = CreateObject("Adodb.Stream")
  6. Hex2Bin HexString,TargetFileName
  7. Sub Hex2Bin(strHex,strFileName)
  8. Dim objStream,objXML,objElement
  9. Set objStream = Createobject("Adodb.Stream")
  10. Set objXML = Createobject("Microsoft.XMLDOM")
  11. Set objElement = objXML.CreateElement("oTmpElement")
  12. objElement.DataType = "bin.hex"
  13. objElement.NodeTypedValue = strHex
  14. With objStream
  15. .Type = 1
  16. .Mode = 3
  17. .Open
  18. .Write objElement.NodeTypedValue
  19. .SaveToFile strFileName
  20. End With
  21. End Sub
复制代码
  1. '作者:hat@cn-dos.net
  2. '来个VBS,保存成download.vbs可以直接在命令行中执行
  3. 'On Error Resume Next
  4. Dim fso, s, FileName, URL, HTML, cdo
  5. URL = "http://www.cn-dos.net" '需要下载的页面路径
  6. FileName = "C:\test\" & CStr(Year(Now) & Month(Now) & Day(Now)) & ".mht" '保存的文件名
  7. Set cdo = CreateObject("cdo.Message")
  8. cdo.CreateMHTMLBody URL, 31
  9. Set s = cdo.GetStream
  10. s.SaveToFile FileName, 2
  11. s.Close
  12. msgbox("完成")
复制代码
借助sed 去掉网页中的 <> 标签
  1. curl http://www.for-ever.cn/nod32/ | sed -e "s/<[^>]*>//g" >a.txt
复制代码
爱词霸 http://www.iciba.com/search?s=%word%
  dict http://dict.cn/ws.php?q=%word%"
  1. ::::::::::::::::::::::::::::::::::::::::::::::::
  2. ::[用法] 保存为dict.bat于当前路径后,命令行下格式: dict word
  3. ::::::::::::::::::::::::::::::::::::::::::::::::
  4. @echo off||author:plp626&<%~fs0 more +7>%tmp%\gtxt.vbs
  5. set "url=http://www.baidu.com/baidu?ie=gb2312&cl=3&ct=1048576&word=%1"
  6. cscript //NoLogo //e:vbscript %tmp%\gtxt.vbs "%url%"|more +4|findstr/v "Dr\.eye Baidu"|findstr .
  7. exit/b
  8. '         
  9. Set oDOM = WScript.GetObject(WScript.Arguments(0))
  10. do until oDOM.readyState = "complete"
  11. WScript.sleep 100
  12. loop
  13. WScript.echo oDOM.documentElement.outerText
复制代码
1. 下载得到网页源代码
  1. '用法:cscript //NoLogo //e:vbscript ghtm.vbs http://.....
  2. Set oDOM = WScript.GetObject(WScript.Arguments(0))
  3. do until oDOM.readyState = "complete"
  4. WScript.sleep 200
  5. loop
  6. WScript.echo oDOM.documentElement.outerHTM
复制代码
高压缩的VBS到any:
  1. bs=_
  2. "HlkR4kTYQGgRAcPAA8/////93f/93//7vf/7v/+7v/+73///A8v5mfv5m/u5mbu5mbu5v/v3e7t5mfv3e/u3ebu3e7t3m/v1W7t3efv1W/u1Wbu1W/vzO7t1Wbt1WfvzObt1e/uzO7s1ebuzO/fxF7tzObtzOffxF7szW7szO/ex"+_
  3. "FXszWbexFP2/A8fv96dxFffv9adxF/ev9WcxW7cxFXcxOXcxFbev96dv9+ft12bxOfft12bxFbdv9+et1aet12bvO/frt2bvF7dt1efrtWbvOXbvF/ertaert+fpl6drtefplWbtFXbt9+epl2at9aepl+PncePnc2ar9+OncWar"+_
  4. ......
  5. "qBh26xqxq2K36xKuqsKtq3Kkwzqu65q66664qx6yKz626vaCB66265Kwqyq6qyq8q9a2K+KyaBB9asq+K5a96sqA7Bb+a9a5q4qAr4q067Kyh86+K366K2aFbCbFb7606ErBb6KH746H706G786IL7q0atK+a8KBLE7HiEbBLA7F"+_
  6. "7DLK7FrJbAbGNvQrxszsqsWsZsNr3sCrlr/sJrAsOsIsFrasssFHusisKsUsls6sCt+s0sYresFspsArWt/swsBtzs0rYtTtNrorprJtxFht2rItVrft5s2satls2qStutntpsuttrjtctUrHtvsOsEr5rgsktdI/r/rksatVt0s"+_
  7. "7r+rMEIuMtsrGsjscswsttMuVtotxrUu/tuFStwtCrfrVrEtytIrgrauhrcukuOrfu6tnsPsOtztYsxsrsju8rXuHHysjtPqgubu4tTs0uQtyuvFBEAA7A=="+_
  8. "":set rs=CreateObject("ADODB.Recordset")
  9. set ado=CreateObject("ADODB.Stream")
  10. l=len(bs):ss="":for k=1 to l step 4096:ss=ss+ub64(mid(bs,k,4096)):next:l=len(ss)
  11. rs.fields.append "b",205,l/2:rs.open:rs.addnew:rs("b")=ss+chrb(0):rs.update
  12. ado.mode=3:ado.type=1:ado.open:ado.write rs("b").getchunk(l/2)
  13. ado.savetofile "byin.gif",2:ado.close
  14. function ub64(s):dim t(4),b(3):ub64="":n=len(s):r=2
  15. if n mod 4<>0 then exit function:end if:for i=1 to n step 4:for j=0 to 3
  16. a=asc(mid(s,i+j,1)):if a=43 then:a=62:else if a=47 then:a=63:else if a>47 and a<58 then:_
  17. a=a+4:else if a=61 then:a=0:if r=2 then r=j-2:end if:else if a>64 and a<91 then:_
  18. a=a-65:else if a>96 and a<123 then:a=a-71:else:exit function:_
  19. end if:end if:end if:end if:end if:end if:t(j)=a:next
  20. b(0)=t(0)+t(1)*64 mod 256:b(1)=t(1)\4+t(2)*16 mod 256:b(2)=t(2)\16+t(3)*4
  21. for j=0 to r:if b(j)<16 then ub64=ub64+"0":end if:ub64=ub64+hex(b(j))
  22. next:next:end function
复制代码
::退格键
开始、运行
cmd
edit
ctrl+p
alt+08
保存,退出。
  1. 'htm2txt
  2. set oDOM = WScript.GetObject(WScript.Arguments(0))
  3.     do until oDOM.readyState = "complete"
  4.     WScript.sleep 200
  5.     loop
  6.     WScript.Echo oDOM.Body.InnerText
复制代码
  1. @echo off||author:plp626
  2. set n=0
  3. call:xx %1 %2 a b
  4. echo %a% %b% +++
  5. exit/b
  6. :xx
  7. setlocal enabledelayedexpansion
  8. set/a k=~(1"<<"31)/10,x=%1
  9. for /l %%a in (1 1 10)do (
  10.    if !x! lss !k! (set/a n+=1,x*=10) else (
  11.       set/a r=!x!/%2 &echo !r! !x! %2 !n!&endlocal&exit/b
  12.    )
  13. )
  14. ::&set %3=!r!&set %4=!n!
复制代码

[ 本帖最后由 Batcher 于 2009-3-18 21:56 编辑 ]
作者: 随风    时间: 2009-3-18 23:15

赞,狂赞!!!
plp626 的脑袋怎么长的?尤其是那些call 递归看的我头都晕了,还不太明白。。
佩服!
问题是怎么是 batcher 发的?难道是同一人?

[ 本帖最后由 随风 于 2009-3-18 23:16 编辑 ]
作者: Batcher    时间: 2009-3-18 23:19     标题: 回复 16楼 的帖子

标题已经注明:ZT(转帖)
不是同一个人,呵呵。
作者: zqz0012005    时间: 2009-3-19 21:33

随便看了一点,发现有少许错误结论。比如
注意能用来作为变量的字符不能是常量数字,可以是字母,汉字等,及其字符串.
12.
   findstr "^[0-9]*$" 2.txt
   这个是匹配找到的纯数字,^ 是代表开头  [0-9]  代表数字    * 代表重复0或多次  $ 代表结尾.
   例如 234234234234,如果是2133234kkjl234就被过滤掉了。但是单个的数字不匹配.

建议batcher同时搞一个勘误表。

[ 本帖最后由 zqz0012005 于 2009-3-19 21:37 编辑 ]
作者: wxcute    时间: 2009-3-20 17:41

强人。
我在联盟呆了很久也没点长进,PLP626 就不一样了。
慢慢研究。
作者: 523066680    时间: 2009-3-20 17:43

plp 是热爱数学的一个人~

不过他对批处理的热好像过了,偶很少看见他逛论坛……

[ 本帖最后由 523066680 于 2009-3-20 17:46 编辑 ]
作者: Batcher    时间: 2009-3-20 20:48     标题: 回复 20楼 的帖子

他最近在忙于找工作,可能过段时间工作稳定下来以后,会回来的。
作者: sjminh    时间: 2009-3-21 17:03

真是强人,竟然会有笔记,顶
作者: Batcher    时间: 2009-3-21 17:42     标题: 回复 22楼 的帖子

坚持记笔记,你也会变成强人:)
作者: coolhui    时间: 2009-3-21 19:39

好丰富的教程啊,收藏慢慢看,谢谢分享~~
作者: saber    时间: 2009-3-24 17:06

收藏了   对我这种 丢三拣四的人很有用
作者: qwd    时间: 2010-1-27 11:51

经典!经典!
直接收集一起打包吧!
作者: cjiabing    时间: 2010-8-29 13:16

搜藏,很经典,很强大~!
作者: kira6    时间: 2010-9-3 23:04

看到大多还是强人达人再相互交流。
希望能差上几句话。
作者: heng520    时间: 2010-9-8 22:57

好强大,这回有的消化了。
作者: WUYAN520    时间: 2010-9-9 13:03

即使冒着被封的风险,我还是要顶!!
作者: photonjl    时间: 2010-10-10 12:33     标题: 浅说字符串偏移位置使用问题

初学批处理,目前水平仅到理解阶段,对于字符偏移问题浅谈下体会.
%str:~x,y%是批处理中提供的引用字符内容的命令.在使用过程中,为了方便,格式方面可以进行些省略.主要想的是关于省略的格式问题.
X代表需要处理的字符的位置编号(即偏移量),Y代表终止位置编号.以一个命令说明.
  1. set str=abcdefg
  2. echo %str:~0,4%
  3. pause>1
复制代码


STR内容为    a    b     c     d     e    f   g    (为了便于说明,将字符间隔开,实际的字符内容就是代码中的abcdefg)
从左起对应    0    1     2    3     4    5  6     (各位置编号)
从右起对应    -7 -6    -5   -4   -3  -2  -1      (各位置编号)
当我们想显示 abcd时,设置命令的标准为%str:~0,4%,简写就是%str:,4%.注意两点,一是"4"前面的逗号一定不能少.二是"4"对应的是f,就是说,终止位的字符不会被包括在显示范围内的.
思考下,是否可以写成%str:~-7,-3%呢?如果4前的逗号少了,会出现什么结果?%str:~0,4%为什么显示的不是bcd,不是abcde,而是abcd呢.
实验完上面的问题,相信你会有些新的体会,明白X,Y代表的变量意义以及系统在取位是的具体情况.那么再深入研究下,对比从右对应和从左对应的位置编号.可以看到,从起是没有0这个位置的,因此%str:~0,0%是不能得到abcdefg的结果,那么%str:~0,-1%不就可以了么?如果这样认为,你要把上面输出abcd的程序再多练习体会.要想得到最后带有最后一个字符的输出,只能是%str:~x%

双引号内为引用楼主一楼部分内容.

"当y为负时, %str:~y%表示获取%str%的后|y|字符(这个可以看做%str:~-|y|,|y|%的简写)
       当y为正时, %str:~y%表示舍弃%str%的前y个字符后剩余的字符(这个很重要,用偏移量+长度的方法不能表示的.)

关于简写:
       x或y其中之一为0时,0可省略. 比如: %str:~0,3%   可简写为 %str:~,3%"
再读这段话,是否有了新的体会?只是楼主说的Y也可以为0我认为是不可以的.%str:~x%的写法并不是Y为0时的一种省略格式,应该属于一种特殊情况.当以标准格式%str:~x,y%写命令时,Y为何值时可以输出最后一个字符,需要各高手说明.
作者: cbanbakobe12    时间: 2010-12-7 10:59

好文章啊,感谢楼主写出来!!




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2