【教程】批处理的教程
bat吧
全部回复
仅看楼主
level 7
神某Mou 楼主
我知道吧内最不缺的东西就是教程了,但我稍微看了一下,貌似对新手还是有些不全面或是太难。
本人也不是什么大神,所以若有说错之处,还请指出且见谅。
2016年08月09日 01点08分 1
level 7
神某Mou 楼主
看到这个,你可能会问:“我要学的是bat,和这个东西有什么关系?”关系可大着,bat文件,也就是cmd文件就是由这个cmd.exe执行的。
眼尖的同学可能会发现,这个cmd长得很像windows以前的Dos系统
磁盘操作系统(Dos)
但CMD并不是长得像Dos而已,他的命令和操作方式都像极了Dos。
不过Dos和CMD并不是相同的东西。Dos是16位元的操作系统,CMD则是基于Windows的32位元应用程式,这点要注意。
2016年08月09日 01点08分 2
level 1
结束了?
2016年08月10日 02点08分 5
当然没有
2016年08月10日 03点08分
level 1
教程写的能让人看懂 继续深入
2016年08月12日 08点08分 7
OuO
2016年08月12日 09点08分
你应该能看懂吧
2016年08月12日 09点08分
level 7
神某Mou 楼主
说到编程,变量是一个完全不能省略的东西。
CMD中的变量赋值与定义都是同一个命令:Set
Set有三种用法:
1.无参数:单纯的赋值,例如Set a=50,变量a就是50
2.P参数:透过管道取得外界咨询,默认是取得用户输入内容,例如Set /p a=你的名字是?然后变量a就是用户输入的名字。
3.A参数:运算,批处理是不分字符串和数值的,所以可以直接运算,例如Set /a a=50
+3
0,就是说变量a的值是50+30,即80
2016年08月12日 09点08分 8
level 7
神某Mou 楼主
CMD是不分类型的,所以如果变量不用特别的标识符很容易搞混,于是CMD为了标识变量,就使用了两个%来判断。
Set a=50
Echo.%a%
看看会出现什么?
会输出50
这正是因为%%是CMD的变量标识符,所以%a%就是变量a,即50。
至于Echo %a%写成Echo.%a%,这纯属习惯问题,而刚好在CMD的Echo语句中,这么写是合法的。所以Echo.Hi和Echo Hi是一样的,不过如果你想输出空格键,例如" ",你就必须echo. 而不能echo 了。
2016年08月12日 09点08分 9
靠 吃我空格
2016年08月12日 09点08分
补充一下,如果变数a没有设定,那么直接echo.%a%显示出来的字元就是%a%,并不会报错
2017年12月23日 11点12分
level 7
神某Mou 楼主
上回说了变量标识符%
bat其实还有很多标识符
请看下面列出的几个基本的:
^转义符
=赋值(一般ECHO不可输出需转义符^)
==等于,作为IF判定字符串或数值用(一般ECHO不可输出需转义符^)
&命令连接符(一般ECHO不可输出需转义符^)
|命令连接符 用前面命令的返回值作为后面命令的参数
&&命令连接符 如果前面的命令成功则执行后面的命令(一般ECHO不可输出需转义符^)
||命令连接符 如果前面的命令失败则执行后面的命令(一般ECHO不可输出需转义符^)
>出口}未来会说的管道(一般ECHO不可输出需转义符^)
<入口}未来会说的管道(一般ECHO不可输出需转义符^)
%变量标识符 或是取摸运算符 或是其他%的转义符(一般ECHO不可输出需转义符%)
:坐标 配合Goto (一般ECHO可输出无需转义符)
::注解 即REM(一般ECHO可输出无需转义符)
@遮蔽符 加在命令前面该命令不输出(一般ECHO可输出无需转义符)
+加号运算符 既可当一般字符串(一般ECHO可输出无需转义符)
-减号运算符 既可当一般字符串(一般ECHO可输出无需转义符)
*乘号运算符 既可当一般字符串(一般ECHO可输出无需转义符)
/除号运算符 既可当一般字符串(一般ECHO可输出无需转义符)
() 括弧 在If或是For常用 可以把多行命令概括在一起 作为同一个If或是For的执行内容(一般ECHO可输出无需转义符)
~字符串裁切(一般ECHO可输出无需转义符)
EQU 数值等于 (一般ECHO可输出无需转义符)
NEQ 数值不等于 (一般ECHO可输出无需转义符)
LSS 数值少于 (一般ECHO可输出无需转义符)
LEQ 数值少于或等于 (一般ECHO可输出无需转义符)
GTR 数值大于 (一般ECHO可输出无需转义符)
GEQ 数值大于或等于 (一般ECHO可输出无需转义符)
2016年08月12日 09点08分 10
level 7
神某Mou 楼主
在写代码的时候,没有一些解释很难让别人了解你的思路,在任何语言中都一样,所以有了一个注解的东西。
注解后的东西是不会被解释的,所以你可以加入你想对阅读代码的人说的话。
CMD中的注解符号是::,两个英语冒号,或是Rem命令,请看一下例子:
Echo 你好
::输出你好
Pause
Rem 暂停
2016年08月12日 13点08分 12
level 7
神某Mou 楼主
然和根据上面的粒子,我们发现了一件事情,Echo Off改行并不会被隐藏,所以证实了:CMD中所有的命令都是到了下一行才开始作用的。
如果你不要显示该行Echo Off的你可以使用之前所说的@Echo Off来关闭Echo Off的输出
或是,你可以使用以下代码:
Echo Off
Cls
来取代掉单纯的Echo Off,Cls可以清空控制台所有输出的内容,所以Echo Off输出的就会被清空,然后下一行再开始遮蔽,但这完全没有意义,只是要让你了解Cls的功效。
2016年08月12日 13点08分 14
level 7
神某Mou 楼主
在讲特殊符号的时候,讲到过一个:。
当时说:是为了搭配Goto的,的确如此,你们可以看看接下来的代码并且操作一次。
@Echo off
Echo.A:你好
Goto B
Rem 跳过下面那条代码 直接到A坐标去
Echo.B:你不好
:B
Echo.B:嗯 谢谢
Pause
看了上面的代码,相信大家已经知道了Goto和:的功用
不过:不止可以和Goto搭配使用 还可以和Call搭配
@Echo Off
Echo.A:你好
Call :B
Pause
:B
Echo.B:你好啊
这就蕴含着作用域,即俗称的模块的一些基础概念。
值得注意的是,Goto命令你可以Goto B,但是Call 命令你一定要Call :B。
因为Call不一定能调用自己的作用域,还可以调用其它应用程序。
2016年08月12日 13点08分 15
楼主这一部分“Rem 跳过下面那条代码 直接到A坐标去”的意思是直接跳到坐标B吧
2016年08月24日 04点08分
@1344233747 [泪]对 我打错了
2016年08月24日 12点08分
level 7
神某Mou 楼主
批处理其实有很多的小技巧可以运用,例如:
Echo Hi = Echo.Hi
Set /a a=%a%+1 = Set /a a+=1 (+ - * /...都可以运用)
以及接下来我们要学的For
像是下列的情况 我们就可以使用For
Echo.你好
Echo.我真的很好
Echo.好吧我就是来说废话的
Echo.但你能拿我怎么样呢?
Echo.哈哈哈哈哈哈
Echo.哈哈哈哈哈哈
Echo.哈哈哈哈哈哈
Echo.哈哈哈哈哈哈
Echo.哈哈哈哈哈哈
Echo.哈哈哈哈哈哈
Echo.哈哈哈哈哈哈
Echo.哈哈哈哈哈哈
Echo.哈哈哈哈哈哈
可以使用For的第一个用法——无参数
For %%i in (
你好
我真的很好
好吧我就是来说废话的
但你能拿我怎么样呢?
哈哈哈哈哈哈
哈哈哈哈哈哈
哈哈哈哈哈哈
哈哈哈哈哈哈
哈哈哈哈哈哈
哈哈哈哈哈哈
哈哈哈哈哈哈
哈哈哈哈哈哈
哈哈哈哈哈哈) Do (Echo.%%i)
2016年08月13日 03点08分 17
level 7
神某Mou 楼主
For本身就是一个为了阻止重复或类似代码所存在的语句,像是以下的代码,我们可以用l参数来节省代码。
Echo.这是第1个
Echo.这是第2个
Echo.这是第3个
Echo.这是第4个
Echo.这是第5个
......
Echo.这是第100个
我们就可以用以下的代码来节省他。
For /l %%i in (1,1,100) Do (Echo.这是第%%i个)
For /l %%a in (开始,每次循环跳的范围,终点) Do (执行代码)
值得注意的有三点
1.不管是%%i还是%%a,只能使用一个字节,例如%%b,如果使用超过一个字节的变量,可能会出错。
2.一般变量都是%variable%,可是如果是在For中,就要变成%%variable
3.如果我们要得到%%a下一个循环的值,我们可以用%%b;如果我们要得到%%b下一个循环的值,我们可以用%%c。以此类推。
2016年08月13日 03点08分 18
@bqgz 好吧不是,我记错用法了 不能这么用
2016年08月16日 12点08分
那个第三点无视,写错了
2016年08月16日 12点08分
level 7
神某Mou 楼主
在第十四楼的时候说过,CMD什么命令都是到下一行才开始做功到,而复合语句(例如If或For),都算同一行语句,所以在其中的变量,就不能
正确的
使用。
我们该如何解决这个问题?我们就必须使用一个叫“变量延迟”的东西。
setlocal EnableDelayedExpansion 延迟变量开启
这一长串是setlocal中最多使用的地方,当然甚至很多人都以为setlocal只能做这件事情,setlocal的事以后会详说。
有了开始延迟变量,就要有关闭延迟变量
setlocal disabledelayedexpansion 延迟变量解释
具体延迟变量是什么呢?我们用下列代码进行解说。
For %%i in (1,1,100) Do (
set /a a=%%i*2
echo.%a%)
试试看,相信大部分人的电脑都会出错,此时就需要使用延迟变量。
setlocal EnableDelayedExpansion
For %%i in (1,1,100) Do (
set /a a=%%i*2
echo.!a!)
就像这样,在使用变量的时候把%%换成!!。
值得注意的是,%%i在此For语句中本来就会变动,所以不需要!!i。
2016年08月13日 03点08分 19
@童年的记忆139 [滑稽]我表示自己写代码时基本没用
2016年08月17日 10点08分
就像这样,在使用变量的时候把%%换成!!。 这个为什么要这样写,用%a%好像就不行,这个是微软规定这样写的吗?有点搞不懂
2016年09月22日 07点09分
@wj2003vip CMD什么命令都是到下一行才开始做功,如果是!!变量就不用,而在For中所有命令算作一行,变量不会做功,所以才用!!
2016年09月22日 12点09分
我说啊,换成call echo.%%%% a %%%%就行了 无需![滑稽]
2017年04月21日 01点04分
level 7
神某Mou 楼主
是时候讲For /f了, For /f和文本有关,我们就先将CMD中的字符串处理吧。
@echo off
set a=Hello World
echo.%a:Hello=Hi%
pause
你们可以把上面代码储存到bat中试试看
这就是字符串处理中最简单的一个Replace的运用。
%变量:被替换者=替换者%
例如%a:Hello=Hi%的意思就是在变量a中的Hello替换成Hi
2016年08月13日 09点08分 20
这里不错
2016年08月15日 13点08分
2016年08月16日 14点08分
2016年08月16日 14点08分
@bat大人 [滑稽]No Zuo No DIe No HuaJi
2016年08月17日 10点08分
level 7
神某Mou 楼主
当然,CMD中的文本处理不只Replace,不过我们要讲的只有两个,一个是Replace没问题,另外一个就是类似VB中的mid。
@echo off
set a=Hello World
echo.%a:~0,5%
pause
同样执行以上代码,会发现他只输出Hello,这就是~的用处,截取字符串,从第0个开始截到第5个。还有一个用法,请看以下示例。
@echo off
set a=Hello World
echo.%a:~0,-2%
pause
会发现我把5改成了-2,这并不是从第0开始截到第-2个,这是从0开始截到倒数第二个,当然你可以随意的修改,没有问题,不过要注意的是,":"绝对不能漏掉。
2016年08月13日 09点08分 21
非常好 这个代码以前一直看不懂,今天终于明白了
2016年08月15日 08点08分
2016年08月15日 08点08分
@神某Mou 然而-2,-1之类的你没说[滑稽]
2017年04月21日 01点04分
@幻虚道长🍭 而且楼下介绍for/f居然又用机器翻译恶心人!
2017年04月21日 01点04分
1 2 3 尾页