Windows批处理的高级用法

转载 2006年05月25日 15:52:00
嗯,标题好像很大,貌似会图文并茂的讲解很多用法似的……嘿嘿,其实没这么复杂,只是从一个例子出发,抛砖引玉,引出Windows批处理中并不为我们注意的高级用法。真的很有用哦!

有这么一个需求,要求做一个批处理文件,能够自动执行某个目录中的几个可执行文件,并且把它们的屏幕输出存入一个Log文件中。这里涉及到两个问题:
  1. 如何将屏幕输出转向到文件
  2. 如何确定Log的文件名
这两个问题都比较简单。第一个问题,通过“>”和“>>”可以轻松搞定,第二个问题似乎也不难,因为Windows支持环境变量,其中 有一个“%DATE%”代表当前的日期,还有个“%TIME%”代表当时的时间,精确到百分之一秒。似乎这已经足够了吧,于是写出下面的脚本:
@echo off
SET LogFile=%DATE%%TIME%.log

app1.exe param1 param2  > %LogFile%
app2.exe param1 param2 >> %LogFile%
app3.exe param1 param2 >> %LogFile%
但是,很可惜,它无法按预期结果运行,它只会生成一个没有扩展名的文件,形如“2006-05-25”。想了想,哦,明白了,因为%DATE%打出来的东西是“2006-05-25 星期四”,遇到空格之后重定向的机制就开始起作用了,它以为这就是文件名全称了。
好了,那么我来加上引号,这下应该无敌了吧。
@echo off
SET LogFile="%DATE%%TIME%.log"

app1.exe param1 param2  > %LogFile%
app2.exe param1 param2 >> %LogFile%
app3.exe param1 param2 >> %LogFile%

但是,还是很可惜,Windows会报告“参数错误”。这又是怎么了呢?嗯,原来,Windows不允许文件名或目录名中含有“:”,而%TIME%的输出结果中恰好有两个“:”。这就无语了。
正在绝望之时,突然在命令行里鬼使神差的敲了一个“help set”,一切问题都明白了!以前都没有意识到啊,Windows批处理竟有如此强大的威力(当然,这还是没法和*nix比,不过已经比原来认识到的强多了)。
现在知道了,这个脚本可以这样写:
@echo off
SET LogFile=%DATE%%TIME%
REM 把 : 都替换成 -
SET LogFile=%LogFile::=-%
REM 把空格都替换成 -
SET LogFile=%LogFile =-%
REM 把 . 都替换成 -
SET LogFile=%LogFile.=-%

SET LogFile=%LogFile%.log

app1.exe param1 param2  > %LogFile%
app2.exe param1 param2 >> %LogFile%
app3.exe param1 param2 >> %LogFile%
至于具体的原理,大家可以在命令行里面敲help set就可以清楚看到了,Windows的文档做的就是好啊。
此外,还有help if和help call也很值得看,这些东西组合起来就构成了Windows批处理的高级用法。

嗯,说完了(噢,好像什么都没说啊……)。

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=754800

Windows批处理的高级用法

嗯,标题好像很大,貌似会图文并茂的讲解很多用法似的……嘿嘿,其实没这么复杂,只是从一个例子出发,抛砖引玉,引出Windows批处理中并不为我们注意的高级用法。真的很有用哦!有这么一个需求,要求做一个批...
  • Realdodo
  • Realdodo
  • 2006年05月25日 15:15
  • 1205

C语言宏定义高级用法总结

1、宏定义函数声明     #define (name) void Func##name(void)
  • jizhouyou
  • jizhouyou
  • 2014年08月27日 19:37
  • 2023

C++模板高级用法

模板类A  有方法pop, 普通类B,有方法push,我把类B,作为一个类型传进类A, A.pop().push(), a.pop()返回的是a对象的引用,然后调用对象的方法a.pop()....
  • u011676589
  • u011676589
  • 2013年09月09日 17:28
  • 1048

一维数组的高级用法

今天在《数据结构(java篇)》中看到的一个数组的高级应用,想想当初看数组的时候居然没有想到数组能这么用;现在把代码给出来,由于没有书中提到的ConSoleReader,所以我把代码改了一下,用Sys...
  • AchillesA
  • AchillesA
  • 2004年11月15日 22:47
  • 1787

c++ new高级用法

new高级用法 #include #include const int buf(512);//限定一个常量整数512 int N(5);//数组的长度 char buffer[buf] = {0};...
  • e891377
  • e891377
  • 2016年06月29日 20:26
  • 402

Python 函数的高级用法

在 Python 中,函数的用法可谓是千变万化,只不过我们平日接触的大多是一些基本用法。函数强大之处当然不止于此,它还有很多高级用法 - 高阶函数、闭包、装饰器。。。 前面说过,Python 中的一...
  • u011012932
  • u011012932
  • 2017年06月16日 19:57
  • 2109

python的一些高级用法积累

for i,xx in emumerate(X)classes=['dog','cat','fish'] for i,cls in enumerate(classes): i=0,1,2 ...
  • Chunying27
  • Chunying27
  • 2016年12月07日 21:02
  • 1000

C/C++ 宏的高级使用1.0

单个# 引例1.#include#define P(x) printf("%s=%d\n",#x,x) int main(){ /* #x 的作用就是把x转成"x",转成字符串*/ ...
  • sUb_569
  • sUb_569
  • 2017年01月05日 22:45
  • 892

"||" 和 "&&"高级用法

例1:用于赋值 &&:从左往右依次判断,当当前值为true则继续,为false则返回此值(是返回未转换为布尔值时的原值哦) || : 从左往右依次判断,当当前值为false则继续,为true则返回...
  • qq379682421
  • qq379682421
  • 2017年11月20日 16:55
  • 75

搜索引擎 高级使用

百度高级搜索页面:https://www.baidu.com/gaoji/advanced.html 百度谷歌搜索引擎高级指令 搜索引擎除了搜索普通关键词外,还能使用一些特殊的搜索引擎高级...
  • freeking101
  • freeking101
  • 2017年04月02日 00:22
  • 2301
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Windows批处理的高级用法
举报原因:
原因补充:

(最多只允许输入30个字)