无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 51999|回复: 105
打印 上一主题 下一主题

那位老师有些批处理的实例能否贴出来让偶等小鸟学习学习!

[复制链接]
1#
发表于 2006-11-26 22:19:00 | 显示全部楼层
  先传一个没有注释的东西上来——每个都注释的话,确实比较烦琐,而手动测试几次之后,基本上都能明白是怎么回事的。若确实有需要注释的,请跟帖标明文件名。

DOS实例练习.rar

86.44 KB, 下载次数: 1045, 下载积分: 无忧币 -2

回复

使用道具 举报

2#
发表于 2006-11-29 23:34:53 | 显示全部楼层
  set /a kk+=1是 set kk=%kk%+1 的缩写形式,也就是累加1的意思。如果最开始没有设置kk的值,用第一次用 set /a 来操作 kk 的时候,默认 kk 的值为0,当执行到 :55 的时候,set kk= 一句会把变量的值清空,第一次碰到 set /a 语句的时候,又会把 kk 的值重新设置为默认的0。
回复

使用道具 举报

3#
发表于 2006-12-2 07:28:12 | 显示全部楼层
  关于两个#号:这样做是防止出现空字符串。假设没有#号的话,一旦 %ii% 的值为空,则 ==左侧为空,那么,这个if语句就要出错,导致脚本自动退出。

  echo %~f0 用在CMD命令行中,echo %%~f0 用在批处理文件中,这个是 for 语句的一个规定,请看 for 的帮助信息:

  1. 对一组文件中的每一个文件执行某个特定命令。

  2. FOR %variable IN (set) DO command [command-parameters]

  3.   %variable  指定一个单一字母可替换的参数。
  4.   (set)      指定一个或一组文件。可以使用通配符。
  5.   command    指定对每个文件执行的命令。
  6.   command-parameters
  7.              为特定命令指定参数或命令行开关。

  8. 在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable
  9. 而不要用 %variable。……
复制代码

  百分号对之间夹字符串,表示是对该变量的引用,在变量延迟的时候,百分号对要换成感叹号对。
回复

使用道具 举报

4#
发表于 2006-12-2 21:26:20 | 显示全部楼层
  对纯DOS不熟悉,纯DOS下似乎不支持 set 命令的 /a 参数。
回复

使用道具 举报

5#
发表于 2006-12-4 13:03:23 | 显示全部楼层
  这个变量扩展是由 for 语句的规则派生出来的。
回复

使用道具 举报

