找回密码
 注-册

QQ登录

只需一步,快速开始

查看: 2313|回复: 0

[操作技巧] BAT批处理脚本教程

[复制链接]
Leya 发表于 2008-8-23 22:19:33 | 显示全部楼层 |阅读模式
在 Unix 系统中, 网络工程师一般在本地机测试搭建的环境, 然后再在服务器上搭建. 在本机搭建一般都是手工配置的. 而到服务器配置则使用 shell 脚本自动部署.原因很简单:
1. 容易出错的过程
2. 重复工作量
3. 节省时间
4. 自动化 (简单运行 Shell 脚本就完成任务)
程序员 复制 网络工程师的成功经验:
     在增量开发的过程中,程序员经常需要将当前完成的功能集成到原有的系统中. 通常每个程序员一天集成一次.
     通常需要做的重复劳动是:编译代码、测试代码、系统部署。如果你可以按一个键就完成这些过程, 将会节省多少时间。

Unix 有 shell , window 有 cmd批处理脚本,英文译为BATCH,批处理文件后缀BAT 就取的前三个字母。

bat 没有固定构成格式:每一行可视为一个命令,每个命令里可以含多条子命令,从第一行开始执行,直到最后一行结束,它运行的平台是DOS。
下一文章: BAT批处理文件的msdos窗口如何开机自动后台运行不弹出窗口
找房子    免费租房子   暑期兼职   跳蚤市场   同城交友
Projects In Asp Find Solutions for your Business. Free Reports, Info & Registration!
» 相关连接:
BAT批处理文件的msdos窗口如何开机自动后台运行不弹出窗口


Posted: 2008-06-28 05:34 | [楼 主]

第一章 创建批处理文件的方法:
  1. "copy con" 将计算机屏幕上输入的内容存放到指定的文本文件。 con 屏幕。例子:
      C:\> copy con test.bat
            echo 输入内容
            Ctrl + Z 接着按回车,退出编辑状态。
    运行 test.bat

2.使用 edit 的 DOS 自带的文本编辑器
  按 Alt + 菜单首字母激活菜单。

3.使用记事本
  C:\> notepad

第二章 批处理的命令
1. echo [{on|off}][message]
  功能有二个:
      1.1 在屏幕显示信息(字符串)
      1.2 控制批处理文件在执行的过程中, 是否显示命令本身的字符串.
  例子1.1
      echo 显示内容
  例子1.2
      echo on
        type file.txt
      echo off
      type file.txt

2. @ [command]
    功能:屏蔽显示的命令本身的字符串
  例子:比较使用和不使用@的效果
      1. echo on
          type file.txt
      2. @echo on
          type file.txt

3 goto label
  功能:流程控制跳转命令,用于控制批处理中的命令执行流程。
  例子:
      @echo off
      echo 直接跳到最后的命令
      goto last
      echo 这个命令没有执行
      :last
      echo 最后执行的输出命令
  讨论:
      在 1963 年,当时流行的语言 ALGOL 语言,Peter Naur 指出,在程序中大量地、无限制地使用 GOTO 语句, 会使程序结构变得非常混乱。
      在 1965 年,E.W.Dijkstra 在会议上提出:应该把GOTO 语句从高级语言中取消。当时就有 LISP、ISWIM、BLISS 等把GOTO 语句去掉。
      D.E.Knuth 认为:GOTO 语句虽然存在着破坏程序的可维护性问题,但不应该完全禁止。
      ALGOL 是把一切归功于算法的语言。 很多C 语言的书都引用著名计算机科学家法沃思(Nikiklaus Wirth)的一个公式:程序 = 数据结构 + 算法。

4. pause
  功能:暂停批处理的执行并提示信息,让用户决定是继续执行还是中断执行。
  例子:
      @echo off
      echo Ctr + C 退出执行
      pause
      echo 继续执行下面的命令.

5. call [ [Drive:][Path] FileName [BatchParameters] ] [:label [arguments]]
    功能有二个:
      5.1 在批处理程序中调用另一个批处理程序(一个批处理文件相当于一个函数)
      5.2 调用指定标记后面的所有命令
      5.1 例子
          test.bat
              @echo off
              echo start call called.bat
              call called.bat
              echo end call called.bat
      called.bat
              @echo off
              @echo clased.bat echo info.
      5.2 例子
        @echo off
        call :xxx
      echo 在中间的命令
      :xxx
        echo 在 xxx 标记后的命令

6.start ["title"][/dPath][/min][/max][/wait][FileName][parameters]
        功能:启动一个独立的窗口,然后在窗口中执行指定的程序或命令.
        参数说明:
          title:窗口的标题
          Path:新窗口的当前目录
          /max:最大化
          /min:最小化
          /wait:等待新的进程结束后,再返回执行
          /b:在原窗口启动独立的进程
          /FileNmae:应用程序名 或 命令
          /parameters:传送给程序 或 命令的参数
        例子:
          @echo off
          echo 原窗口的信息
          start echo 新窗口的独立进程.
          echo 在启动新窗口后的输出

