MS-DOS批处理学习笔记
任何一个目录下均有 .、 ..这两个虚拟目录,其中 .指向当前目录, ..指向上级目录:
1 2 3 4 5 6 7 8 9 10 |
pushd D:\Programs\chrome rem 下面两条还是进入当前目录 cd D:\Programs\chrome\. cd Programs\chrome\.\.\. rem 进入上级目录 cd D:\Programs\chrome\.. rem 进入上级目录的上级目录 cd D:\Programs\chrome\..\.. |
符号 | 说明 | ||
@前缀 | 取消当前命令的回显 | ||
ECHO OFF | 禁用命令回显 | ||
SET | 显示、设置或删除环境变量
|
||
ECHO. | 显示空行 | ||
PUSHD | 压栈并切换到指定工作目录,例如PUSHD C:\TEMP | ||
POPD | 弹出并回到上一个工作目录 | ||
组合命令 | &:串联多个命令,依次执行 &&:只有前面命令成功了,后面命令才执行 ||:只有前面命令失败了,后面命令才执行 |
||
" " | 字符串界定符——允许在字符串中包含空格 | ||
^ |
转义字符,例如^G表示响铃 在行尾,表示下一行的内容与这一行作为单行看待 |
||
* | 通配0-N个字符 | ||
% | 批处理变量引导符。%VAR%引用环境变量,%n引用调用参数,%*表示所有调用参数 | ||
!VAR! | 变量延迟扩展符 | ||
? | 通配单个字符 | ||
COLOR | 设置背景前景色,使用一位数表示颜色。例如COLOR 47表示红色背景白色文字
0 = 黑色 1 = 蓝色 3 = 湖蓝色 B = 淡浅绿色 4 = 红色 C = 淡红色 5 = 紫色 |
||
TITLE | 设置窗口标题 | ||
FIND |
在文本中搜索字符串,命令格式:
/V 显示所有未包含指定字符串的行 |
||
ATTRIB | 显示或更改文件属性,命令格式:
+ 设置属性, - 清除属性 |
||
NUL | 空设备 1>nul 表示禁止输出一般信息(重定向标准输出到空设备) 2>nul 表示禁止输出错误信息(重定向标准错误到空设备) |
||
Ctrl+C | 按键中断批处理执行 | ||
Ctrl+S | 暂停或者恢复显示 | ||
~ | 扩展符号,对于变量%1,可以这样使用%~x1:取变量的扩展名。支持的扩展列表:
%~1 扩展 %1 并删除任何引号 ("") 获取bat所在目录的例子:
|
||
| | 管道符:将一个命令的输出作为另外一个命令的输入 | ||
> TARGET | 重定向输出
|
||
>> TARGET | 重定向输出,附加模式 | ||
< SOURCE | 重定向输入 | ||
REM | 注释,内容可以回显。::这样的注释则不会回显 | ||
PAUSE | 暂停执行,按任意键继续ECHO 定制的提示语 & pause > nul | ||
SHIFT | 参数移位,即第二个参数变为第一个,第一个移除,命令格式 SHIFT n ,其中 0<=n<=8 | ||
CALL | 在一个批处理程序中调用另外一个,执行完毕后返回CALL :label arguments,调用当前批处理文件内的命令段——:label开头,以命令goto :eof结尾的部分 | ||
START | 在新的命令行窗口中执行程序,命令格式:start ["title"] [/dPath] [/i] [/min] [/max] [{/separate | /shared}] [{/low | /normal | /htgh | /realtime | /abovenormal | belownormal}] [/wait] [/b] [FileName] [parameters]
title:指定在“命令提示符”窗口标题栏中显示的标题 |
变量 | 说明 |
%CD% | 扩展到当前目录字符串 |
%DATE% | 用跟 DATE 命令同样的格式扩展到当前日期 |
%TIME% | 用跟 TIME 命令同样的格式扩展到当前时间 |
%RANDOM% | 扩展到 0 和 32767 之间的任意十进制数字 |
%ERRORLEVEL% | 扩展到当前 ERRORLEVEL 数值 |
%CMDEXTVERSION% | 扩展到当前命令处理器扩展名版本号 |
%CMDCMDLINE% | 扩展到调用命令处理器的原始命令行 |
参数 | 说明 |
%0 | 批处理文件的名字 |
%1 - %9 | 第1-9个参数 |
%~nx0 | 批处理文件的名字,例如some-batch.bat |
%~dp0 | 批处理文件所在目录,例如C:\scripts |
%~dpnx0 | 批处理文件全限定名 |
setlocal命令可在批处理程序运行时设置自身的临时变量环境(仅对当前批处理程序有效),直到出现endlocal
1 2 |
#同时启用变量延迟扩展 setlocal enabledelayedexpansion |
set命令用于创建、设置或者删除环境变量,命令格式: set [[/a [expression]] [/p [variable=]] string]
参数说明:
-
/a:将string设置成可求值的数学表达式,expression:合法的表达式,表达式支持的运算符按优先级降序如下:
运算符 说明 () 分组 ! ~ - 一元运算符 * / % + - 算术运算符 << >> 移位 & ^ | 按位与非或 = *= /= %= += -=
&= ^= |= <<= >>=赋值 , 表达式分隔符 - /p:将variable的值设置成输入行,variable:指定需要设置或修改的变量
- string:指定要与指定变量关联的字符串
举例:
1 2 3 4 5 6 7 8 9 10 11 12 |
REM 设置VAR1为Hello SET VAR1=Hello REM 提示用户输入 SET /P variable=请输入值 REM 设置变量为表达式的值,下面为VAR1递增 SET /a VAR1=VAR1+1 REM 设置VAR1为"Hello" SET VAR1="Hello" REM 如果变量值包含命令关键字,可以使用双引号包围: SET "VAR1=&" REM 删除变量 SET VAR1= |
注意对环境变量进行条件测试的时候,不能带%%。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
REM 文件存在性测试(注意,不能用来测试环境变量) IF [NOT] EXIST FILENAME.EXT Command if not exist SERVICE_NAME set "SERVICE_NAME=%SERVICE_NAME_DEFAULT%" REM 如果有多行命令需要执行,可以用()包围: set /p VENDER_NAME= IF NOT Gmem=VENDER_NAME ( echo. ) REM 变量是否为空测试 IF DEFINED VAR_NAME (...) REM 字符串为空测试,这个用于stdin读入变量无效 IF [%1] == [] ECHO "Empty argument." REM 字符串相等性测试,加上双引号避免歧义 IF "%VAR_NAME%" == "1" ECHO . REM 注意,如果VAR_NAME来自标准输入,或者可能为空,要加上双引号,否则可能出现 REM was unexpected at this time(此时不应有)错误 REM 如果字符串可能有空格,可以使用双引号,例如 "AUTOEXE .BAT","%1"(第一个参数) IF [NOT] %1 == AUTOEXEC.BAT ECHO Parameter is AUTOEXEC.BAT REM 上一条命令返回值测试 REM 其中值为整数,只要大于等于该值,判断为真。0表示没有错误 IF [NOT] ERRORLEVEL 值 Command REM 比较字符串大小:op可以是:EQU、NEQ、LSS、LSQ、GTR、GEQ之一,/i表示忽略大小写 if [/i] stringl op string2 command [else expression] REM 如果变量被定义,则执行 if defined variable command [else expression] REM IF-ELSE结构 IF EXIST filename ( del filename ) ELSE ( echo filename missing ) |
1 2 3 4 |
GOTO LABEL :LABEL ECHO done |
- %variable|%%variable:代表可替换的参教:
使用%variable通过命令提示符执行for 命令,使用%%variable在批处理文件执行for命令 - set:指定要用命令处理的一个或多个文件、目录、数值范围或文本字符串
- command:指定要对包括在指定(set)中的每个文件、目录、数值范围或文本字符 串所执行的命令
- CommandLineOptions:命令使用的命令行选项
用途 | 语法格式 |
文件集合 | for %%variable in (fileSet) do statement |
目录集合 | for /D %%variable in (directorySet) do statement |
子目录中的文件 | for /R [path] %%variable in (fileSet) do statement |
遍历一系列的值 | for /L %%variable in (stepRange) do statement |
分析文本文件、字符串以及命令输出 | for /F ["options"] %%variable in (source) do statement |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
@echo off set /a sum=0 REM 遍历当前目录中的文本文件并打印其内容,多行命令需要用()包围 for %%x in (*. txt) do ( echo Printing content of file %%x type %%x echo. set /a sum=sum+1 REM 从0开始,步进2,到10结束 for /L %%B in (0 2, 10) do echo %%B REM 下面的语句首先会运行date /t命令,其输出为类似:“2001/01/01 周一”这样的形式 REM /F 表示以字符串方式处理命令输出、字符串或者文件内容 REM tokens用于定义for命令的变量个数,1-3表示第1、2、3个字符串并解析为变量 REM delims表示用于拆分字符串的分隔符,包括/、- REM set表示把拆分的字符串依次赋值给%%A %%B %%C三个变量(后面的变量名在前面的ASCII码加1) REM delims可以指定多个字符用于分隔 for /F "tokens=l-3 delims=/-" %%A in ('date /T') do set date=%%A%%B%%C rem 提取NT Service的PID的例子,注意sc queryex命令输出多行 rem 下面的for命令以行为单位进行处理,并提取第一列、第三列 rem skip可以用于跳过指定数量的行 for /F "tokens=1,3 skip=3" %%a in ('sc queryex Tomcat7') do ( echo %%a %%b ) rem usebackq允许在源指定符中使用引号;eol指定行尾结束字符,之后的内容被忽视 for /f "tokens=3-5 usebackq eol=#" %%C in ("user data.txt") do echo %%C rem 命令输出如下: rem SERVICE_NAME: rem TYPE 110 rem STATE 4 rem (STOPPABLE, ACCEPTS_SHUTDOWN) rem WIN32_EXIT_CODE 0 rem SERVICE_EXIT_CODE 0 rem CHECKPOINT 0x0 rem WAIT_HINT 0x0 rem PID 5812 rem FLAGS REM tokens更复杂的例子 REM tokens=x 表示只提取第x列。 REM tokens=x,y 表示只提取第x列和第y列。 REM tokens=m-n 表示提取第m列至第n列。 REM tokens=x* 表示提取第x列和后面所有字符串都作为第x+1列。 REM tokens=x,* 等同tokens=x* REM tokens=x,y,m-n 表示提取第x,y列以及第m至第n列。 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
@echo off REM 这样才能将循环变量%%a赋值给环境变量 setlocal enabledelayedexpansion title fuckbat REM 遍历命令结果的2、10列 for /f "delims=, tokens=2,10" %%a in ('tasklist /NH /V /FI "IMAGENAME eq cmd.exe" /FO CSV') do ( REM 将循环变量赋值 set task_title=title%%b set pid=%%a REM 脱去外部的双引号,用!!的界定符访问变量pid, pid:"= 表示将pid中的"替换为空 set pid=!pid:"=! REM 如果将标题中的fuckbat替换为空后得到的值与之前不等,说明标题中有fuckbat,说明当前迭代的时当前进程 if not "!task_title!"=="!task_title:fuckbat=!" ( echo !pid! > pid.txt ) ) endlocal |
语法格式:%a:搜索字符串=替换字符串%,举例:
1 2 3 |
set domain=www.gmem. cc REM 替换空格为空串,结果:www.gmem.cc set var=%domain: =% |
语法格式:%a:~[m[,n]]%
a为变量名,m为偏移量(缺省为0),n为截取长度(缺省为全部)
考虑下面的例子:
1 2 3 4 5 6 7 8 9 10 |
@echo off set a=1 set a=2 & echo %a% REM 输出为1 REM 启用变量延迟 setlocal enabledelayedexpansion set a=1 set a=2 & echo !a! REM 输出为2 |
上半部分输出不是2的原因:
- 批处理读取命令时是按行读取的(另外例如for命令等,其后用一对圆括号闭合的所有语句也当作一行)
- 为了能够感知环境变量的动态变化,批处理设计了变量延迟——在读取了一条完整的语句之后,不立即对该行的变量赋值,而会在某个单条语句执行之前再进行赋值
1 2 3 4 5 6 7 |
@echo off Setlocal EnableDelayedExpansion set "VAR=<" rem 输出:< echo !VAR! set "VAR1=value" echo %VAR1% |
1 |
java -jar .jar |
创建VB脚本并调用:
1 |
createobject("wscript.shell").run "batch.bat arg1 arg2..." , 0 |
Leave a Reply