6#
发表于 2006-12-6 18:06:17 | 显示全部楼层
Re 17#

  %~dp0 还是 for 语句的变量扩展的组合形式,其中,%0 是"形参",表示批处理文件本身,类似的还有%1~%9,一般用在 call 语句中。请看 for 的变量扩展描述:

  1. 另外,FOR 变量参照的替换已被增强。您现在可以使用下列
  2. 选项语法:

  3.      ~I         - 删除任何引号("),扩充 %I
  4.      %~fI        - 将 %I 扩充到一个完全合格的路径名
  5.      %~dI        - 仅将 %I 扩充到一个驱动器号
  6.      %~pI        - 仅将 %I 扩充到一个路径
  7.      %~nI        - 仅将 %I 扩充到一个文件名
  8.      %~xI        - 仅将 %I 扩充到一个文件扩展名
  9.      %~sI        - 扩充的路径只含有短名
  10.      %~aI        - 将 %I 扩充到文件的文件属性
  11.      %~tI        - 将 %I 扩充到文件的日期/时间
  12.      %~zI        - 将 %I 扩充到文件的大小
  13.      %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩充
  14.                    到找到的第一个完全合格的名称。如果环境变量名
  15.                    未被定义,或者没有找到文件,此组合键会扩充到
  16.                    空字符串

  17. 可以组合修饰符来得到多重结果:

  18.      %~dpI       - 仅将 %I 扩充到一个驱动器号和路径
  19.      %~nxI       - 仅将 %I 扩充到一个文件名和扩展名
  20.      %~fsI       - 仅将 %I 扩充到一个带有短名的完整路径名
  21.      %~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充
  22.                    到找到的第一个驱动器号和路径。
  23.      %~ftzaI     - 将 %I 扩充到类似输出线路的 DIR
复制代码


Re 19#

  for 语句功能十分强大,若能把它研究透,离高手也就不远了。但是非常不幸,MS自家的帮助信息居然有不少错误的表述,估计是哪位E文没学好的家伙翻译过来的。

  eol=- 实际上是忽略以 - 开头的行;delims= 表示以等号后面的符号为分隔符来提取文本信息,提取的时候,因为这些符号是做了分隔符的,所以提取出来的信息中是不会含有这些符号的,除非使用 tokens=1* 之类带星号的格式来提取;当 delims= 后只有一个符号的时候,还很容易理解,如果有多个符号的话,情况就变得十分复杂了,由于本人平时只注重使用,而不善于归纳总结,对这种情况也没多少可说的,只能建议你变换条件来反复测试。
回复

使用道具 举报

7#
发表于 2006-12-7 12:35:27 | 显示全部楼层
  在特定条件下,批处理能将自身某一块或某N块的内容输出为某一文件,这些条件有(满足其中一条即可):

  1、信息块本身有CMD能处理的起止标记;
  2、信息块位于文件中某些特定的行;

  以下是一些演示代码:

  1. @echo off
  2. :: 把以 :start 开始,goto :eof之前的信息段输出到test.txt
  3. cd.>test.txt
  4. set switch=1
  5. for /f "delims=" %%i in ('findstr .* "%~0"') do (
  6.     if /i "%%i"==":start" set switch=
  7.     if /i "%%i"=="goto :eof" set switch=1
  8.     if not defined switch >>test.txt echo.%%i
  9. )
  10. start test.txt
  11. exit

  12. :start
  13. @echo off
  14. echo hello world
  15. pause>nul
  16. goto :eof

  17. :end
  18. exit
复制代码

  1. @echo off
  2. :: 把 :start 标签段的信息段输出到test.txt(忽略空行)
  3. cd.>test.txt
  4. set num=0
  5. setlocal enabledelayedexpansion
  6. for /f "delims=" %%i in ('findstr .* "%~0"') do (
  7.     set /a num+=1
  8.     if !num! gtr 12 if !num! lss 17 >>test.txt echo.%%i
  9. )
  10. start test.txt
  11. exit

  12. :start
  13. @echo off

  14. echo hello world
  15. pause>nul
  16. goto :eof

  17. :end
  18. exit
复制代码

  1. @echo off
  2. :: 将 :start 之后的所有内容输出到 test.txt
  3. >test.txt more +7 "%~0"
  4. start test.txt
  5. goto :eof

  6. :start
  7. @echo off
  8. echo hello world
  9. pause>nul

  10. :next
  11. @echo off
  12. echo hell bbs.wuyou.net
  13. pause>nul
复制代码

[ 本帖最后由 namejm 于 2006-12-7 10:56 PM 编辑 ]
回复

使用道具 举报

8#
发表于 2006-12-10 17:10:36 | 显示全部楼层
  for /f %%i in (set) do (command) 语句表示在最终对象为文本内容的时候进行循环,该语句有三种基本类型,各种类型的适用情况如下:

  ① 当 set 为文件名时,用 for /f %%i in (filename) do (command);
  ② 当 set 为字符串时,用双引号把字符串括起来:for /f %%i in ("string") do (command);
  ③ 当 set 为命令语句时,用单引号把命令语句括起来: for /f %%i in ('command1') do (command2);

  第3种情况下,如果 set 内用到了管道符号,则一般在管道符号前用转义符号^来连接前后语句,如 for /f "delims=: tokens=2" %%i in ('ipconfig^|find /i "ip address"') do echo %%i ;如果不使用转义符号^,则把管道符号前后语句都用双引号括起来,再在最外层使用单引号,也就变成了 for /f "delims=: tokens=2" %%i in ('"ipconfig|find /i "ip address""') do echo %%i 这样的语句。
回复

使用道具 举报

9#
发表于 2006-12-11 23:34:53 | 显示全部楼层
  > 表示用执行结果覆盖目标文件,>> 表示把执行结果追加到目标文件。
回复

使用道具 举报

10#
发表于 2006-12-12 10:14:12 | 显示全部楼层
  批处理无须编译,直接保存为cmd格式或bat格式就可以跑起来,SPKEEY 兄误解了。
回复

使用道具 举报

11#
发表于 2006-12-12 11:29:50 | 显示全部楼层
  如果用在批处理文件中,for 语句中的 %%a 要用两个百分号,在CMD命令行中只能用一个百分号,这是for语句的一个规定。
回复

使用道具 举报

12#
发表于 2006-12-16 00:00:17 | 显示全部楼层
  如果它们后面不跟任何字符的话,它们的作用就是产生一个空行。在排版的时候非常有用。

  另外,它们的使用还有些技巧。比如在批处理中,假设你要在屏幕上显示一个变量的值的话,按照一般的写法,写成 echo %var%,如果这个变量恰好是个空值的话,就会显示当前 echo 的状态,而不是一个空值。为了回避这个干扰信息,可以写成 echo.%var% 的形式(注意:一定要连着写,中间不带任何空格),或者 echo:%var%,或者 echo;%var%,则碰到空值的时候,会自动空一行;碰到有内容的时候,会正确显示内容而不会产生多余的空行。

  感谢你的盛情邀请,有机会到石家庄的话,我一定去骚扰你^_^。若你有机会来成都的话,也别忘了和我联系:)