7. rem [comment]
        功能:在批处理中加入相应的说明信息,帮助读者理解批处理的功能.
        @echo off
        rem 显示 C;\ 文件列表
        dir C:\

8. if [not] exist filename command [else expression]
        功能:如果 filename 存在, 则执行 command 命令, 不存在, 则 执行 expression 表达式
        例子:
            @echo off
            if exist called.bat (
                echo called.bat 文件存在
            ) else (
                echo called.bat 文件不存在
            )

9. if [not] errorlevel number command [else expression]
  功能:当前一个程序或命令返回大于或等于 number 的退出代码时, 才能指定真的条件.
  @echo off
  ping 127.0.0.1>null
  if errorlevel 0 (
      echo 可以 ping 通主机 127.0.0.1 ; 它的返回值是: %errorlevel%
    ) else (
      echo 不可以 ping 通主机 127.0.0.1 ; 它的返回值是: %errorlevel%
    )

10. if [not] string1 == string2 command [else expression]
    功能:判断 string1 是否和string2 相同, 则条件为真
    例子:
        @echo off
        if "1234" == "1234" echo 它们是相等的.

11. if string1 compareop string2 command [else expression]
    功能:比较二个字符串
            EQU 代表等于,NEQ 代表不等于,LSS 代表小于,LEQ 代码小于或等于,GTR 代表大于,GEQ 代表大于或等于。
            /i:忽略大小写
    例子:
            @echo off
            ping 127.0.0.1>null
            if %errorlevel% EQU 0 echo 可以 ping 通主机 127.0.0.1 ; 它的返回值是: %errorlevel%

12. if defined variable command [else expression]
      功能:判断是否定义了 variable
      例子:
        @echo off
        set xxx="C:\"
        if defined xxx (
            echo 定义 xxx 为 %xxx%
        )

13 set [ [/a [expression]] [/p [variable=]] string ]
    功能:
        1. 查看环境变量
        2. 设置环境变量
    例子:
    13.1
          @echo off
          echo 显示所有环境变量
          set
          echo 显示以字母 home 开头的变量
          set home
    13.2
          @echo off
          set UserName = 陈德贵
          echo %UserName%
14.2
    @echo off
    set /a xxx = 87 + 87
    echo %xxx%
    set /a xxx = 87 + 23
    echo %xxx%
    讨论:变量不使用下划线

14 setlocal ... endlocal
    功能:设置局部变量/临时变量
    例子:
      @echo off
      setlocal
        path=d:\
        echo 局部环境变量path 的值:
        echo %path%
      endlocal
      echo 系统环境变量的值:
      set path

15. shift [/n]
    功能:更改批处理文件处理参数的起始位置
    例子:
      test.bat
      @echo off
      :round
        if "%1" == "" goto end
        echo %1
        shift
        goto round
      :end

    调用: test.bat 1 2 3 4 5 6
    讨论:当执行到 shift 时, %1 => %0, %2 => %1 ....

16. for {%variable|%%variable} in (set) do command [CommandLineOptions]
    功能:对一组不同的文件或数据进行循环处理
    参数说明:
      %variable 是命令提示符执行 for 命令
      %%variable 是批处理文件夹执行 for 命令
      set:一个或多个文件、目录、数值范围或文本字符串
      command:对 set 中的每个对象都执行的命令
      CommandLineOptions:命令使用的任何选项。
    例子:文件列表
      @echo off
      for %%f in (*.bat) do (
        echo %%f
      )

    例子:目录
      @echo off
      rem "/f" 表示 for 以解析方式工作
      for /f %%f in ('dir /ad/s/b E:\AsUnitExample') do (
          echo %%f
      )
      @echo off
      rem 这个不行。 太复制了
      rem "tokens" 参数只有一个 "*" ,表示 %%a 依次代表 "dir" 命令输出的每一行。
      for /f "tokens=*" %%a in ('dir') do (
        echo %%a
        rem "tokens=3*" 表示 %%b 代表 "%%a" 中第 3 个被分隔的字符串(如:"YY"),即目录大小。
        rem "*" 表示第 3 个字符串后的所有字符串都用一个变量来代替。
        echo "%%a" | find "个文件" > null && for /f "tokens=3*" %%b in ("%%a") do (
            echo 当前目录大小:%%b%%c
        )
      )

17. 通配符("*"、"?")
    用于灵活地表示文件和目录
    * 表示任意多个字符,包括零个字符
    ? 表示任意单个字符。

