Board logo

标题: [原创] 本人常用的批处理实用技巧 [打印本页]

作者: namejm    时间: 2008-4-24 22:36     标题: 本人常用的批处理实用技巧

网上流传着很多DOS小技巧,但是,以现在的眼光重新审视,它们有些并不适用于批处理。编写批处理代码一年多来,本人积累了一些实用的批处理代码编写技巧,现发出来大家一起分享。若能善用这些代码,将会大大简化各位的编码工作,并会一定程度上提升代码的执行效率。

  1、不显示代码执行期间的各种提示信息

  很多时候,为了使得屏幕上不出现无关的信息,我们需要屏蔽掉命令执行过程中产生的一些提示,有时候是屏蔽掉出错信息,有时候是为了屏蔽成功执行命令的信息,有时候两者都需要屏蔽,那么,我们可以把各种提示信息重定向到空设备中去,具体的代码是:
  ① 如果要屏蔽成功执行命令的信息,请在语句的最后加上代码 >nul。比如 copy a.txt d:\test>nul
  ② 如果要屏蔽出错信息,请在语句最后加上代码  2>nul,需要注意的是,数字2前必须带空格。比如,md test 2>nul,如果当前目录已经存在文件夹test,那么,执行这条语句将不会出现错误提示;
  ③ 如果要同时屏蔽正确执行代码后产生的提示和出错时的信息,请在语句最后加上代码 >nul 2>nul。比如,copy a.txt d:\test>nul 2>nul 这条语句,无论命令是否成功执行,都不会在屏幕上出现任何提示;
  善用 nul 2>nul 句式,可以很方便地实现很多目的,比如创建文件夹的时候,无需先用if语句来检测是否已经存在某个目录,直接 md test 2>nul 即可,可以提高代码的执行效率。

  2、cd.>test.txt

  很多人第一次遇到这样的语句时,都会大惑不解:cd不是跳转目录的命令吗?怎么会有创建0字节文件的功能呢?曾经有段时间,我是用echo.>test.txt来创建空文件的,只是这个空文件虽然没有任何内容,但是,大小不是0字节,在要求苛刻的情况下,并不能很好地完成任务。实际上,从理论上来说,创建0字节文件的语句有无限多种,只要明白其中的奥妙,就可以随心所欲地构造出来,只是cd.>test.txt是最简洁的方法,符合我"解决问题简洁化"的一贯主张。构造0字节文件的奥妙在于:只要没有任何内容重定向到文件中去,0字节文件就会随着命令的执行而产生。比如dir 2>test.txt、arp >text.txt、abc 4>test.txt……,只要符合"任意内容+空格+2以上10以下的数字+>test.txt"的格式即可。需要注意的是,千万不要被屏幕上的各种出错信息所蒙蔽,我们的最终目的是产生0字节的文件,至于错误提示完全可以用 2>nul 去屏蔽。更详细的讨论请参考本人在CN-DOS发过的这篇帖子:可构造0字节文本文件的几条命令

  3、del /a /f *.txt

  我们知道,单独的del命令并不能删除带隐藏或只读属性的文件,于是,很多人自然而然地想到先用 attrib 命令来先给将要删除的文件去掉各种属性。其实,操作过程大可不必如此繁琐,只须给del加上 /a /f 的参数就可以了。

  4、echo. echo; echo/和echo\

  在很多人的心目中,产生换行符的方法只有echo.一种,实际上,到目前为止,已经有人找出了标题所列的四种方法,有兴趣不妨换着用用,也可以在菜鸟面前炫耀一番^_^

  5、echo.%str% 和 echo %str%

  知道 echo.hello! 和 echo hello! 有何差别吗?就具体字符串的输出而言,它们在效果上是完全等同的;但是,当 hello! 用变量来替换之后,在特定情况下结果将会截然不同!试试令变量 str 为空,再在批处理文件中分别执行这两条语句,看看它们的提示吧。结果出来了吗?总结一下:当变量 str 的值为空时,echo.%str% 输出了一个空行,而 echo %str% 则返回 echo 的当前状态。当用 for 语句读取带空行的文本,并用 echo 语句来输出时,echo.%str% 语句无疑是上上之选。另外,第4条的技巧在这里同样适用。

  6、拼接多行字符串为一行

  如果要把某个文本中的多行字符串拼接为一行,按照一般的思路,是在for语句中,先 set str=%%i,然后,下一步是 set str=%%i!str! ,从而实现后一句与前一句的拼接。实际上,这两步只用一条 set /p str=%%i<nul 就可以实现。简单的演示代码如下:
  1. @echo off
  2. for /f "delims=" %%i in (test.txt) do set /p str=%%i<nul
  3. echo.
  4. pause>nul