回复

使用道具 举报

13#
发表于 2006-12-18 13:45:19 | 显示全部楼层
  关于启用变量延缓的详细解释,可以参考这个帖子:http://www.cn-dos.net/forum/viewthread.php?tid=20733&fpage=2。

  findstr /n 打印了行数而你却没看到,是因为在 echo 的时候,就没让它显示出来,这与前面的设置及后面的 echo 语句有关系。假设你的 test.txt 中存在若干行信息,运行如下批处理代码来观察屏幕显示:

  1. @echo off
  2. findstr /n *. test.txt
  3. pause
复制代码

  你看到了什么?是不是以 行号:行内容 的格式显示的?
  
  回到你的疑问中来:for /f "tokens=1,2* delims=:"  这部分的含义是:以冒号为分隔符,提取第一、二个冒号前的内容及第二个冒号后的所有内容(不考虑几个冒号连用的情况),第一个冒号前的内容被 %%i 接收,第二个冒号前的内容被 %%j 接收,剩余的所有内容被 %%k 接收,%%j 和 %%k 分别被 tokens= 这个部分的 2 和 * 定义;findstr .* 中的点号表示任意非空字符,.*连用表示任意字符(包括空字符)。

  转义字符的作用是取消某些符号的原有功能,把它们转化成一般的字符,主要为了处理重定向符号和管道符号。把这个功能用到其他场合,也会有意想不到的效果。比如,在命令行里,你运行 echo > 会提示你语法错误,运行 echo ^> 之后,就会在屏幕上显示字符 > 了,在这里,^ 把 重定向符号 > 转化成普通字符了。实际上,把所有要显示的内容之前加上^,都会显示原本的内容而不显示 ^。
回复

使用道具 举报

14#
发表于 2006-12-23 22:09:56 | 显示全部楼层
  如果 goto :eof 不在被 call 的标签段中,并且没有 :eof 标签段的话,那么,goto :eof 等价于 exit 命令;如果它在某个被 call 的标签段中,并且没有定义 :eof 标签段,那么,它的意思就是跳转到批处理文件的末尾。
回复

使用道具 举报

