批处理 bat 常用命令【学习笔记一】

1、rem 命令:REM [comment]

单行注释命令,可参考批处理 bat 学习之 hello world

2、@ 命令

不知道这算不算命令,但是它可以禁止输出显示当前执行的命令语句

rem @命令,主要用途是禁止输出显示当前执行的命令语句
@rem 例如这个呢

运行结果:
批处理 bat 常用命令【学习笔记一】_第1张图片

3. echo 命令:ECHO [ON | OFF] 或者 ECHO [message]

显示消息,或将命令回显打开或关闭
后面可以带两个可选参数:echo [{on | off}] [message]

echo
rem 如果什么都参数都不跟,会输出 ECHO 处于打开状态。

echo on
rem 这一句也会输出,前提是是这里后面还有行,即使是空行

echo off
rem 这一句估计出不来,
rem 可以发现,直到遇到 echo off(这时候 echo off 这一句也会输出来),
rem 所以 echo off 这句命令对其本身是不起作用的,所有的执行语句和结果都会输出来

echo hello world 这是最常用的方法,输出字符串

运行结果:
批处理 bat 常用命令【学习笔记一】_第2张图片

4、type 命令:TYPE [drive:][path]filename

显示文本文件的所有内容,[drive:][path] 这两个是可选参数 ,也就是说写不写都行,drive 表示C、D、E 等盘符,path 表示文件路径,不写的话会在和当前执行的 bat 文件同目录下面找

type [email protected]

运行结果:
批处理 bat 常用命令【学习笔记一】_第3张图片

5、pause 命令:

暂停批处理程序,并显示: “请按任意键继续. . .”,起到程序挂起的作用,当按下任意键的时候程序继续往下执行

echo hello world
pause
echo hello 黄小天

运行结果:
批处理 bat 常用命令【学习笔记一】_第4张图片

6、标号 “:”

起到标记位置的作用,同一行的语句不会被执行(即使 echo on 也不会输出),可以这个用来当作注释,也可以当作是函数的开头,常常与 call 命令或者 goto 命令配套使用,也可以利用这个来构造循环

如果是 call 命令调用,程序会跳到被调用的标号出开始往下执行、当执行到终点的时候会回到调用该标号的地方继续往下执行
如果是 goto 命令调用,则直接跳到标号出一直往下执行,绝情地永不回头

例如 call 命令调用:

@echo off
call :printf

:printf 
echo hello world

输出结果:

E:\workspaceForBat>6.mark.bat
hello world
hello world
E:\workspaceForBat>
7、call 命令

有 CALL:label arguments 和 CALL [drive:][path]filename [batch-parameters]
两种用法,第一种就是上面第 6 点的用法,
第二种用法就是调用其他 bat 文件,例如:

@echo off
echo 正在调用 3.type.bat
call 3.type.bat
echo 3.type.bat 调用完毕

输出结果:

E:\workspaceForBat>5.call.bat
正在调用 3.type.bat
rem @命令,主要用途是禁止输出显示当前执行的命令语句
@rem 例如这个呢
3.type.bat 调用完毕
E:\workspaceForBat>

后面的 arguments 和 batch-parameters 是要传递的参数,先不解释,我还不会,往下应该有,
call 命令的特别之处在于调用完标号处的命令或者批处理文件后会从当前行继续往下执行

8、set 命令

用法 1:直接执行 set 命令不带任何参数,会查询到当前系统的环境变量,如下
批处理 bat 常用命令【学习笔记一】_第5张图片

用法 2:SET j 显示以指定的值的开头的环境变量,例如:

E:\workspaceForBat>set j
JAVA_HOME=G:\Java\jdk1.8.0_181

用法 3:SET [variable=[string]] 会在当前系统环境变量中设置一个值,但是用用法 1 的操作在环境变量中是看不到的,这个值是临时的,当该 bat 文件执行完毕或者 cmd 窗口退出,或者 set variable=,则该变量会被销毁

E:\workspaceForBat>set var=hello world

E:\workspaceForBat>echo %var%
hello world

E:\workspaceForBat>set var=

E:\workspaceForBat>echo %var%
%var%

