windowsbat批处理语法简析
很久没有写过博客了,这⼀段时间看的东西不多,很乱,但是不写总感觉有⼀件⼯作没有完成,于是草草写下⾃⼰的总结吧。
第⼀节先介绍windows批处理。
这个起源于跟旁边同事学习在windows⽤命令⾏办公,渐渐地有些批处理功能就需要了,于是专门抽出了⼏天学习了⼀下。我认为⽂档最重要的功能是为了备忘,择取了很多⽂档的例⼦,现在很久了就没法详细的标明出处了,很是抱歉。为了我个⼈的使⽤,例⼦中很多不太必要的东西都被我简化了,有些很重要的东西就被我描述的过于详细。⼤家择优⽽看吧。
简单⼀点,把批处理当初语⾔来看,常⽤的C语⾔有输⼊输出,定义变量,顺序,循环,条件判断。这是任何⼀个语⾔的根本,我就按这些类分类描述了。
总括:
要想运⾏批处理命令,⾸先创建⼀个txt⽂件,将其后缀名改为.bat,例如命名为my.bat, 打开cmd,切换到my.bat的⽬录,输⼊my.bat即可运⾏my.bat中写⼊的命令。最简单的测试例⼦,加⼊echo hello world即可看到hello world在cmd窗⼝中打印出来。
分类描述:
帮助:/?
command /?查看对应command的帮助,这个⽆论何时都是最权威的。
注释:::命令,echo off命令
程序中的注释是相当有⽤的,⾏注释在⾏⾸加上::,例⼦如下
::这是⼀个注释。
@echo off的意思是此命令后的命令在执⾏的时候,不显⽰命令本⾝。
变量:set命令
set var="c:\a.txt"
echo %var%
输出:echo命令,直接打印到控制台
echo Hello World
输⼊:choice命令,根据⽤户输⼊切换到不同的流程。
仔细分析这个例⼦,使⽤了choice命令来读取⽤户的不同输⼊,下⾯通过goto来根据不同的⽤户输⼊切换到不同的处理流程。
goto就是跳转到不同的标号中。标号的定义以:(冒号)开始,后⾯是标号名,例如下⾯的:no, :yes, :cancel, :end都是⼀个个的标号。为什么每⼀个标号要加上⼀个goto end呢?这是因为在跳转到标号后,程序就开始顺序执⾏,如果不进⾏跳转⾛,那么会继续运⾏到下⼀个标号。标号仅仅是个标记,不像函数⼀样,有⾃⼰的作⽤域范围,由⼤括号包括起来。标号没有范围,仅仅是标记,切记切记。⾮常有⽤的例⼦,希望掌握。
CHOICE /C YNC /M "确认请按 Y,否请按 N,或者取消请按 C"
if errorlevel 3 goto cancel
if errorlevel 2 goto no
if errorlevel 1 goto yes
:no
echo no way
goto end
:yes
echo yes,please
goto end
:cancel
echo alread canceled.
:end
传递参数:%1, %2...,%9对应⽤户通过命令传递的参数。
程序中使⽤echo %1, %2, %3,在调⽤的地⽅使⽤mybat param1 param2 param3,看看是不是打印出来了
param1,param2,param3?
这个类似于命令中的选项。很多命令都有选项,就是这个道理。
给⼤家⼀个我很常⽤的功能。
我喜欢使⽤ultraedit来编辑⽇常的⼯作记录,⽇志什么的,包括我当前写的这个博客,也是⽤ultraedit编辑的,以下简称ue。
于是我搜索ue的安装⽬录,我的安装⽬录如下C:\Program Files (x86)\IDM Computer Solutions\,我⼜研究了如果通过命令启动应⽤程序,到了start命令。于是我使⽤start "" "C:\Program Files (x86)\IDM Computer
Solutions\" 来通过命令⾏启动ue,但是这个命令实在是太长了,不好记。通过bat的学习,知道可以将这条命令放在⼀个.bat⽂件中运⾏。于是我创建⼀个ue.bat⽂件,⽂件内容如下:
@echo off ::
start "" "C:\Program Files (x86)\IDM Computer Solutions\"
但是我不可能每次都切换到ue.bat的⽬录中去执⾏ue.bat命令,于是创建⼀个单独的⽬录,将此⽬录加⼊到环境变量中,这样命令⾏可以搜索到这个⽬录中的⽂件,将ue.bat放⼊这个⽬录中。这样我每次启动ue就只需在cmd下敲⼊ue(它会⾃动匹配ue.exe,ue.bat等⽂件)就可以了。ue可以⽤来打开⽂件,我猜测ue应该可以传递参数。将上⾯命令后⾯加上%1参数,即start "" "C:\Program Files (x86)\IDM Computer Solutions\" %1,即可,然后在cmd命令⾏输⼊, 如果当前⽬录下有,ue会⾃动打开它,如果没有,它会⾃动创建⼀个新的空⽩⽂件。相当好⽤。这就是应⽤程序传递参数的妙⽤。上⾯的start命令可以扩展开来,像我的qq,vs2008,vc,chrome等等常⽤的软件全都采⽤了如vc.bat,qq.bat上述⽅式,桌⾯快捷⽅式基本不怎么⽤了。
条件判断:if命令
===============================================
@echo off
set str1=abcd1233
set str2=ABCD1234
if %str1%==%str2% (
echo 字符串相同!
) else (
echo 字符串不相同!
)
===============================================
请⼀定要注意上⾯的if,else的语法结构,else不允许直接是⾏⾸。超级恶⼼,导致我经常出现语法错误。后⾯我基本上就以上⾯这个为模板了,即使就⼀个句⼦需要执⾏,我也将()括着,语法就按照上⾯的描述写。易记不易错。
if判断有⼏种情况
1. 是errorlevel的判断, 上⾯已经⽰例了。
2. 是⽐较判断,常⽤的如下:
== - 等于
EQU - 等于
NEQ - 不等于
LSS - ⼩于
LEQ - ⼩于或等于
GTR - ⼤于
GEQ - ⼤于或等于
选择开关/i则不区分字符串⼤⼩写;选择not项,则对判断结果进⾏逻辑⾮。
3. 是存在判断,就是 if exists file1 echo "file1 exists" 这样的语法结构判断⽂件或者⽬录的存在。
4. 是定义判断,判断变量是否存在,即是否已被定义。其命令格式为:
IF [not] DEFINED variable command1 [else command2]
循环:
1、⽆开关的for语句能够对设定的范围内进⾏循环,是最基本的for循环语句。其命令格式为:
FOR %%variable IN (set) DO command
其中,%%variable是批处理程序⾥⾯的书写格式,在DOS中书写为%variable,即只有⼀个百分号(%);set就是需要我们设定的循环范围,类似于C语⾔⾥ ⾯的循环变量;do后⾯的command就是循环所执⾏的命令,即循环体。
⽆开关for语句举例:
===============================================
@echo off
for %%i in (a,"b c",d) do echo %%i
pause>nul
===============================================
2、开关/L
含开关/L的for语句,可以根据set⾥⾯的设置进⾏循环,从⽽实现对循环次数的直接控制。其命令格式为:
FOR /L %%variable IN (start,step,end) DO command
其中,start为开始计数的初始值,step为每次递增的值,end为结束值。当end⼩于start时,step需要设置为负数。
含开关/L的for语句举例(创建5个⽂件夹):
===============================================
@echo off
for /l %%i in (1,2,10) do md %%i
pause
===============================================
上例将新建5个⽂件夹,⽂件夹名称依次为1、3、5、7、9。可以发现,%%i的结束值并⾮end的值10,
⽽是不⼤于end的⼀个数。
3、开关/F
含开关/F的for语句具有最强⼤的功能,它能够对字符串进⾏操作,也能够对命令的返回值进⾏操作,还可以访问硬盘上的ASCII码⽂件,⽐如txt⽂档等 。其命令格式为:
FOR /F ["options"] %%variable IN (set) DO command
其中,set为("string"、'command'、file-set)中的⼀个;options是(eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq)中的⼀个或多个的组 合。各选项的意义参见for /f。⼀般情况下,使⽤较多的是skip、tokens、delims三个选项。
含开关/F的for语句举例:
===============================================
@echo off
echo **No Options:
for /f %%a in ("1,2,10") do echo a=%%a
echo **Options tokens ^& delims:
for /f "tokens=1-3 delims=," %%a in ("1,2,10") do echo a=%%a b=%%b c=%%c
pause
===============================================
4、总结说来就是常⽤的有三种,⽆开关主要是⽤于对设定的范围进⾏循环,使⽤的场合⽐较少。
带开关l常⽤于设定循环次数的情况,例如循环10次,可以for /l %%i in (1,1,10) do ( command )这样就会循环10次。
带开关F常⽤于截取字符串,不过由于for,它可以对命令的结果进⾏批量截取。in的⾥⾯可以使⽤字符串,也可以使⽤命令的结果,也可以使⽤⽂件,相当强⼤,也最难⽤。
下⾯这个例⼦相信会让你有点感觉:
===============================================
@echo off
echo 本⽂件夹⾥⾯的⽂件有:
for /f "skip=5 tokens=3* delims= " %%a in ('dir') do (
if not "%%a"=="<DIR>" if not "%%b"=="字节" if not "%%b"=="可⽤字节" echo %%b
)
pause
===============================================
解释⼀下这个例⼦,skip=5表⽰要跳过前5个字符,delims= 表明使⽤空格分隔,tokens=3*表明要取得空格分隔的第3组,以及最后⼀组(*表明第4组到最后).后⾯的%%a对应的第三组,%%b对应的*那⼀组。
实际还有开关/R, /D,我没有⽤过也没有深⼊了解。
截取路径参数:
截取传⼊的带路径的参数
Test.bat: 假设传⼊的参数为:c:\
则对应截取如下:下⾯的1表明是对应着%1,当然可以为2,3等等,与传⼊的参数对应即可。
echo %~d1 =>c:
echo %~dp1 =>c:\temp\
echo %~nx1 =&
echo %~n1 =>test1
echo %~x1 =>.txt
cho 当前⽬录路径:%~dp0
语⾳声⾳:
mshta vbscript:createobject("sapi.spvoice").speak("好好学习Merry Christmas and Happy New Year!")(window.close)
字符串处理:
截取字符串:
set var=10203040
第⼀数字是位置,从哪⾥开始截取,第⼆个数字是截取的长度。
第⼀个数字如果是负数,则表⽰反⽅向的位置,例如-4表明从倒数第四个字符开始。
第⼆个数字如果⽆,表明是可以达到的最长的长度,位置从0开始。
echo %var:~-4,3% ;从倒数第四个字符的位置开始截取,截取3个字符
echo %var:~0% ;从正数第0个位置开始,即全长。
echo %var:~1% ;从正数第⼀个开始,截取除第⼀个字符之外的全部字符
echo %var:~-2% ;从倒数第2个字符的位置开始截取,截取2个字符(从左向右截最长只有2个)。
替换字符串
echo %var:0=kkk% ;0替换为kkk
echo %var:10=kkk% ;10替换为kkk
echo %var:20=kkk%
echo %var:*20=kkk% ;20之前包括20字符串都替换为kkk
简单牢骚⼀下:
本⽂主要阐述bat基本语法,不怎么讲命令。在命令的基础上使⽤bat,才会真正的事半功倍。当需要进⾏批量处理或者重复的⼯作才需要⽤到它,简单的⼯作⾃⼰就简单完成就可以了。将你特别常⽤的命令编制成批处理⽂件,然后在命令⾏下使⽤,个⼈认为还是很不错的。像ssh登录总是需要输⼊机器的ip,那可以搞个批处理⽂件,例如ssh1,ssh2,或者ssh_wang, ssh_liu,这个⾥⾯进⾏真正的ssh对应的ip,敲的字符少了,⼯作就快了,⽽且不⽤每次都记忆那么长的ip地址。像你可能在使⽤⼀套编译环境,每次都是需要⼏步命令才可以完成,这个时候你也可以将要输⼊的命令集合组装成⼀个bat⽂件,以后就只需要⼀步就oK了。慢慢的你可能会积累⼀套⾃⼰的bat命令,虽然是⼀个⼀个的⽂件,但其实就是简单的命令集。你可能会忘记命令的名字,可以专门写⼀个简单的list.bat的命令,负责将bat⽬录的命令集打印到屏幕上。
ssh工具windows
list.bat内容如下,相当简单,功能是打印当前⽬录下的所有的bat⽂件名和exe⽂件名,将它和你的⼀系列的bat⽂件放到同⼀个⽬录,同时把⽬录加⼊到环境变量⾥⾯,你就可以进⾏享⽤它给你带来的便捷了:
@echo off
::echo "path=%~dp0"
dir /b "%~dp0*.bat" "%~dp0*.exe"
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论