批处理教程

@ECHO OFF

REM 判断文件是否存在

IF EXIST example.txt ECHO found it

REM 组合命令和js的短路径操作类似

DIR example.txt && ECHO found it too

REM 追加方式到处内容到文件

ECHO not bad day >> exmple.txt

REM 最简单的组合命令, 类似js的逗号运算符, 组合多条语句

ECHO hello & ECHO world!

REM 这是注释,为了让地球人看懂

ECHO comments example

REM |(前一个命令的输出 作为后一个命令的输入) more 一屏一屏的显示后面的内容 Enter 1行, 空格 1屏

:: help | more

:: more longArticle.txt

:: type longArticle.txt

REM || 短路径操作 参考js

DIR setup_*.exe || echo can see me

DIR foo.ttt & DIR foo.txt || ECHO can not see me 2

DIR foo.ttt && DIR foo.txt || ECHO can see me 2

REM 输入重定向 < >& <&

:: more < longArticle.txt

REM 输出重定向 > >>

:: echo has some good idea > haha.txt
:: echo come on >> haha.txt


REM call命令 从1个批处理调用另1个批处理 且接受入参

call hi.bat sindy

:: hi.bat
:: echo hello, %1

REM choice命令 提示用户输入1个字母进行选择 它的返回码为1234……

CHOICE /C abc /M apple,banana,coffee

:: 用户选择的值,存在变量 %errorlevel%中

if %errorlevel% == 3 goto coffee
if %errorlevel% == 2 goto banana
if %errorlevel% == 1 goto apple

:apple
echo you like apple
goto end

:banana
echo you like banana
goto end

:apple
echo you like coffee
goto end

:end
echo goodbye

REM find命令 find string 注意这个string需要双引号

netstat -an > a.txt
type a.txt | find "5355" && echo yes,you found the string


REM if命令 判断入参

if "%1"=="" goto usage

if "%1"=="/?" goto usage

if "%1"=="help" goto usage

:: if not "%1"="" goto somejob


:usage
ECHO this is something about how to use bat


REM 判断文件是否存在

IF EXIST *.jpg DEL *.jpg

:: IF NOT EXIST *.jpg MKDIR pic

:: DOS程序在运行完后都有返回码),如果和定义的错误码符合(这里定义的错误码为1),则执行相应的操作(这里相应的操作为pause & edit %1.asm部分)

::masm %1.asm

::if not errorlevel 1 link %1.obj

::pause & edit %1.asm

:: ------------------------

::masm %1.asm

::if exist %1.obj link %1.obj

::else pause & edit %1.asm


REM IF [NOT] ERRORLEVEL number do command

REM IF [NOT] string1==string2 do command

REM IF [NOT] EXIST filename do command

 


:: 在批处理程序中使用 FOR 命令时,指定变量请使用 %%variable 而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.

FOR /F "usebackq delims==" %%i IN (`set`) DO @echo %%i

:: 根据用户输入设置环境变量

SET /p yourname=input your name:

:: 直接设置环境变量
SET yourname=alice
ECHO %yourname%

:: 读取文件内容设置环境变量 输入重定向
SET /p yourname= < me.txt

FOR /F %%i in (me.txt) DO @SET yourname=%%i

:: 延迟环境变量读取

1. 命令行中执行如下:

cmd /v:on  ::延迟

cmd /v:off ::不延迟

2. 批处理中执行如下:

setlocal EnableDelayedExpansion

setlocal disableDelayedExpansion

 

~~设置命令行窗口的字符编码

1. chcp 65001  // utf-8编码

2. 命令行窗口属性-->字体-->Lucida console

恢复默认的GBK编码

chcp 936  //gbk的codepage==936

 

~~ if  .. else .. 并且可以使用括号包括多条命令

@echo off
echo.
:: can we use if condition () else () syntax?
if exist foo.ttt (
echo yes,found it
) else (
echo no, missing
)

echo the end..

pause

 

~~~set读取文件内容 并数学运算+1

@echo off
@echo number + 1 for each time call this bat
set /p num= < number.txt
@echo.
@echo.
@echo current number is: %num%
@echo.

set /a sum=%num%+1
@echo %sum% > number.txt

:: set /a sum+=1

pause

 

~~变量延迟

@echo off

setlocal enabledelayedexpansion

::great , can use brackets like this, so if can follow multiplte cmd
set VAR=before
if "%VAR%" == "before" (
::set pro
echo cmd one
echo cmd two
set VAR=after
if "%VAR%" == "after" @echo you won't see this, when var not delayed
echo %VAR%
)

pause

set VAR2=before2
if "%VAR2%" == "before2" (
echo command one
echo command two
set VAR2=after2
echo command three
if "!VAR2!" == "after2" @echo var has been delayed
echo !VAR2!
)