用法 4:SET /A expression
指定 expression 里面的表达式等号右边的值是一个数字,如果遇到非数字则默认为 0

E:\workspaceForBat>set /a var=hello
0
E:\workspaceForBat>echo %var%
0

E:\workspaceForBat>set /a var=122
122
E:\workspaceForBat>echo %var%
122

用法 5:SET /P variable=[promptString]
promptString 是提示语的意思,也就是在这行上面的命令后,会显示出提示语,让用户输入一个值来为 variable 赋值

E:\workspaceForBat>set /p var=这是提示语,请输入 var 变量的值:
这是提示语,请输入 var 变量的值: hello world

E:\workspaceForBat>echo %var%
hello world

9、goto 命令:GOTO label

和 call 命令类似,但是和 call 命令的不同之处在于 goto 命令是跳转,跳转到标号处后会一直往下执行

@echo off

rem 跳转到 :printf 这个标号之后开始执行
goto :printf

echo hello

:printf
echo world

rem :eof 是个特殊标号,goto :eof 表示跳转到当前批脚本文件的结尾
goto :eof

echo hello

输出结果:

E:\workspaceForBat>9.goto.bat
world
10、start 命令:

START
[“title”] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
[/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
[/NODE ] [/AFFINITY ] [/WAIT] [/B] [command/program] [parameters]

可选参数非常多,但归根到底都是 “start” 这个命令的参数,都是用于 “启动” 、“执行”、“运行” 这一类的操作
下面是文档里面的解释:

参数名 解释
“title” 在新窗口标题栏中显示的标题
path 启动一个程序时程序的启动目录
I 新的环境将是传递给 cmd.exe 的原始环境,而不是当前环境,意思其实就是加了 /i 这个参数打开新的命令行窗口时,在原来命令行窗口 set 进去的环境变量在这个窗口就取不到值了,相当于打开一个全新的窗口
MIN 以最小化方式启动窗口
MAX 以最大化方式启动窗口
SEPARATE 在单独的内存空间中启动 16 位 Windows 程序,现在的 64 位机器不管用了
SHARED 在共享内存空间中启动 16 位 Windows 程序,现在的 64 位机器不管用了
LOW 在 IDLE 优先级类中启动应用程序
NORMAL 在 NORMAL 优先级类中启动应用程序
HIGH 在 HIGH 优先级类中启动应用程序
REALTIME 在 REALTIME 优先级类中启动应用程序
ABOVENORMAL 在 ABOVENORMAL 优先级类中启动应用程序
BELOWNORMAL 在 BELOWNORMAL 优先级类中启动应用程序
上面优先级的解释 上面各种优先级代表用 start 命令运行某个程序时,该命令在系统资源分配的优先级,优先级越高,系统越优先执行,大概是越快相应,只有 cpu 或内存等有富余的情况下再回分配给优先级低的程序
NODE 将首选非一致性内存结构(NUMA)节点指定为十进制整数。意思是在NUMA 架构的系统中,用这个参数可以为要用 start 命令启动的程序指定一块内存空间,这个内存空间就是这个十进制数,该十进制数只是当做标号使用,类似房间号,当启动多个程序的时候,指定的内存空间一样的话,这些程序就可以共享内存了,从而提高数据传递效率
AFFINITY 将处理器关联掩码指定为十六进制数字,进程被限制在这些处理器上运行,该参数的测试请看下面图片
WAIT 启动应用程序并等待它终止,意思是当前窗口用 start 命令打开一个新窗口,并一直等待新窗口关闭,当前窗口才继续往下执行,否则会是一直挂起状态
B 启动应用程序,但不创建新窗口
command/program 如果它是内部 cmd 命令或批文件,则该命令处理器是使用 cmd.exe 的 /K 开关运行的。这表示运行该命令之后,该窗口将仍然存在。

如果它不是内部 cmd 命令或批文件,则它就是一个程序,并将作为一个窗口化应用程序或控制台应用程序运行。

简单点解释,程序文件名,和 [/D path] [command/program] 配合使用,如下面,就组成了 G:\CloudMusic\cloudmusic.exe
parameters 这些是传递给 command/program 的参数
rem /affinity 参数是否存在的区别
start /affinity 1 G:\CloudMusic\cloudmusic.exe

批处理 bat 常用命令【学习笔记一】_第6张图片
批处理 bat 常用命令【学习笔记一】_第7张图片

11、if [not]…else… 命令:
rem 例如下面这句,if 可以单独使用,这里的 exist 是判断参数,判断 2.txt 这个文件是否存在
if exist 2.txt echo "文件存在"

rem 判断 2.txt 是否不存在
if not exist 2.txt echo "文件不存在"

rem 也可以组合使用,但是在 else 前面的语句最好括起来,否则会把 echo "文件存在" else ... 看做一个整体
if exist 2.txt (echo "文件存在") else echo "文件不存在"

if 语句的几种语法

IF [NOT] ERRORLEVEL number command

IF [NOT] string1==string2 command

IF [NOT] EXIST filename command

IF [/I] string1 compare-op string2 command

IF CMDEXTVERSION number command

IF DEFINED variable command
参数 解释
NOT 例如 IF NOT ERRORLEVEL number command,这条命令,只有 ERRORLEVEL number 这个条件为 false 时,command 这句命令才会执行
ERRORLEVEL number 如果最后运行的程序返回一个等于或大于指定数字的退出代码,指定条件为 true,这个条件应该比较少用,就像上面当用 start 命令启动多个窗口时,最后关闭的那个程序关闭时一般会有一个返回码,可以试试用 echo %errorlevel% 打印出来看看,上面的 ERRORLEVEL 是一个变量,number 由我们指定,当 ERRORLEVEL 大于或等于 number 时才返回 true
string1==string2 如果指定的文字字符串匹配,指定条件为 true
EXIST filename 如果指定的文件名存在,指定条件为 true
command 如果符合条件,指定要执行的命令。如果指定的条件为 FALSE,命令后可跟 ELSE 命令,该命令将在 ELSE 关键字之后执行该命令
/I 说明要进行的字符串比较不分大小写,一般和 string1==string2 配合使用
compare-op compare-op 可以是: EQU - 等于、NEQ - 不等于、LSS - 小于、LEQ - 小于或等于、GTR - 大于、GEQ - 大于或等于
DEFINED variable 被定义的变量,例如我们 set 了一个变量后,可以用 if %var% 的方式来判断,var 变量存在,则返回 true
12、for 命令:用于循环

几种语法

FOR %variable IN (set) DO command [command-parameters]

FOR /D %variable IN (set) DO command [command-parameters]

FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

FOR /L %variable IN (start,step,end) DO command [command-parameters]

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]

