windows bat批处理语法简析
第一节先介绍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\UltraEdit\Uedit32.exe,我又研究了如果通过命令启动应用程序,找到了start命令。于是我使用start "" "C:\Program Files (x86)\IDM Computer Solutions\UltraEdit\Uedit32.exe" 来通过命令行启动ue,但是这个命令实在是太长了,不好记。通过bat的学习,知道可以将这条命令放在一个.bat文件中运行。于是我创建一个ue.bat文件,文件内容如下:
@echo off ::
start "" "C:\Program Files (x86)\IDM Computer Solutions\UltraEdit\Uedit32.exe"
但是我不可能每次都切换到ue.bat的目录中去执行ue.bat命令,于是创建一个单独的目录,将此目录加入到环境变量中,这样命令行可以搜索到这个目录中的文件,将ue.bat放入这个目录中。这样我每次启动ue就只需在cmd下敲入ue(它会自动匹配ue.exe,ue.bat等文件)就可以了。ue可以用来打开文件,我猜测ue应该可以传递参数。将上面命令后面加上%1参数,即start "" "C:\Program Files (x86)\IDM Computer Solutions\UltraEdit\Uedit32.exe" %1,即可,然后在cmd命令行输入ue blog.txt, 如果当前目录下有blog.txt,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:\temp\test1.txt
则对应截取如下:下面的1表明是对应着%1,当然可以为2,3等等,与传入的参数对应即可。
echo %~d1 =>c:
echo %~dp1 =>c:\temp\
echo %~nx1 =>test1.txt
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目录的命令集打印到屏幕上。
list.bat内容如下,相当简单,功能是打印当前目录下的所有的bat文件名和exe文件名,将它和你的一系列的bat文件放到同一个目录,同时把目录加入到环境变量里面,你就可以进行享用它给你带来的便捷了:
@echo off
::echo "path=%~dp0"
dir /b "%~dp0*.bat" "%~dp0*.exe"
windows bat批处理语法简析的更多相关文章
- Windows Bat 批处理脚本
Windows Bat 批处理脚本 – Getting Started – Variables – Return Codes – stdin, stdout, stderr – If/Then Con ...
- 转:windows BAT 批处理脚本教程
转自:http://www.cnblogs.com/mq0036/p/3412171.html BAT 批处理脚本教程 第一章 批处理基础第一节 常用批处理内部命令简介 批处理定义:顾名思义,批处理文 ...
- windows bat 批处理 执行 for 循环无法执行?
示例: cmd 命令行可以执行.但是 写成 bat 却不能执行, for /f "delims==" %a in ('dir /b /s F:\F\*.TXT')do copy ...
- windows bat批处理基础命令学习教程(转载)
一.基础语法: 1.批处理文件是一个“.bat”结尾的文本文件,这个文件的每一行都是一条DOS命令.可以使用任何文本文件编辑工具创建和修改.2.批处理是一种简单的程序,可以用 if 和 goto 来控 ...
- windows bat 批处理 !vm 合并快播文件
今天简单的写了一个bat批处理文件 用来处理快播的p2p的文件,一般回事这样的目录 你可以下载如下代码 @echo off for /r %%a in (.) do ( echo %%a cd %%a ...
- kbmmw ORM 对象定义语法简析
使用kbmmw 的ORM 一定先要了解ORM 的对象定义语法. 下面简单说一下 // kbmMW_Table - Define a table. 定义一个表 // Must be used on cl ...
- tools.windows.bat#批处理
关于%~ %~I - 删除任何引号("),扩展 %I %~fI - 将 %I 扩展到一个完全合格的路径名 %~dI - 仅将 %I 扩展到一个驱动器号 %~pI - 仅将 %I 扩展到一个路 ...
- Windows bat批处理删除指定N天前的文件
1:新建批处理文件:del_old_file.bat,更改系统时间为7天前,在c盘sql back 目录下新建测试文件,再将系统时间改为正确时间 2:编辑内容: rem 删除C:\sql back目录 ...
- Windows bat批处理使用
mkdir commonmkdir datamkdir savemkdir data\tsushima_m_mapmkdir save\tsushima_m_map msxsl ..\common\r ...
随机推荐
- Android 7.1 App Shortcuts使用
Android 7.1 App Shortcuts使用 Android 7.1已经发了预览版, 这里是API Overview: API overview. 其中App Shortcuts是新提供的一 ...
- iOS开发--Swift RAC响应式编程初探
时间不是很充足, 先少说点, RAC的好处是响应式编程, 不需要自己去设置代理委托, target, 而是主要以信息流(signal), block为主, 看到这里激动吧, 它可以帮你监听你的事件, ...
- git与github安装、配置、pull、push
操作系统是Ubuntu 16.04 LTS 64bit 1 安装git (1)安装 sudo apt-get install git-core (2)一些全局变量的初始化 在本地建立一个文件夹,然后做 ...
- 一个URL的物理文件的体现
场景 许多同学在开发过程中经常会遇到一个问题,怎么去定义一个url?以及定义一个url之后怎么根据一个url定义文件. 公司组织一次内部培训,为了把这次培训的内容以博客的形式共享出来. URL与文件的 ...
- qt中ui的 使用介绍
1.什么是ui?ui通常是用Qt 设计师设计出来的界面文件的后缀.通常情况下ui是一个指向这个界面类的指针.ui-> 一般就是用来访问这个界面类里面的控件.例如你的ui文件里有一个叫okButt ...
- linux基本知识0
linux的基本原则: 1.有目的单一的小程序组成,组合小程序完成复杂任务. 2.一切皆文件 3.尽量避免捕获用户接口 4.配置文件保存为纯文本格式 CLI接口: 命令提示符,prompt,bash ...
- js中判断对象具体类型
大家可能知道js中判断对象类型可以用typeof来判断.看下面的情况 <script> alert(typeof 1);//number alert(typeof "2" ...
- redis字符串
字符串类型是redis的基本类型 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下:COMMAND KEY_NAME SET 和GET用于设置和读取key的值 1.SET key ...
- 将 instance 连接到 flat_net - 每天5分钟玩转 OpenStack(88)
上一节我们创建了 "flat_net",本节将在此网络中部署 instance 并验证连通性. launch 新的 instance “cirros-vm1”,选择网络 falt_ ...
- [LeetCode] Nth Highest Salary 第N高薪水
Write a SQL query to get the nth highest salary from the Employee table. +----+--------+ | Id | Sala ...