复制代码

作者: wjta    时间: 2008-4-24 22:50

多谢指教啊,呵呵!!
作者: lingfeng    时间: 2008-4-25 18:46

宝贵的经验,顶!!!!
作者: yharvey    时间: 2008-4-29 09:29

共享。。。
谢谢。。。
作者: CatSky    时间: 2008-5-2 17:45

顶一个。不错。。。学习ING
作者: 每年达    时间: 2008-6-13 12:35

3Q!~                  
Studying
作者: happen2008    时间: 2008-6-14 10:14     标题: 回复 1楼 的帖子

“当变量 str 的值为空时,echo.%str% 输入了一个空行,而 echo %str% 则返回 echo 的当前状态。”感觉好像不行啊。能否解释一下?或者把代码和执行的显示结果展示一下?
作者: happen2008    时间: 2008-6-14 10:18     标题: 已解决

不好意思,试多一次,已解决
作者: 浅默    时间: 2008-6-15 11:31

@echo off
for /f "delims=" %%i in (test.txt) do set /p str=%%i<nul
echo.
pause>nul

想问一下这贴,怎样把str 变量的值显示出来呢?
如:echo %str%
或 %str:0,~1%这么用

[ 本帖最后由 浅默 于 2008-6-15 11:33 编辑 ]
作者: namejm    时间: 2008-6-15 19:02

  set /p str=%%i<nul  的时候,已经把值赋予变量 str 了,可以随时对 str 做字符串操作。

_____________________________________________________________________________

  经过随风的提醒,发现我这个说法是错误的。实际上,set /p str=%%i<nul 语句并不能实现把
值赋予变量str,在这里,str的存在是没有任何意义的,应该简化为 set /p=%%i<nul 。

作者: Tenlaopo    时间: 2008-6-18 23:54

主持一下Namejm,刚从CN-DOS 过来的。
作者: 小勇12    时间: 2008-7-4 20:30

宝贵经验啊!
终于把不显示代码执行期间的各种提示信息弄懂了
作者: xxymg    时间: 2008-7-28 00:42

我也来顶顶啊! 学习!
作者: lzwudi    时间: 2008-9-5 15:50

值得学习前辈们的经验和成果
作者: gdygood    时间: 2008-9-9 20:44

学习了,一些教程里没有的经验,谢了
作者: xupanfeng    时间: 2008-9-12 10:52     标题: 我顶

希这样的小技巧    多多贡献
作者: 随风    时间: 2008-10-7 17:49

原帖由set /p str=%%i<nul  的时候,已经把值赋予变量 str 了,可以随时对 str 做字符串操作。

不知是我的理解错误还是对此语句不了解
这样能对 str 做字符串操作吗?
我认为并没有给 变量 str 赋值。
作者: namejm    时间: 2008-10-7 17:54

  呵呵,确实是我错了,我错在没有实地测试就想当然了。
作者: wwjpl    时间: 2008-10-23 11:20

看不太懂(本人基础差)以后慢慢学习。
作者: jytn    时间: 2008-10-26 07:49

牛人。不得不佩服。。
作者: zhan5257    时间: 2008-10-26 14:04

宝贵的经验啊,以后在实践中能用的到啊。谢谢
作者: hlzj88    时间: 2008-11-12 23:19

原帖由 namejm 于 2008-10-7 17:54 发表

  呵呵,确实是我错了,我错在没有实地测试就想当然了。

我两个都试了,能成功写入文本的,楼主说的测试,想知道这个测试怎么进行,从哪里下手,最好能给个代码,好看看能进行测试的过程,我想我们以后也是要进行测试这一过程的
作者: wj00001    时间: 2008-11-13 08:02

收藏了,好好学习学习,谢谢整理指教。
作者: Batcher    时间: 2008-11-13 11:01     标题: 回复 22楼 的帖子

  1. @echo off
  2. rem 这样可以对变量str1赋值
  3. set str1=bathome
  4. echo %str1%
  5. rem 这样不可以对变量str2赋值
  6. set /p str2=homebat<nul
  7. echo %str2%
  8. pause
复制代码

作者: heng520    时间: 2008-11-13 14:01

感动。。让新手少走弯路。
作者: cui0029    时间: 2009-1-25 19:48

很宝贵的经验!帮楼主顶顶!!
作者: taojunyi    时间: 2009-1-28 15:52

