zoukankan      html  css  js  c++  java
  • 批处理教程

    @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%)

  • 相关阅读:
    教程:在 Visual Studio 中开始使用 Flask Web 框架
    教程:Visual Studio 中的 Django Web 框架入门
    vs2017下发现解决python运行出现‘No module named "XXX""的解决办法
    《sqlite权威指南》读书笔记 (一)
    SQL Server手工插入标识列
    hdu 3729 I'm Telling the Truth 二分图匹配
    HDU 3065 AC自动机 裸题
    hdu 3720 Arranging Your Team 枚举
    virtualbox 虚拟3台虚拟机搭建hadoop集群
    sqlserver 数据行统计,秒查语句
  • 原文地址:https://www.cnblogs.com/stephenykk/p/4485720.html
Copyright © 2011-2022 走看看