关于MS-DOS下的批处理

关于MS-DOS下的批处理

Author Jeff   2006-03-10

关键字: MS-DOS 批处理

环境:Window XP Professional + SP2[版本5.1.2600]

 

(当我刚开始接触计算机的时候,DOS时代就已经一去不复返。那个时代的辉煌,那个时代程序员的激情,我已无缘再见,但是可以想象得出来,而绝不是充斥着一种功利,一种浮躁。

DOS的辉煌虽已隐去,但是毕竟留下了光彩的足迹。)

 

现在虽然是视窗时代,DOS离我们已越来越远。但是人是有惰性的,当有大量的重复的工作需要你不停地操作鼠标、键盘,是不是觉得很烦,很无聊?为了使效率更高,很多时候也图个方便,很多软件都提供了命令行方式,方便批量处理。(就我所知,flashget以前的版本好像没有提供命令行方式,现在的新版本就提供了,只是功能不是很强)

 

下面介绍DOS批处理中的一些常用命令:
1. echo
命令
打开回显功能或关闭请求回显功能,或显示消息。如果没有任何参数,echo 命令将显示当前回显设置。
语法 echo [{onoff}] [message]
注意:

1.当使用 echo 时,要显示管道 (|) 或重定向字符(< >),请在管线或重定向字符前面使用脱字符(例如,^>^< ^|)。如果需要使用脱字符 (^),请键入两个脱字符 (^^)

2.要避免回显某行,请在批处理程序中的命令前面插入 at 符号 (@)

3.要在屏幕上回显空白行,请键入: echo

4.屏幕上回显的,都可以重定向输出到文件中。


2. goto
命令
指定跳转到标签,找到标签后,程序将处理从下一行开始的命令。
语法:goto label label是参数,指定所要转向的批处理程序中的行。)

注意:

1.可以在label参数中使用空格,但不得使用其他分隔符(例如分号或等号)。goto 命令只使用标签的前八个字符。

2.   所指定的label 值必须与批处理程序中的标签匹配。批处理程序中的标签必须以冒号 (:) 开始。

 

3. rem 命令
注释命令,在C语言中相当与/*--------*/,它并不会被执行,只是起一个注释的作用。

语法:rem Message
注意:

1.在批处理文件注释中不能使用重定向字符“(”“)”或管线 (|)

2.与::效果相同,都可以注释文本。

 

4.pause 命令
暂停批处理程序的处理并显示消息,提示用户按任意键继续。


5.call
命令
从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call 命令接受用作调用目标的标签。如果在脚本或批处理文件外使用 call,它将不会在命令行起作用。
语法 call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]
参数 [Drive:}[Path] FileName
指定要调用的批处理程序的位置和名称。filename 参数必须具有 .bat .cmd 扩展名。

注意:不要在 call 命令中使用管道和重定向符号。

6. if
命令
if
表示将判断是否符合规定的条件,从而决定执行不同的命令。 有三种格式:
语法:if [not] errorlevel Number Command [else Expression]

if [not] String1==String2 Command [else Expression]

if [not] exist FileName Command [else Expression]

 

7.for 命令
对一组文件中的每个文件运行指定的命令。

语法:for {%Variable | %%Variable} in (Set) do Command [CommandLineOptions]
注意:

1.使用 %Variable 通过命令提示符执行 for 命令。使用 %%Variable 在批处理文件中执行 for 命令。

 

 

 

字符

语法

定义

& [...]

Command1 &Command2

用来分隔一个命令行中的多个命令。Cmd.exe 运行第一个命令,然后运行第二个命令。

&& [...]

Command1 &&Command2

只有在符号 && 前面的命令成功时,才运行该符号后面的命令。Cmd.exe 运行第一个命令,然后只有在第一个命令运行成功时才运行第二个命令。

|| [...]

Command1 || Command2

只有在符号 || 前面的命令失败时,才运行符号 || 后面的命令。Cmd.exe 运行第一个命令,然后只有在第一个命令未能运行成功(接收到大于零的错误代码)时才运行第二个命令。

( ) [...]

(Command1 & Command2)

用来分组或嵌套多个命令。

; 或者 ,

Command1 Parameter1;Parameter2

用来分隔命令参数。

 

 

 

上面常用的批处理命令的信息记录得不全,想了解更多、更详细的,可以

1.对command命令行下,键入help,回车,将显示所有的DOS内部命令列表。可以再针对各个内部命令,带参数/?执行,将显示命令的语法和具体使用事项。如键入:dir /?。一般对于每个命令解释都比较详尽,再有疑问就上网查查。

   几个包含重要信息的内部命令,建议仔细看看:

   想查询批参数的语法,执行这几个命令:call /?

还有一些有用的信息,可以通过执行命令if /?   cmd /?    for /?来获得。

2.外部命令总汇列表:http://www.computerhope.com/jargon/e/extecomm.htm

   内部命令总汇列表:http://www.computerhope.com/jargon/i/intecomm.htm

3.两个比较好的介绍DOS命令的网址:
 http://www.microsoft.com/technet/prodtechnol/windowsserver2003/zh-chs/library/ServerHelp/552ed70a-208d-48c4-8da8-2e27b530eac7.mspx

http://www.computerhope.com/msdos.htm

 

这个是为了满足某些特殊的需要,边学习批处理边完成的。实现的自动添加计划任务。

@rem   ***************Append new job **********************

