bat中的一些语法学习,用于MicroStation多人编译
Parameter Setting
1、系统参数
%SystemRoot% === C:(%windir% 同样)
%ProgramFiles% === C:Files
%USERPROFILE% === C:and
Settings(子目录有“桌面”,“开始菜单”,“收藏夹”等)
%APPDATA% === C:and SettingsData
%TEMP% === C:11~1(%TEM% 同样)
%APPDATA% === C:and SettingsData
%OS% === Windows_NT (系统)
%Path% === %SystemRoot%;%SystemRoot%;%SystemRoot%(原本的设置)
%HOMEDRIVE% === C: (系统盘)
%HOMEPATH% === and Settings :: 枚举当前的环境变量
#### 2、传递参数给批处理文件 ####
%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用
%1 到 %9 顺序表示。 ## Basic Command ##
#### 0、help ####
可以在console 输入 help /?查看 #### 1、echo ####
语法: echo [{on|off}] [message]
ECHO [ON | OFF] 打开回显或关闭回显功能。
ECHO 显示当前回显设置。
ECHO [message] 显示信息。
echo off
表示在此语句后所有运行的命令都不显示命令行本身;默认是on,on时会显示如:
C:>命令行。
在实际应用中我们会把这条命令和重定向符号( 也称为管道符号,一般用 >
>> ^ )结合来实现输入一些命令到特定格式的文件中。
#### 2、@* ####
表示不显示@后面的命令,(在入侵过程中自然不能让对方看到你使用的命令啦)
@ 与 echo off
相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。
Sample: @echo off
(此语句常用于开头,表示不显示所有的命令行信息,包括此句)
#### 3、Goto* ####
语法:goto label (label是参数,指定所要转向的批处理程序中的行。)
指定跳转到标签行,找到标签行后,程序将处理从下一行开始的命令。
label标签的名字可以随便起,但是最好是有意义的,字母前必须加个冒号“:”来表示这个字母是标签。
goto命令就是根据这个冒号来寻找下一步跳到到那里。经常与 if
配合使用,根据不同的条件来执行不同的命令组。
#### 4、Rem ####
rem 输出信息,可以用“::”代替 #### 5、Pause ####
挂起,使console运行结束后不退出
#### 6、Call ####
语法:
__call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]__
参数: [Drive:][Path] FileName
指定要调用的批处理程序的位置和名称。filename 参数必须具有 .bat
或 .cmd 扩展名。
调用另一个批处理程序,并且不终止父批处理程序。如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令。
call 命令接受用作调用目标的标签。如果在脚本或批处理文件外使用
Call,它将不会在命令行起作用。
Sample:call="%cd%\test2.bat" haha kkk aaa
(调用指定目录下的
test2.bat,且输入3个参数给他)
Sample:call test2.bat arg1 arg2
(调用同目录下的
test2.bat,且输入2个参数给他)
注:可以调用自身(死循环、递归)
#### 7、Start ####
用的不多,调用外部程序,所有的 DOS命令 和 命令行程序 都可以由 start命令
来调用。
入侵常用参数:
MIN 开始时窗口最小化
SEPARATE 在分开的空间内开始 16 位 Windows 程序
HIGH 在 HIGH 优先级类别开始应用程序
REALTIME 在 REALTIME 优先级类别开始应用程序
WAIT 启动应用程序并等候它结束
parameters 这些为传送到命令/程序的参数
Sample:start /MIN test2.bat arg1 arg2
(调用同目录下的
test2.bat,且输入2个参数给他,且本窗口最小化)
Sample:e:\"program files"\极品列车时刻表\jpskb.exe
(文件路径名有空格时)
#### 8、If ####
if 表示将判断是否符合规定的条件,从而决定执行不同的命令。有三种格式: 1.
if 语法: if [not] "参数" == "字符串" 待执行的命令
参数如果等于(not表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号)
Sample: if "%1" == "a" format a:
{`Sample: if {%1} == {} goto noparms `}
2. if exist 语法: if [not] exist [路径]文件名 待执行的命令
如果有指定的文件,则条件成立,运行命令,否则运行下一句。
Sample: if exist config.sys edit config.sys
(表示如果存在这文件,则编辑它,用很难看的系统编辑器)
Sample: if exist config.sys type config.sys
(表示如果存在这文件,则显示它的内容)
3. if errorlevel number 语法: if [not] errorlevel <数字>
待执行的命令
如果程序返回值等于指定的数字,则条件成立,运行命令,否则运行下一句。(返回值必须按照从大到小的顺序排列)
Sample: 1
2
3
4
5@echo off
XCOPY F:\test.bat D:\
IF ERRORLEVEL 1 (ECHO 文件拷贝失败)
Else IF ERRORLEVEL 0 ECHO 成功拷贝文件
pause
常见的返回码为0、1。通过if
errorlevel命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令。
+ 4) else 语法: if 条件 (成立时执行的命令) else
(不成立时执行的命令)
如果是多个条件,建议适当使用括号把各条件包起来,以免出错。
Sample: if 1 == 0 ( echo comment1 ) else if 1==0 ( echo comment2 ) else
(echo comment3 )
注:如果 else 的语句需要换行,if 执行的行尾需用“^”连接,并且 if
执行的动作需用(括起来),否则报错
Sample: if 1 == 0 ( echo comment1 ) else if 1==0 ( echo comment2 ) ^
else (echo comment3 ) + 5) 比较运算符: 1
2
3
4
5
6
7
8EQU - 等于 (一般使用“==”)
NEQ - 不等于 (没有 “!=”,改用“ if not 1==1 ”的写法)
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
if /i {%1}=={} (set _BUILDARGS=+a) else (set _BUILDARGS=+avilC)
rem /i 表示启动IF命令扩展,使得IF可以支持多种运算操作:{%1}=={}如果第一个参数为空,就设置buildargs为+a 就是bmake后面跟的参数,否则就设置为其他的
choice
使用此命令可以让用户输入一个字符(用于选择),从而根据用户的选择返回不同的
errorlevel,然后配合 if errorlevel 选择运行不同的命令。
注意:choice命令为DOS或者Windows系统提供的外部命令,不同版本的choice命令语法会稍有不同,请用choice
/?查看用法。
使用时应该加/c:参数,c:后应写提示可输入的字符,之间无空格。它的返回码为1234
Sample: choice /c:dme defrag,mem,end
将显示: defrag,mem,end[D,M,E]?
Sample:
1
2
3
4choice /c:dme defrag,mem,end
if errorlevel 3 goto defrag (应先判断数值最高的错误码)
if errorlevel 2 goto mem
if errotlevel 1 goto end
for
对一组文件中的每一个文件执行某个特定命令。主要用于参数在指定的范围内循环执行命令。
+ 1)for {%variable | %%variable} in (set) do command
[command-parameters]
%variable
指定一个单一字母可替换的参数。变量名称是区分大小写的,所以 %i 不同于
%I
在批处理文件中使用 FOR 命令时,指定变量建议用 __%%variable__而不要用
%variable。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters
为特定命令指定参数或命令行开关。
+ 2)如果命令扩展名被启用,下列额外的 FOR
命令格式会受到支持:
+ a. FOR /D %variable IN (set) DO command [command-parameters]
如果集里面包含通配符,则指定与目录名匹配,而不与文件名匹配。
+ b. FOR /R [[drive:]path] %variable IN (set) DO command
[command-parameters]
检查以 [drive:]path 为根的目录树,指向每个目录中的FOR 语句。 如果在 /R
后没有指定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。
+ c. FOR /L %variable IN (start,step,end) DO command
[command-parameters]
该集表示以增量形式从开始到结束的一个数字序列。 如:(1,1,5) 将产生序列 1
2 3 4 5; 而(5,-1,1) 将产生序列 (5 4 3 2 1)。 + d. 有或者没有 usebackq
选项:
FOR /F ["options"] %variable IN (file-set) DO command
FOR /F ["options"] %variable IN ("string") DO command
FOR /F ["options"] %variable IN (command) DO command
参数"options"为:
fileset 为一个或多个文件名。继续到 fileset
中的下一个文件之前,每份文件都被打开、读取并经过处理。处理包括读取文件,将其分成一行行的文字,
然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For
循环。以默认方式,/F
通过每个文件的每一行中分开的第一个空白符号。跳过空白行。
你可通过指定可选 "options"
参数替代默认解析操作。这个带引号的字符串包括一个或多个指定不同解析选项的关键字。
这些关键字为:
1
2
3
4
5
6
7
8eol=c - 指一个行注释字符的结尾(就一个字符),(如“;”)
skip=n - 指在文件开始时忽略的行数。
delims=xxx - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的分配。
m-n格式为一个范围。通过 nth 符号指定 mth。
如果符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。
usebackq - 指定新语法已在下类情况中使用:
在作为命令执行一个后引号的字符串并且一个单引号字符为文字字符串命令并允许在 filenameset中使用双引号扩起文件名称。
+ a. 如下命令行会显示当前目录下所有以bat或者txt为扩展名的文件名。
for %%c in (.bat .txt) do (echo %%c)
+ b. 如下命令行会显示当前目录下所有包含有 e 或者 i 的目录名。
for /D %%a in (e i) do echo %%a
+ c. 如下命令行会显示 E盘test目录
下所有以bat或者txt为扩展名的文件名。
for /R E:%%b in (.txt .bat) do echo %%b
for /r %%c in (*) do (echo %%c) :: 遍历当前目录下所有文件
+ d. 如下命令行将产生序列 1 2 3 4 5
for /L %%c in (1,1,5) do echo %%c
+ e. 以下两句,显示当前的年月日和时间
For /f "tokens=1-3 delims=-/. " %%j In ('Date /T') do echo
%%j年%%k月%%l日
For /f "tokens=1,2 delims=: " %%j In ('TIME /T') do echo
%%j时%%k分
+ f. 把记事本中的内容每一行前面去掉8个字符
setlocal enabledelayedexpansion
for /f %%i in (zhidian.txt) do (
set atmp=%%i set atmp=!atmp:~8! if {!atmp!}=={} ( echo.) else echo
!atmp! ) :: 读取记事本里的内容(使用 delims
是为了把一行显示全,否则会以空格为分隔符) for /f "delims=" %%a in
(zhidian.txt) do echo.%%a + g.
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
该行会分析 myfile.txt
中的每一行,忽略以分号打头的那些行,将每行中的第二个和第三个符号传递给
for 函数体,用逗号和/或 空格分隔符号。请注意,此 for 函数体的语句引用 %i
来获得第二个符号,引用 %j 来获得第三个符号,引用
%k来获得第三个符号后的所有剩余符号。对于带有空格的文件名,你需要用双引号将文件名括起来。为了用这种方式来使用双引号,还需要使用
usebackq 选项,否则,双引号会被理解成是用作定义某个要分析的字符串的。
%i 在 for 语句中显式声明,%j 和 %k 是通过tokens=
选项隐式声明的。 可以通过 tokens= 一行指定最多 26
个符号,只要不试图声明一个高于字母 "z" 或"Z" 的变量。请记住,FOR
变量是单一字母、分大小写和全局的变量;而且,不能同时使用超过 52 个。数字>
还可以在相邻字符串上使用 FOR /F 分析逻辑,方法是,用单引号将括号之间的 file-set 括起来。这样,该字符串会被当作一个文件中的一个单一输入行进行解析。
最后,可以用 FOR /F 命令来分析命令的输出。方法是,将括号之间的
file-set 变成一个反括字符串。该字符串会被当作命令行,传递到一个子
CMD.EXE,其输出会被捕获到内存中,并被当作文件分析。如以下例子所示:
FOR /F "usebackq delims==" %i IN (
set) DO @echo %i
会枚举当前环境中的环境变量名称。 + 4)continue 和
break
利用 goto 实现程序中常用的 continue 和 break 命令, 其实非常简单
continue: 在 for 循环的最后一行写上一个标签,跳转到这位置即可 break: 在
for 循环的外面的下一句写上一个标签,跳转到这位置即可 > Sample:
1
2
3
4
5
6
7
8for /F ["options"] %variable IN (command) DO (
... do command ...
if ... goto continue
if ... goto break
... do command ...
:continue
)
:break
> /D 参数只能显示当前目录下的目录名字
@echo off
for /d %%i in (window?) do @echo %%i
pause
> /R 递归进入根目录树[Drive:]Path,在树的每个目录中执行for
语句。如果在 /R 后没有指定目录,则认为是 当前目录。如果 Set 只是一个句点
(.),则只枚举目录树。
系统帮助的格式:
FOR /R[[drive:]path] %%variable IN (set) DO command
for /r %%i in (.exe) do @echo %%i
列出所有exe的名字
for /r c: %%i in (.exe) do @echo %%i
列出c盘的exe名字
对于FOR /F %%i IN (file) DO command
file为文件名,按照官方的说法是,for会依次将file中的文件打开,并且在进行到下一个文件之前将每个文件读取到内存,
按照每一行分成一个一个的元素,忽略空白的行,看个例子。
> for/f "delims= " %%i in (a.txt) do echo %%i
输出a.txt文件中的每一行,用空格隔开? #### 11、Ping ####
测试网络联接状况以及信息包发送和接收状况。但是不能够测试端口。
语法:ping IP地址或主机名 [-t] [-a] [-n count] [-l size]
参数含义:
-t 不停地向目标主机发送数据;
-a 以IP地址格式来显示目标主机的网络地址;
-n count 指定要Ping多少次,具体次数由count来指定;
-l size 指定发送到目标主机的数据包的大小。
Sample: ping 192.168.0.1 -t (不停的测试192.168.0.1,按ctrl+c停止)
Sample: for /L %%a in (0,1,255) do ping 192.168.0.%%a -n 1 >>
tmp.txt (ping一下所有的局域网电脑)
#### 12、Telnet ####
测试端口使用 telnet IP地址或主机名 端口,使用tcp协议的
Sample: telnet 192.168.0.1 80 (测试192.168.0.1的80端口) ####
13、Color ####
color [attr]
颜色属性由两个十六进制数字指定 --
第一个对应于背景,第二个对应于前景。每个数字 可以为以下任何值:
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 浅绿色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
如果没有给定任何参数,此命令会将颜色还原到 CMD.EXE
启动时的颜色。这个值来自当前控制台 窗口、/T 命令行开关或 DefaultColor
注册表值。 如果尝试使用相同的前景和背景颜色来执行rem COLOR 命令,COLOR
命令会将 ERRORLEVEL 设置为 1。
只有一个参数时,设置字体。只有一个字母时默认时设置字体的颜色
#### 14、Exit ####
exit退出
#### 15、ShutDown ####
shutdown -s +秒数(xx秒之后自动关闭)
#### 16、Dir ####
显示目录中的文件和子目录列表。
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
46DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]
[/O[[:]sortorder]] [/P] [/Q] [/R] [/S] [/T[[:]timefield]] [/W] [/X] [/4]
[drive:][path][filename]
指定要列出的驱动器、目录和/或文件。
/A 显示具有指定属性的文件。
属性 D 目录 R 只读文件
H 隐藏文件 A 准备存档的文件
S 系统文件 I 无内容索引文件
L 解析点 - 表示“否”的前缀
/B 使用空格式(没有标题信息或摘要)。
/C 在文件大小中显示千位数分隔符。这是默认值。用 /-C 来禁用分隔符显示。
/D 跟宽式相同,但文件是按栏分类列出的。
/L 用小写。
/N 新的长列表格式,其中文件名在最右边。
/O 用分类顺序列出文件。
排列顺序 N 按名称(字母顺序) S 按大小(从小到大)
E 按扩展名(字母顺序) D 按日期/时间(从先到后)
G 组目录优先 - 反转顺序的前缀
/P 在每个信息屏幕后暂停。
/Q 显示文件所有者。
/R 显示文件的备用数据流。
/S 显示指定目录和所有子目录中的文件。
/T 控制显示或用来分类的时间字符域。
时间段 C 创建时间
A 上次访问时间
W 上次写入的时间
/W 用宽列表格式。
/X 显示为非 8.3 文件名产生的短名称。格式是 /N 的格式,
短名称插在长名称前面。如果没有短名称,在其位置则
显示空白。
/4 用四位数字显示年
可以在 DIRCMD 环境变量中预先设定开关。通过添加前缀 - (破折号)
来替代预先设定的开关。例如,/-W。
上面是CMD命令自带的说明文件。
dir /d 只显示当前目录下的文件名称
dir /od 按文件修改时间排序,递增;
dir /o-d 按文件修改时间排序,递减
dir /od/tc 按文件创建时间排序,递增
dir /o-d/tc 按文件创建时间排序,递减
dir/on 按文件名排序对应,递增
dir/o-n 按文件名排序对应,递减
dir/oe 按扩展名排序对应,递增
dir/o-e 按文件名排序对应,递减
dir /s /b >a.txt 打印文件夹下的所有文件
应该是最经典的用法了。
命令的结果可以通过“%>”的形式来定向输出,%表示文件描述符:1为标准输出stdout、2为标准错误stderr。系统默认%值是1,也就是“1>”,而1>可以简写为>,也就是默认为>。
stdout的默认目标是终端,stderr的默认目标为也是终端。我们在批处理中执行:
echo text >result.txt ,我们就可以在屏幕上会看到 echo text
1>result.txt ,即是这个道理。 其中&需要直接与重定向符号结合使用。
应用实例:
1、将结果输出到result.txt
net stop myservices >>result 2>&1
2、隐藏程序输出结果
net stop myservices >nul 2>nul
微软关于重定向的文章:使用命令重定向操作符
可以使用重定向操作符将命令输入和输出数据流从默认位置重定向到其他位置。输入或输出数据流的位置称为句柄。
下面列出可用的句柄。 句柄 句柄的数字代号 描述 1
2
3
4STDIN 0 键盘输入
STDOUT 1 输出到命令提示符窗口
STDERR 2 错误输出到命令提示符窗口
UNDEFINED 3-9 句柄由应用程序单独定义,它们是各个工具特有的
例如,下面的命令可以将句柄 2(即 STDERR)重定向到句柄 1(即 STDOUT):
2>&1
下表列出了可用于重定向输入和输出数据流的操作符。
1
2
3
4
5
6
7
8重定向操作符 描述
> 将命令输出写入到文件或设备(如打印机),而不是命令提示符窗口或句柄。
< 从文件而不是从键盘或句柄读入命令输入。
>> 将命令输出添加到文件末尾而不删除文件中已有的信息。
>& 将一个句柄的输出写入到另一个句柄的输入中。
<& 从一个句柄读取输入并将其写入到另一个句柄输出中。
| 从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。
默认情况下,可以从键盘将命令输入(即 STDIN 句柄)发送到 Cmd.exe,然后由 Cmd.exe 将命令输出(即 STDOUT 句柄)发送到命令提示符窗口。
+ 1.__&
Usage:第一条命令 & 第二条命令 [& 第三条命令...]
用这种方法可以同时执行多条命令,而不管命令是否执行成功
Sample:
1
2
3
4
5
6
7
8
9C:\\>dir z: & dir c:\\Ex4rch
The system cannot find the path specified.
Volume in drive C has no label.
Volume Serial Number is 0078-59FB
Directory of c:\\Ex4rc
2002-05-14 23:51 <DIR> .
2002-05-14 23:51 <DIR> ..
2002-05-14 23:51 14 sometips.gif
Usage:第一条命令 && 第二条命令[&& 第三条命令...]
用这种方法可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16Sample:
C:\\>dir z: && dir c:\\Ex4rch
The system cannot find the path specified.
C:\\>dir c:\\Ex4rch && dir z:
Volume in drive C has no label.
Volume Serial Number is 0078-59FB
Directory of c:\\Ex4rch
2002-05-14 23:55 <DIR> .
2002-05-14 23:55 <DIR> ..
2002-05-14 23:55 14 sometips.gif
1 File(s) 14 bytes
2 Dir(s) 768,671,744 bytes free
The system cannot find the path specified.
如果远程服务器上存在backup.mdb文件,就执行copy命令,若不存在该文件则不执行copy命令。这种用法可以替换IF
exist了 :)
+ 3.||__
Usage:第一条命令 || 第二条命令 [|| 第三条命令...]
用这种方法可以同时执行多条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令;
1
2
3
4
5
6
7
8
9
10Sample:
C:\\Ex4rch>dir sometips.gif || del sometips.gif
Volume in drive C has no label.
Volume Serial Number is 0078-59FB
Directory of C:\\Ex4rch
2002-05-14 23:55 14 sometips.gif
1 File(s) 14 bytes
0 Dir(s) 768,696,320 bytes free
+ 4.__管道命令的使用 + 1. | 命令
Usage:第一条命令 | 第二条命令 [| 第三条命令...]
将第一条命令的结果作为第二条命令的参数来使用,记得在unix中这种方式很常见。
sample: time /t>>D:\IP.log netstat -n -p tcp|find
":3389">>D:\IP.log start Explore
看出来了么?用于终端服务允许我们为用户自定义起始的程序,来实现让用户运行下面这个bat,以获得登录用户的IP。
+ 2. >、>>输出重定向命令
将一条命令或某个程序输出结果的重定向到特定文件中, > 与
>>的区别在于,>会清除调原有文件中的内容后写入指定文件,而>>只会追加内容到指定文件中,而不会改动其中的内容。
sample1:
echo hello world>c:\hello.txt (stupid example?)
sample2:
时下DLL木马盛行,我们知道system32是个捉迷藏的好地方,许多木马都削尖了脑袋往那里钻,DLL马也不例外,针对这一点我们可以在安装好系统和必要的应用程序后,对该目录下的EXE和DLL文件作一个记录:
运行CMD--转换目录到system32--dir.exe>exeback.txt & dir
.dll>dllback.txt,
这样所有的EXE和DLL文件的名称都被分别记录到exeback.txt和dllback.txt中,
日后如发现异常但用传统的方法查不出问题时,则要考虑是不是系统中已经潜入DLL木马了.
这时我们用同样的命令将system32下的EXE和DLL文件记录到另外的exeback1.txt和dllback1.txt中,然后运行:
CMD--fc exeback.txt exeback1.txt>diff.txt & fc dllback.txt
dllback1.txt>diff.txt.
(用FC命令比较前后两次的DLL和EXE文件,并将结果输入到diff.txt中
),这样我们就能发现一些多出来的DLL和EXE文件,
然后通过查看创建时间、版本、是否经过压缩等就能够比较容易地判断出是不是已经被DLL木马光顾了。
没有是最好,如果有的话也不要直接DEL掉,先用 regsvr32 /u
trojan.dll
将后门DLL文件注销掉,再把它移到回收站里,若系统没有异常反映再将之彻底删除或者提交给杀毒软件公司。
+ 3. < 、>& 、<&
"<" 从文件中而不是从键盘中读入命令输入。
">&" 将一个句柄的输出写入到另一个句柄的输入中。
"<&" 从一个句柄读取输入并将其写入到另一个句柄输出中。
这些并不常用,也就不多做介绍
## 字符串处理 ##
+ 1) 分割字符串,以查看时间为例
%源字符串:~起始值,截取长度%
(起始值从0开始;截取长度是可选的,如果省略逗号和截取长度,将会从起始值截取到结尾;
截取长度如果是负数,表示截取到倒数第几个。)__
1
2
3
4
5
6"%time%" 显示如:"11:04:23.03" (完整的时间"hh:mm:ss.tt")
"%time:~0,5%" 显示"hh:mm"(即"11:04"),其中0表示从右向左移位操作的个数,5表示从左向右移位操作的个数
"%time:~0,8%" 显示标准时间格式"hh:mm:ss"(即"11:04:23",前8个字符串)
"%time:~3,-3%"显示"mm:ss"(即从第4个开始,截去最后3个的字符串)
"%time:~3%" 显示"04:23.03"(即去掉前4个字符串)
"%time:~-3%" 显示".tt"(即最后3个字符串)
1
2
3
4set a="abcd1234"
echo %a% 显示:"abcd1234"
set a=%a:1=kk% 替换“1”为“kk”
echo %a% 显示:"abcdkk234"
由于没有直接的字符串合并函数,只能用笨方法了。 set str1=%str1%%str2%
(合并 str1 和 str2) + 4) 计算字符串长度
没有现成的函数。如下程序利用
goto形成循环,不断将字符串截短1,并记录截短的次数,到字符串变成空时的次数即长度。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17set testStr=This is a test string
:: 将 testStr 复制到str,str 是个临时字符串
set str=%testStr%
:: 标签,用于goto跳转
:next1
:: 判断str是不是空,如果不是则执行下边的语句
if not "%str%"=="" (
:: 算术运算,使num的值自增1,相当于num++或者++num语句
set /a num+=1
:: 截取字符串,每次截短1
set "str=%str:~1%"
:: 跳转到next1标签: 这里利用goto和标签,构成循环结构
goto next1
)
:: 当以上循环结构执行完毕时,会执行下边的语句
echo testStr=%testStr%
echo testStr的长度为:%num%
直接 echo %args:~%num%,-5%
没办法想要的字符串,(这里没懂)需要如下两步 setlocal
enabledelayedexpansion
echo !args:~%num%,-5!
## Registration Table Command Omit ## see more detials at here中的第六条
## More Tips ##
+ ">>"追加, “>”在文件中末尾添加
+ 创建文件夹
md d: mkdir d: + 在命令末尾加上“>NUL
2>NUL”,表示隐蔽返回信息。
+ 清屏
cls + 打开文件浏览器 start explorer.exe /e,
/select,%_LOGFILE%(%_LOGFILE%指代文件路径+后缀) +
修改文件的后缀名
ren C:*.jpg .JPG
for /r %%c in (.jpg) do (ren %%c .JPG) ::
修改当前目录下的所有文件的后缀名,包括子目录的
+ 修改文件的文件名
rename test.jpg test2.JPG
rename .jpg .888.JPG
+ 获取当前路径
cd ./
set CURE_PATH=%cd%
+ 打开某网站 start Chrome.exe www.baidu.com*
+ show the current dir's name (for的用法)
@echo off
for /d %%i in (???) do @echo %%i
pause
这样的话如果你当前目录下有目录名字只有1-3个字母的,就会显示出来,没有就不显示了。
+ del
del /f /q "%_LOGFILE%"
将logfile变量对应的文件强制删掉,且无需提示 /f 是强制删除所有属性的文件
/q是无需确认直接删除要是再加上/s开关,就可以删除子文件加中的文件 +
choice
choice
使用此命令可以让用户输入一个字符,从而运行不同的命令。使用时应该加/c:参数,c:后应写提示可输入的字符,之间无空格。它的返回码为1234
如: choice /c:dme defrag,mem,end
将显示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16defrag,mem,end[D,M,E]?
Sample:
Sample.bat的内容如下:
@echo off
choice /c:dme defrag,mem,end
if errorlevel 3 goto defrag (应先判断数值最高的错误码)
if errorlevel 2 goto mem
if errotlevel 1 goto end
:defrag
c:\\dos\\defrag
goto end
:mem
mem
goto end
:end
echo good bye
+ call
批脚本里的 %* 指出所有的参数(如 %1 %2 %3 %4 %5 ...)
+ set
显示、设置或删除 cmd.exe 环境变量。
SET [variable=[string]]
variable 指定环境变量名。
string 指定要指派给变量的一系列字符串。
要显示当前环境变量,键入不带参数的 SET。
如果命令扩展被启用,SET 会如下改变:
可仅用一个变量激活 SET 命令,等号或值不显示所有前缀匹配
SET 命令已使用的名称的所有变量的值。例如:
SET P
会显示所有以字母 P 打头的变量
如果在当前环境中找不到该变量名称,SET 命令将把 ERRORLEVEL
设置成 1。
SET 命令不允许变量名含有等号。
在 SET 命令中添加了两个新命令行开关:
SET /A expression
SET /P variable=[promptString]
#### More and More Details ####
具体语法还需详查看bat语法格式,
markdown语法参见此。
另外,FOR 变量参照的替换已被增强。你现在可以使用下列 选项语法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14%~I - 删除任何引号("),扩展 %I
%~fI - 将 %I 扩展到一个完全合格的路径名
%~dI - 仅将 %I 扩展到一个驱动器号
%~pI - 仅将 %I 扩展到一个路径
%~nI - 仅将 %I 扩展到一个文件名
%~xI - 仅将 %I 扩展到一个文件扩展名
%~sI - 扩展的路径只含有短名
%~aI - 将 %I 扩展到文件的文件属性
%~tI - 将 %I 扩展到文件的日期/时间
%~zI - 将 %I 扩展到文件的大小
%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展
到找到的第一个完全合格的名称。如果环境变量名
未被定义,或者没有找到文件,此组合键会扩展到
空字符串1
2
3
4
5
6%~dpI - 仅将 %I 扩展到一个驱动器号和路径
%~nxI - 仅将 %I 扩展到一个文件名和扩展名
%~fsI - 仅将 %I 扩展到一个带有短名的完整路径名
%~dp$PATH:I - 搜索列在路径环境变量的目录,并将 %I 扩展
到找到的第一个驱动器号和路径。
%~ftzaI - 将 %I 扩展到类似输出线路的 DIR