第六点,我有不同意见,尽管我从前几点也学了不少知识!
“按照一般的思路,是在for语句中,先 set str=%%i,然后,下一步是 set str=%%i!str! ,从而实现后一句与前一句的拼接。”这话不对,其实拼接也只要一句就够了。一般的思路是这样的,循环体中只有一条语句。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in (22.txt) do (
  4. set  str=!str!%%i
  5. )
  6. echo %str%
  7. pause>nul
复制代码
==========
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in (22.txt) do (
  4. set /p str=%%i<nul
  5. )
  6. pause>nul
复制代码
set /p str=%%i<nul这句根本没给str赋值,因为=后面是提示文字,<nul从空设备输入空内容给str,只是表面上实现了不同行的拼接!
作者: fsh6666    时间: 2009-3-9 15:07

经验分享了    谢谢楼主!!!!!!
作者: namejm    时间: 2009-3-9 21:48

原帖由 taojunyi 于 2009-1-28 15:52 发表
第六点,我有不同意见,尽管我从前几点也学了不少知识!
“按照一般的思路,是在for语句中,先 set str=%%i,然后,下一步是 set str=%%i!str! ,从而实现后一句与前一句的拼接。”这话不对,其实拼接也只要一句就够了 ...

  呵呵,在这里我只是想展示常规的思路,并没有对错之分,只有简洁与否之分。

set /p str=%%i<nul这句根本没给str赋值,因为=后面是提示文字,<nul从空设备输入空内容给str,只是表面上实现了不同行的拼接!

  你这个分析很正确,屏幕上出现的内容并没有真正地赋予str,就像 "set /p str=请输入内容:"这句一样,"请输入内容:"并没有赋予str,而是只接收手工输入的内容。
作者: aresk    时间: 2009-3-10 09:10

楼主,谢谢了!!

真心感谢!!
作者: freeback    时间: 2009-3-13 23:34

在上面的nul中,>nul 和<nul两个有什么区别?
作者: Batcher    时间: 2009-3-14 15:00     标题: 回复 31楼 的帖子

本论坛搜索“nul”
作者: rogoo    时间: 2009-3-21 15:32

你的第五个中的两个命令好像是一样的
作者: Batcher    时间: 2009-3-21 15:49     标题: 回复 33楼 的帖子

不一样,再仔细看看吧。
作者: 5810239q    时间: 2009-3-25 17:01

过来学习下,谢谢!!
作者: 5810239q    时间: 2009-3-27 11:16

我是我需要的 嘿嘿
作者: fengzhong1    时间: 2009-3-27 19:59

路过看看!!!!!!!!!!!
作者: luzhanhong    时间: 2009-4-15 22:23

学习啦,初学,不太懂。。
作者: qjfke    时间: 2009-4-17 13:54

多谢谢了,学习一下下
作者: risingmay    时间: 2009-4-30 00:39

经验很重要 感谢分享
作者: kanfengjing    时间: 2009-4-30 08:49

多发点啊老大。的确是好东西。好好学习了
作者: huaier    时间: 2009-5-1 18:41

厉害,的确姜还是老的辣啊
作者: energy2009    时间: 2009-5-5 22:32

楼主,好样的。那你的经验拿出来分享!!
有很多热衷批处理的人在关注你们!
谢谢你们知识的传播!
作者: goodman    时间: 2009-5-6 21:50

很值得学习的东东呀,感谢楼主
作者: 0428_hai    时间: 2009-5-17 23:14

又获益匪浅。。。
不知道你们的批处理知识是积累的还是专门看了什么批处理的书籍雪来的呢,呵呵。。
作者: netbenton    时间: 2009-5-18 01:30

我也来发一个技巧:
简化菜单定义时的多个if +goto :标号
用法:
(要用到变量延迟)
  1. ::定义菜单串,注意,各项是用空格隔开的,并且首尾也要空格。
  2. set "menu= 1 2 3 exit help a b c "
  3. :lp
  4. set /p in=请选择%menu% :
  5. if "!menu: %in% =!" neq "!menu!" goto :menu%in%
  6. goto :lp
  7. :menu1
  8. :menu2
  9. :menu3
  10. :menuexit
  11. :menuhelp
  12. :menua
  13. :menub
  14. :menuc
复制代码
比起多个if + goto 要简单多了吧,
维护起来也容易,只要改动前面菜单串定义就可以了
作者: netbenton    时间: 2009-5-20 07:58

不用if,这样也可以:
  1. set "menu=:lp :1 :2 :3 :exit :help :a :b :c "
  2. :lp
  3. set /p in=enter
  4. set menu=!menu:*:%in% =:%in% !
  5. goto %menu%
  6. :1
  7. :2
  8. :3
  9. :exit
  10. :help
  11. :a
  12. :b
  13. :c