@rem   * Author      : Jeff (2005-12-23)                                     *

@rem   * Return Value:                                                               *

@rem   *      0 ------ success                                                        *

@rem   *      5 ------ param error                                                *

@rem   *      6 ------ choice 'N'                                                    *

@rem   *      7 ------ "Task Scheduler" service forbidden       *

@rem   *      8 ------ Append job failure                                     *

@rem   *******************************************************

 

@cls

@if "%~3" == "" goto Usage

@set choice=

@net start | find /I "Task Scheduler" >nul

@if %errorlevel% == 0 goto Start

@echo ================ Note =================

@echo It will start service "Task Scheduler".

:Ask

@set /p choice=Are you sure to start(Y/N)?

@if "%choice%"=="" goto Ask

@set choice=%choice:~0,1%

@if /I "%choice%"=="N" goto Quit

@if /I not "%choice%"=="Y" goto Ask

 

@net start  "Task Scheduler" 2>nul

@if not %errorlevel% == 0 goto Service

 

:Start

@at %2 /interactive /every:%1 %3

@if not %errorlevel% == 0 @exit /b 8

@exit /b 0

 

:Service

@echo ** Please start "Task Scheduler" first. Or set startup mode=auto/manual!

@exit /b 7

:Usage

@echo **** Usage: Scheduler [time] [date] [command].

@echo **** Need all parameters.

@exit /b 5

:Quit

@exit /b 6

 

@rem   ************************ End ***********************

开头是对代码的一点说明,包括作者,日期,返回值及对应的意义。(建议:最好每个批处理文件都有返回值。如果别人或者自己调用,可以根据不同的返回值在调用端作不同的处理。个人之见)

清屏并判断传入的参数个数是否正确。(现在找不到好的办法获得传入的参数个数,只好判断所需参数的最后一个是否为空) %~3是删除引号("),扩充 %3。(第3个参数包含文件路径,可以是带引号的字符串,也可以是不带引号的,有时候都被弄得糊里糊涂,实在有点头疼。找不到好办法)。 如果参数不正确,跳转到:Uage,打印出使用方法,退出,返回值为5

下面就是判断Task Scheduler是否打开,如果没有,询问是否打开。‘N’就退出,返回6。‘Y’就尝试打开Task Scheduler服务,如果打不开,提示手动启动服务,退出,返回值7。打开服务成功,就添加计划任务,添加失败,返回8;成功,返回0

 

 

下面的是支持可中途终止的拷贝文件的批处理。中途终止,计量单位为整个文件,不是通俗意义上的“断点续传”。主要用于拷贝大量的文件,中途死机、掉电、断网,均可以从上次接着拷贝。

@rem   *************** copy files(interrupt) **************

@rem   * Author      : Jeff (2005-12-26)                             *

@rem   * Return Value:                                                       *

@rem   *      0 ------ success                                                *

@rem   *      5 ------ param error                                         *

@rem   **************************************************

 

@echo off

if "%~2" == "" goto Usage

setlocal ENABLEEXTENSIONS

pushd %2

cls

set DistPath=%~2

if not "%DistPath:~-1%" == "/" set DistPath=%DistPath%/

set Disc=%DistPath%install.log

if not "%~3" == "" set Disc=%3

md %2 2>nul

echo ============ copy files at %date% %time% ============ >>%Disc%

echo ============= Start Copy File ====================

echo Please wait...

xcopy %1 %2 /e /c /R /Y /EXCLUDE:%Disc% >>%Disc%

if %errorlevel% == 0 (

   echo ============= Copy File Success! ==================

) else (

   echo ============= Copy File Failure! ==================

)

dir %DistPath%*.* /S /B /A:-D > %DistPath%uninstall.log

popd

endlocal

@echo on

@exit /b 0

 

:Usage

echo **** Usage: CopyFile [source] [destination] [log file].

echo **** Need all parameters but for the last one.

@echo on

@exit /b 5

 

@rem   ************************ End ***********************

 

在编写一些批处理文件时,总结了一些,也许日后用得着 :)

1 不显示正常的输出:dir *.txt > nul 或者dir *.txt 1 > nul

不显示错误提示:dir s.ss 2 > nul

既不显示正常输出也不显示错误提示:(不知道 :)

2 在批处理文件中将带%的变量或者参数写入另一个bat文件:

如:@echo %%1 > {a}.bat        {a}.bat文件内容为:%1

    @echo if not 0 == %%errorlevel%% rd /S /Q %%2 >> {b}.bat

            {b}.bat文件内容为:if not 0 == %errorlevel% rd /S /Q %2

3 “与”符号 (&)、管道(|) 以及括号 () 是特殊字符,将它们作为参数传递时,必须在其前面加上转义字符 (^) 或引号。例如:你希望通过批处理,生成一个bat文件,然后再调用它。这个bat文件就1条命令:@dir %1 > %2。写批处理命令时,应该写成:@echo @dir %%1 ^> %%2

4 命令type con > x.txt ,将输入到屏幕的内容输出到文件x.txt中,颇似edit x.txt

输入内容结束,按Ctrl + Z,回车,即可。

5choice命令从某些系统中取消了,取而代之的是set /p。如:set /p v = (Y/N)?

   使用时最好这样处理一下:@set v=%v:~0,1%

6.显示日期和时间:echo %date% %time%

7net start XXX启动服务。SC注册服务,注销服务。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值