endlocal


pause

----------------------------------------

set 命令
----------------------------------------

SET [variable=[string]]
SET /P variable=[promptString]
SET /A expression

 

示例1:
@echo off
set
pause
显示所有的变量的值

示例2:
@echo off
set var=我是值
echo %var%
pause
请看 set var=我是值 ,这就是BAT直接在批处理中设置变量的方法!
set 是命令 var是变量名 =号右边的"我是值"是变量的值
在批处理中我们要引用这个变量就把var变量名用两个%(百分号)扩起来,如%var%

 

@echo off
set /p var=请输入你的名字:
echo 您的名字是:%var%
pause
set /p 是命令语法 var是变量名 =号右边的"请输入变量的值: ",这个是提示语,不是变
量的值了!
运行后,我们在提示语后面直接输入robin,就会显示一行您” 您的名字是:robin”

 

set的/A参数就是让SET可以支持数学符号进行加减等一些数学运算!

set /a var=1 + 1
set /a var=2 - 1 结果是多少呢?如果你看不到结果就echo %var%.....
set /a var=2 * 2 乘法运算
set /a var=2 / 2 除法运算
set /a var=(1+1) + (1+1) 结果等于4 看得懂吧!

@echo off
set /a a=1+1,b=2+1,c=3+1
echo %a% %b% %c%

set /a var+=1
set /a var*=2

 ---------------

获取日期和时间

rem CODE BY t0nsha 
rem 关于提取date,time输出结果的一个批处理 
rem “:”(冒号)和“~”波浪号必不可少! 
rem “~”后的数字:为正数表示舍弃输出结果的前几位;直接跟负数表示取到输出结果的后第几位。 
rem “,”后的数字:为正数表示取到输出结果的前第几位;为负数表示舍弃输出结果的后几位。 
echo %date% 
echo %date:~4% 
::下行表示舍弃前0位,取到第10位(即取输出结果的前10位) 
echo %date:~0,10% 
echo %date:~4,-5% 
pause 
echo %time% 
echo %time:~-3% 
echo %time:~2,-3% 
pause 
echo %date:~4% %time:~0,-3% 
pause

-----------------------------------------------
环境变量 替换或删除匹配字符

@echo off
echo.
REM 设置环境变量为空格
SET "space= "
ECHO Your%space%role%space%is%space%coder
ECHO\

REM 环境变量的值进行字符串替换
SET "VAR=he doesn't care about the exam result"
::find=rep 查找等号左边的字符,替换为右边指定的字符
ECHO %VAR: =_%
ECHO.

::当等号右边无指定字符,则删除匹配的字符
ECHO %VAR: =%
ECHO.

::可以用通配符*, %var:*'=R% *'匹配第一个'和它之前的内容
ECHO %VAR:*'=removed,%
ECHO.

PAUSE

-------------------------------------------------------


BTW

使用批处理产生日期(时间)文件、文件夹 帮别人整Sql     server自动备份
发现无法使用网络映射驱动器作为备份文件存放路径
而本机磁盘空间实在是不够
于是决定在本机只备份最新2天数据
再写个批处理,做成系统调度
每周将备份数据复制到网络驱动器上存档

从网上搜到批处理产生日期文件的办法
下面是实现的比较好的

批处理文件:
@echo off
set aFile=bak-%DATE:~4,4%%DATE:~9,2%%DATE:~12,2%
set bFile=bak-%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
set cFile=bak-%DATE%
echo Afile=%aFile%
echo Bfile=%bFile%
echo Cfile=%cFile%

输出:
Afile=bak-20061219
Bfile=bak-113202
Cfile=bak-星期二 2006-12-19

于是备份bat就好写了
@echo off
echo 正在备份数据到网络驱动器。。。
set folder=%DATE%
md "y:/%folder%"
copy d:/DataBak/*.BAK "y:/%folder%"
echo 备份完毕。

------------------------------------------------------------------------------------------------------
@echo off
set AFile=bak-%DATE:~4,4%%DATE:~9,2%%DATE:~12,2%
set BFile=bak-%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
echo AFile=%AFile%.rar
echo BFile=%BFile%.rar


运行此批处理的结果:
AFile=bak-20060109.rar ------- 年月日 -- 8位
BFile=bak-140650.rar ---------- 时分秒 -- 6位

另:如果小时数只有一位数字,造成中间有空格而出错的问题,请使用如下方法补0
set hh=%time:~0,2%
if /i %hh% LSS 10 (set hh=0%time:~1,1%)

posted @ 2015-05-07 18:21  stephenykk  阅读(989)  评论(0编辑  收藏  举报