FOR /F ["options"] %variable IN ("string") DO command [command-parameters]

FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
参数 解析
%variable 指定一个单一字母可替换的参数,其实就是就是随便用一个字母来表示,
例如 %i,但文档里面要求用 %%i 来指定变量,这样在循环的时候用 %%i 就能够取到每一轮循环出来的值了
(set) 参数集,指定一个或一组文件。可以使用通配符,例如 *.txt
command 指定对每个文件执行的命令
command-parameters 为特定命令指定参数或命令行开关
/D 如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配,
例如 for /d %%i in (D:\workspaceForBat\*) do echo %%i,
只会查找 D:\workspaceForBat 目录下的文件夹
/R 检查以 [drive:]path 为根的目录树,指向每个目录中的 FOR 语句。
如果在 /R 后没有指定目录规范,则使用当前目录。
如果集(上面的参数 set )仅为一个单点(.)字符,则枚举该目录树,
也就是说从 [drive:]path 开始查找所有符合条件的文件或目录,
例如 for /r D:\ %%i in (*.txt) do echo %%i
/L start : 开始序号,step:每一轮循环跳跃的步长,end:结束序号,
FOR /L %variable IN (start,step,end) 表示以增量形式从开始到结束的一个数字序列。
因此,(1,1,5)将产生序列 1 2 3 4 5,(5,-1,1)将产生序列(5 4 3 2 1),
例如:for /l %%i in (1,1,5) do echo %%i
/F FOR /F [“options”] %variable IN (file-set) 表示以打开 file-set 文件集并读取文件每一行的方式来循环,这里的行并不是我们看到的行,如果 “options” 没有指定的话,将会默认以空格来分割行
“options” eol=c 指以c这个字符(就一个)开头的行将会被忽略不读取
skip=n 指在遍历开始时忽略的行数。
delims=xxx 指分每一行的分隔符。
tokens=x,y,m-n
       建议先看下面的运行demo,这样好理解
       x,y 表示取该行被分割后取第几个值,例如有一行字符串是 “111 222 333”,delims= ,那么x=1,y=2时,取到的值将会是111,和222,并分别赋值给一个隐藏变量中;
       m-n 格式为一个范围,表示在这个范围中取一个用 “delims” 分隔符分割出来的字符串并赋值到隐藏变量中。
       如果符号字符串中的最后一个字符星号,那么剩下的字符串讲赋值给一个隐藏变量。