18 重定向符 ("<",">",">>")
  用于控制数据库的输入或输出方式
    <  符号的右边的数据源, 左边是数据目的地。
    >  符号的左边的数据源, 右边是数据目的地。替换现有的数据。
    >> 符号的左边的数据源, 右边是数据目的地。追加到现有的数据。
    @echo off
    echo dir /b /w >> auto.bat
    sort < auto.bat

19. 管道符("|")
    将一个命令的输出数据作为另一个命令的输入数据。
    find "something" test.txt | sort > result.txt
    type result.txt

20.
    && 符号连接两个命令时, 表示只有当符号前的命令执行成功后,才会执行符号后的命令。
    || 符号连接两个命令时, 表示只有当符号前的命令执行失败后,才会执行符号后的命令。
  
第三章 综合应用例子:
1)循环执行某个程序
    #echo off
    :again
    ping 32.2.4.5 > null
    if not %errorlevel% EQU 0 goto again
    start "可以正常 ping 通主机 32.2.4.5"
   
2)扩展:暴力破解密码 telnet 路由器
  
3)删除当前目录及子目录中所有的空文件夹
    @echo off
    cd . > listnull.txt
    for /f "delims=" %%i in ('dir /ad /b /s') do (
        dir /b "%%i" | findstr . > nul || echo %%i >> listnull.txt
    )
    for /f "tokens=*" %%i in (listnull.txt) do (
        rd /q "%%i"
    )
   
    简单的。 因为包含文件的文件夹不可能用rd 命令删除,结果就删除了所有空的文件夹。
    @echo off
    cd . > listnull.txt
    for /f "delims=" %%i in ('dir /ad/b/s') do (
        rd "%%i"
    )

第四章 作业:自动下载服务器上的代码,自动上传代码到服务器上,且自动部署代码。

辅助思路:
  1. 上传/下载:可以生成ftp 命令文件,再使用 ftp -s:command.txt 上传/获取.
  2. 自动部署:可以在服务器端运行BAT 文件,判断是否上传部署的bat 文件,执行部署完再删除。
  3. 可以使用其他语言实现以上的功能。如:PHP

第五章 介绍目前流行的构建脚本工具:
Java: Ant
C# : NAnt

参考资料:
FTP和BAT 文件结合实现文件上传
执行命令格式: ftp_upload.bat servername localfielname

下面代码中红色的部分需要换成你自己的设置
@set server=www.livebaby.cn -- 你服务器的ftp 地址
@set username=anonymous -- 你服务器的ftp 的用户名
@set password=anonymous -- 你服务器的ftp 的用户密码
@set localpath=d:\tool --你本地上传文件所在的目录
ftp_upload.bat 开始
@if "%1"=="" goto error_parm
@if "%2"=="" goto error_parm
@setlocal
  @set server=www.livebaby.cn
  @set username=anonymous
  @set password=anonymous
  @set localpath=d:\tool
  @echo off
  @echo /******************************/ >>upload.log
  @echo %date% %time% >>upload.log
  @echo upload file start >>upload.log
  if not exist %localpath%\%2 goto error_dir_local
  echo open %server% > ftp.txt
  echo user %username% >> ftp.txt
  echo %password% >> ftp.txt
  echo cd %1 >> ftp.txt
  echo bye>> ftp.txt
  ftp -s:ftp.txt -n | find "550"
  if not errorlevel 1 @goto error_dir_server
  echo open %server% > ftp.txt
  echo user %username% >> ftp.txt
  echo %password% >> ftp.txt
  echo cd %1 >> ftp.txt
  echo put %localpath%\%2 >> ftp.txt
  echo bye>> ftp.txt
  ftp -s:ftp.txt -n | find "invalid"
  if not errorlevel 1 @goto error_upload
  @echo off
  @echo upload file completed ! >>upload.log
  @goto putok
  :putok
  @echo upload %2 successflu ! >>upload.log
  @goto end
  :error_dir_server
  @echo server directory error! %1 >>upload.log
  @goto end
  :error_dir_local
  @echo local directory error! %localpath%\%2 >>upload.log
  @goto end
  :error_upload
  @echo upload file error! %localpath%\%2 >>upload.log
  @goto end
  :error_parm
  @echo parameter error(upload.bat serverpath localfilename) >>upload.log
  @goto end
  :end
  @echo bye. >>upload.log
@endlocal

汇编程序(MASM)的上机过程,先要对源代码进行汇编、连接,然后再执行,
@echo off
cls
echo This programme is to make the MASM programme automate
if "%1"=="" goto usage
if "%1"=="/?" goto usage
if "%1"=="help" goto usage
pause
masm %1.asm
if errorlevel 1 pause & edit %1.asm
link %1.obj & %1
:usage
echo Usage: This BAT file name [asm file name]
echo Default BAT file name is START.BAT
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注-册

本版积分规则

Archiver|手机版|小黑屋|DoDVip ( 桂ICP备14000730号 )

GMT+8, 2025-5-1 08:10 , Processed in 0.065737 second(s), 21 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表