复制代码

作者: fjwsq    时间: 2009-5-20 12:39

学习前辈们的经验和成果
作者: wkdxz    时间: 2009-8-5 13:58

谢谢楼主的教程,尤其是DEL /A /F,很实用!!
作者: qq378653859    时间: 2009-9-17 12:29

值得去学习,呵呵!!!
作者: 5566ljlj    时间: 2009-10-25 16:48

确实是非常实用的技巧,非常感谢楼主能分享经验。
作者: zilu63    时间: 2009-10-27 08:48

感谢楼主的无私分享精神,让我又学多了东西。
作者: Mfk    时间: 2010-4-10 17:41

链接过去看了一下,原来还有么多可以创建空文本文件。
可以构造0字节文本文件的命令(在下列命令后直接加>test.txt):
break
call
cd.
cd..   会退到上一级目录
copy nul
doskey
endlocal
exit   会退出CMD窗口
goto   批处理中会退出CMD窗
pushd %cd%
popd
rem.  (以点号开头的任意非敏感字符都可以)
shift
title 可跟任意非敏感字符
作者: honeybat    时间: 2010-4-10 18:18

新人刚到,领略了楼主的经验,非常感谢。从几个前辈的讨论中学到了很多,再次感谢!
作者: whitecat    时间: 2010-4-13 15:11

不错 学习学习
作者: taijiji    时间: 2010-8-9 15:02

感谢前辈的精心撰写!
作者: paladinjin    时间: 2010-8-18 09:29

经楼主指点
ECHO:也可以输出空行
还学到把不同行在一行显示的办法
5就搞不懂喽 显示结果一样
作者: 198717lpf    时间: 2010-10-12 11:04

很好! 又学会新东西了,谢谢!
作者: manhua    时间: 2010-11-18 16:39

楼主的最后一个说明    是困扰了我很久的问题    万分感谢
作者: zixuan    时间: 2011-2-22 22:16

set /p str=%%i<nul
这个学习了
作者: vbdos    时间: 2011-4-26 13:46

学习到了   教程里没有的经验    谢谢
作者: qrpe1993    时间: 2011-5-1 00:52

有没有:设置开机启动项的命令呀...谢谢.
作者: mqy62026    时间: 2011-5-1 20:58

我也来顶顶啊! 学习!
作者: andy七少    时间: 2011-5-21 16:03

刚开始学的时候看的云里雾里的。。现在学了一段时间的批处理在回头来看看挺受用。。谢谢分享
作者: cggm    时间: 2011-5-24 21:35

学习学习,值得推荐
作者: 鳌头七队    时间: 2011-6-1 14:06

请教下"delims="跟"delims=字符列表"有什么区别?
作者: apple366    时间: 2012-4-12 09:25

弱弱的问一下,第二个,构造0字节文本,有什么实际应用的意义么?
作者: wangtao6312    时间: 2012-5-17 18:47

学习了,谢谢楼主。
作者: wuxian503    时间: 2012-12-15 09:25

真的很感谢楼主的无私奉献,学起来更加有动力了
作者: boy305451535    时间: 2012-12-20 23:29

看了.有些看不懂.学习了.
作者: jacknomber1    时间: 2013-5-24 12:08

学习中,,,谢谢分享
作者: 旋律-闭关修炼    时间: 2013-5-25 14:51

看看别人的总结总能有新的体会
作者: tangqingfu    时间: 2013-5-28 21:26

谢谢分享,收藏学习!
作者: btstone    时间: 2014-3-23 23:21

回复 1# namejm


    学习了,感谢分享,论坛因你而精彩!
作者: wxc2k14329    时间: 2014-4-5 10:41

野问  "delims="跟"delims=字符列表"有什么区别?
作者: 逸蓝    时间: 2015-5-6 16:26

必须回帖,不错
作者: jaffsz    时间: 2015-8-18 23:06

不错,新兵学习,谢谢!
作者: ai20110304    时间: 2016-8-2 16:02

不错。3Q
作者: ai20110304    时间: 2018-8-27 19:50

谢谢技巧分享
作者: dgccjsj    时间: 2019-8-4 10:44

谢谢指教
作者: liqihu    时间: 2020-9-13 11:30

学习一下吧,平时使用的还是win系统多一些。
作者: raymondlamgz    时间: 2020-9-14 19:48

感谢楼主分享,刚开始学,感谢很有用
作者: 海格里斯大王    时间: 2021-3-6 10:45

学习,非常感谢




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