usebackq 大概的用法是起到一个转义的作用,把条件括号内的空格、单双引号等转义,具体请参考下面的,这样更加清晰。
例子:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

demo:注意,直接在命令行中定义变量只需要一个%,在 bat 文件中是两%%,不知为何。。。
1.txt 内容:

111111 111111 111111 111111 111111
;222 22 22 22 22 22 22 
1
2 22
3 33 333
4 44 444 4444
5 55 555 5555 55555
6 66 666 6666 66666 666666
7 77 777 7777 77777 777777 7777777

运行输出结果:

D:\workspaceForBat>FOR /F "skip=1 eol=; tokens=2,3,6-9 delims= " %i in (1.txt) do @echo %i %j %k
22
33 333
44 444
55 555
66 666 666666
77 777 777777
D:\workspaceForBat>FOR /F "skip=1 eol=; tokens=2,3* delims= " %i in (1.txt) do @echo %i %j %k
22
33 333
44 444 4444
55 555 5555 55555
66 666 6666 66666 666666
77 777 7777 77777 777777 7777777

单单分割字符串的用法:

D:\workspaceForBat>FOR /F "tokens=1,3 delims= " %i in ("111 222 333 ") do @echo %i %j
111 333

分割括号中结果的用法:

D:\workspaceForBat>FOR /F "tokens=1,3 delims= " %i in ('echo 111 222 333') do @echo %i %j
111 333

读取多个文件的用法:

D:\workspaceForBat>FOR /F "tokens=1,3 delims= " %i in (1.txt 2.txt) do @echo %i %j
111111 111111
1
2
3 333
4 444
5 555
6 666
7 777
这是2.txt的内容 这是2.txt的内容
这是2.txt的内容 这是2.txt的内容

usebackq 用法:暂时只发现这几个,其他的自己尝试哈
把单引号看做双引号,单引号内命令将不起作用

D:\workspaceForBat>FOR /F "tokens=1,3 delims= " %i in ('echo 111 222 333') do @echo %i %j
111 333

D:\workspaceForBat>FOR /F "usebackq tokens=1,3 delims= " %i in ('echo 111 222 333') do @echo %i %j
echo 222

把双引号内的东西看做一个整体并且双引号等同去掉

D:\workspaceForBat>FOR /F "tokens=1,3 delims= " %i in ("D:\workspaceForBat\文 件 夹 1\1.txt") do @echo %i %j
D:\workspaceForBat\文 夹

D:\workspaceForBat>FOR /F "usebackq tokens=1,3 delims= " %i in ("D:\workspaceForBat\文 件 夹 1\1.txt") do @echo %i %j
111111 111111
1
2
3 333
4 444
5 555
6 666
7 777

D:\workspaceForBat>FOR /F "usebackq tokens=1,3 delims= " %i in ("echo 111 222 333") do @echo %i %j
系统找不到文件 echo 111 222 333。

下面这个得说说:
批处理 bat 常用命令【学习笔记一】_第8张图片
文档中有提到这个,用法比较简单,例如, 把 ~t 等拼接到变量前就行

D:\workspaceForBat>for %i in (*.txt) do @echo %i    %~ti    %~zi
1.txt    18/12/2018 12:40    178
2.txt    18/12/2018 14:12    250

你可能感兴趣的:(批处理bat,学习,linux,php)