15#
发表于 2006-12-25 16:20:21 | 显示全部楼层
原帖由 鹤冲天 于 2006-12-25 02:28 PM 发表
晕,怎么把这精华帖算到偶头上了??偶何德何能??岂敢在这里妄自尊大!
强烈建议斑竹将此精华帖算到nemejm老师名下!!

  加精的目的是让更多的人来关注,能达到这个目的我就很高兴了,至于精华算在谁的名下,对我来说不是很重要。再说,你发起了这个讨论,并且一直在关注它,版主也应该奖励一下你啊:P
回复

使用道具 举报

16#
发表于 2006-12-26 00:09:07 | 显示全部楼层
  加精不会影响继续讨论哈,反倒能吸引更多的人来参与讨论,更能推动讨论往深入的方向发展,楼主就别计较那么多了。
回复

使用道具 举报

17#
发表于 2006-12-27 21:47:09 | 显示全部楼层
  要把路径中的单斜杠换成双斜杠,可以参考如下演示代码:

  1. @echo off
  2. set "var=%cd%"
  3. set "str=%var:\=\\%"
  4. echo "%str%"
  5. pause
复制代码
回复

使用道具 举报

18#
发表于 2006-12-28 16:17:34 | 显示全部楼层
  红色部分是汇编代码,我也不知道确切含义,请高人出来解释一下吧。
回复

使用道具 举报

19#
发表于 2006-12-29 16:16:58 | 显示全部楼层
原帖由 鹤冲天 于 2006-12-28 10:01 PM 发表

能用了!呵呵,但我不是很理解,等我想想在把代码贴上来,大家给看看啊!!

  在 set 命令的帮助中有这么一段话:

  1. 环境变量替换已如下增强:

  2.     %PATH:str1=str2%

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

使用道具 举报

20#
发表于 2007-1-13 17:36:35 | 显示全部楼层
  呵呵,把你的代码精简一下:

  1. @echo off
  2. set "str=%cd:\=\\%"
  3. (
  4. echo Windows Registry Editor Version 5.00
  5. echo.
  6. echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
  7. echo "KAV"="%str%\\avpm.exe"
  8. )>c:\1.reg
  9. regedit /s c:\1.reg
  10. del /q /f c:\1.reg
  11. echo 搞定!!!
  12. pause
复制代码
回复

使用道具 举报

21#
发表于 2007-1-13 18:23:23 | 显示全部楼层
  括号表示它内部的一组命令是一个整体,for 中经常用到。

  不生成临时文件也是可行的,好好研究一下 reg /? 的帮助信息吧。比如,可以写成:

  1. reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v KAV /t REG_SZ /d "%str%\\avpm.exe" /f
复制代码
回复

使用道具 举报

22#
发表于 2007-1-18 14:41:39 | 显示全部楼层
  用批处理操作注册表,除了 reg+动词+对象 和 echo 一个注册表文件然后再 regedit /s 注册表文件 之外,似乎已经没有其他方法了。
回复

使用道具 举报

23#
发表于 2007-1-19 15:42:30 | 显示全部楼层
  是的,就是要演示 goto :eof 的作用。
回复

使用道具 举报

24#
发表于 2007-1-22 12:45:49 | 显示全部楼层
  在我这里没有问题。
回复

使用道具 举报

25#
发表于 2007-1-22 21:42:30 | 显示全部楼层
  我特意新建了"d:\DOS实例练习\DOS实例练习"的文件夹来测试,还是没有出现你所说的那个问题——是不是你那个批处理文件还有其他要写文件的代码,而那个文件夹又是不允许写文件的?
回复

使用道具 举报

26#
发表于 2007-1-31 17:57:48 | 显示全部楼层
  命令行下输入 copy %systemroot%\help\ntcmds.chm d:\,然后到D盘根目录下查看ntcmds.chm,里面几乎囊括了所有能在XP下运行的命令。
回复

使用道具 举报

27#
发表于 2007-2-10 10:50:29 | 显示全部楼层
  我这里没有出现这种情况呢,请看下面的图片。

CMD窗口情况.jpg (10.61 KB, 下载次数: 125)

CMD窗口情况.jpg

注册表情况.jpg (26.11 KB, 下载次数: 125)

注册表情况.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-5-14 19:57

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表