search.png
关于我
menu.png
bat 脚本 - 基础

1、常用命令

需要注意,bat 脚本在cmd执行时,通常默认的编码为 GBK,并且换行风格为 CRLF。在最新的记事本编写bat时保存的编码默认已经是utf-8,需要做转换,否则有中文时会乱码。
通过 help + 命令 命令可以查看某个命令的用法。或者使用命令 command /?,例如 choice /?

cd

显示当前目录名或改变当前目录。

CHDIR [/D] [drive:][path]
CHDIR [..]
CD [/D] [drive:][path]
CD [..]

  ..   指定要改成父目录。

键入 CD drive: 显示指定驱动器中的当前目录。
不带参数只键入 CD,则显示当前驱动器和目录。

使用 /D 开关,除了改变驱动器的当前目录之外,
还可改变当前驱动器。

如果命令扩展被启用,CHDIR 会如下改变:

当前的目录字符串会被转换成使用磁盘名上的大小写。所以,
如果磁盘上的大小写如此,CD C:\TEMP 会将当前目录设为
C:\Temp。

CHDIR 命令不把空格当作分隔符,因此有可能将目录名改为一个
带有空格但不带有引号的子目录名。例如:

     cd \winnt\profiles\username\programs\start menu

与下列相同:

     cd "\winnt\profiles\username\programs\start menu"

在扩展停用的情况下,你必须键入以上命令。

dir

显示目录中的文件和子目录列表。

DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]
  [/O[[:]sortorder]] [/P] [/Q] [/R] [/S] [/T[[:]timefield]] [/W] [/X] [/4]

  [drive:][path][filename]
              指定要列出的驱动器、目录和/或文件。

  /A          显示具有指定属性的文件。
  属性         D  目录                R  只读文件
               H  隐藏文件            A  准备存档的文件
               S  系统文件            I  无内容索引文件
               L  重新分析点          O  脱机文件
               -  表示“否”的前缀
  /B          使用空格式(没有标题信息或摘要)。
  /C          在文件大小中显示千位数分隔符。这是默认值。用 /-C 来
              禁用分隔符显示。
  /D          跟宽式相同,但文件是按栏分类列出的。
  /L          用小写。
  /N          新的长列表格式,其中文件名在最右边。
  /O          用分类顺序列出文件。
  排列顺序     N  按名称(字母顺序)     S  按大小(从小到大)
               E  按扩展名(字母顺序)   D  按日期/时间(从先到后)
               G  组目录优先           -  反转顺序的前缀
  /P          在每个信息屏幕后暂停。
  /Q          显示文件所有者。
  /R          显示文件的备用数据流。
  /S          显示指定目录和所有子目录中的文件。
  /T          控制显示或用来分类的时间字符域
  时间段      C  创建时间
              A  上次访问时间
              W  上次写入的时间
  /W          用宽列表格式。
  /X          显示为非 8dot3 文件名产生的短名称。格式是 /N 的格式,
              短名称插在长名称前面。如果没有短名称,在其位置则
              显示空白。
  /4          以四位数字显示年份

可以在 DIRCMD 环境变量中预先设定开关。通过添加前缀 - (破折号)
来替代预先设定的开关。例如,/-W。

copy

将一份或多份文件复制到另一个位置。

COPY [/D] [/V] [/N] [/Y | /-Y] [/Z] [/L] [/A | /B ] source [/A | /B]
     [+ source [/A | /B] [+ ...]] [destination [/A | /B]]

  source       指定要复制的文件。
  /A           表示一个 ASCII 文本文件。
  /B           表示一个二进位文件。
  /D           允许解密要创建的目标文件
  destination  为新文件指定目录和/或文件名。
  /V           验证新文件写入是否正确。
  /N           复制带有非 8dot3 名称的文件时,
               尽可能使用短文件名。
  /Y           不使用确认是否要覆盖现有目标文件
               的提示。
  /-Y          使用确认是否要覆盖现有目标文件
               的提示。
  /Z           用可重新启动模式复制已联网的文件。
/L           如果源是符号链接,请将链接复制
               到目标而不是源链接指向的实际文件。

命令行开关 /Y 可以在 COPYCMD 环境变量中预先设定。
这可能会被命令行上的 /-Y 替代。除非 COPY
命令是在一个批处理脚本中执行的,默认值应为
在覆盖时进行提示。

要附加文件,请为目标指定一个文件,为源指定
数个文件(用通配符或 file1+file2+file3 格式)。

xcopy

复制文件和目录树。

XCOPY source [destination] [/A | /M] [/D[:date]] [/P] [/S [/E]] [/V] [/W]
                           [/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U]
                           [/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z] [/B] [/J]
                           [/EXCLUDE:file1[+file2][+file3]...] [/COMPRESS]

  source       指定要复制的文件。
  destination  指定新文件的位置和/或名称。
  /A           仅复制有存档属性集的文件,
               但不更改属性。
  /M           仅复制有存档属性集的文件,
               并关闭存档属性。
  /D:m-d-y     复制在指定日期或指定日期以后更改的文件。
               如果没有提供日期,则只复制
               源时间比目标时间新的文件。
  /EXCLUDE:file1[+file2][+file3]...
               指定含有字符串的文件列表。每个字符串
               在文件中应位于单独的一行。如果任何
               字符串与复制文件的绝对路径的任何部分相符,
               则排除复制该文件。例如,
               指定如 \obj\ 或 .obj 的字符串会分别
               排除目录 obj 下面的所有文件或带有
               .obj 扩展名的所有文件。
  /P           创建每个目标文件之前均进行提示。
  /S           复制目录和子目录,不包括空目录。
  /E           复制目录和子目录,包括空目录。
               与 /S /E 相同。可以用来修改 /T。
  /V           验证每个新文件的大小。
  /W           提示在复制前按键。
  /C           即使有错误,也继续复制。
  /I           如果目标不存在,且要复制多个文件,
               则假定目标必须是目录。
  /Q           复制时不显示文件名。
  /F           复制时显示完整的源文件名和目标文件名。
  /L           显示要复制的文件。
  /G           允许将加密文件复制到
               不支持加密的目标。
  /H           隐藏文件和系统文件也会复制。
  /R           覆盖只读文件。
  /T           创建目录结构,但不复制文件。不
               包括空目录或子目录。/T /E 包括
               空目录和子目录。
  /U           只复制已经存在于目标中的文件。
  /K           复制属性。一般的 Xcopy 会重置只读属性。
  /N           用生成的短名称复制。
  /O           复制文件所有权和 ACL 信息。
  /X           复制文件审核设置(隐含 /O)。
  /Y           取消提示以确认要覆盖
               现有目标文件。
  /-Y          触发提示,以确认要覆盖
               现有目标文件。
  /Z           在可重新启动模式下复制网络文件。
  /B           复制符号链接本身与链接目标。
  /J           复制时不使用缓冲的 I/O。推荐复制大文件时使用。
  /COMPRESS    如果适用,在传输期间请求网络
               压缩。

开关 /Y 可以预先在 COPYCMD 环境变量中设置。
这可能被命令行上的 /-Y 覆盖。

mkdir、md

创建目录。

MKDIR [drive:]path
MD [drive:]path

如果命令扩展被启用,MKDIR 会如下改变:

如果需要,MKDIR 会在路径中创建中级目录。例如: 假设 \a 不
存在,那么:

    mkdir \a\b\c\d

与:

    mkdir \a
    chdir \a
    mkdir b
    chdir b
    mkdir c
    chdir c
    mkdir d

相同。如果扩展被停用,则需要键入 mkdir \a\b\c\d

choice

CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]

描述:
    该工具允许用户从选择列表选择一个项目并返回所选项目的索引。

参数列表:
   /C    choices       指定要创建的选项列表。默认列表是 "YN"。

   /N                  在提示符中隐藏选项列表。提示前面的消息得到显示,
                       选项依旧处于启用状态。

   /CS                 允许选择分大小写的选项。在默认情况下,这个工具
                       是不分大小写的。

   /T    timeout       做出默认选择之前,暂停的秒数。可接受的值是从 09999。如果指定了 0,就不会有暂停,默认选项
                       会得到选择。

   /D    choice        在 nnnn 秒之后指定默认选项。字符必须在用 /C 选
                       项指定的一组选择中; 同时,必须用 /T 指定 nnnn。

   /M    text          指定提示之前要显示的消息。如果没有指定,工具只
                       显示提示。

   /?                  显示此帮助消息。

   注意:
   ERRORLEVEL 环境变量被设置为从选择集选择的键索引。列出的第一个选
   择返回 1,第二个选择返回 2,等等。如果用户按的键不是有效的选择,
   该工具会发出警告响声。如果该工具检测到错误状态,它会返回 255 的
   ERRORLEVEL 值。如果用户按 Ctrl+Break 或 Ctrl+C 键,该工具会返回 0
   的 ERRORLEVEL 值。在一个批程序中使用 ERRORLEVEL 参数时,将参数降
   序排列。

示例:
   CHOICE /?
   CHOICE /C YNC /M "确认请按 Y,否请按 N,或者取消请按 C。"
   CHOICE /T 10 /C ync /CS /D y
   CHOICE /C ab /M "选项 1 请选择 a,选项 2 请选择 b。"
   CHOICE /C ab /N /M "选项 1 请选择 a,选项 2 请选择 b。"

del

删除一个或多个文件。

DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
ERASE [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names

  names         指定一个或多个文件或者目录列表。
                通配符可用来删除多个文件。
                如果指定了一个目录,该目录中的所
                有文件都会被删除。

  /P            删除每一个文件之前提示确认。
  /F            强制删除只读文件。
  /S            删除所有子目录中的指定的文件。
  /Q            安静模式。删除全局通配符时,不要求确认
  /A            根据属性选择要删除的文件
  属性          R  只读文件            S  系统文件
                H  隐藏文件            A  准备存档的文件
                I  无内容索引文件      L  重新分析点
                O  脱机文件            -  表示“否”的前缀

如果命令扩展被启用,DEL 和 ERASE 更改如下:

/S 开关的显示句法会颠倒,即只显示已经
删除的文件,而不显示找不到的文件。

start

启动一个单独的窗口以运行指定的程序或命令。

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
      [/NODE <NUMA node>] [/AFFINITY <hex affinity mask>] [/WAIT] [/B]
      [command/program] [parameters]

    "title"     在窗口标题栏中显示的标题。
    path        启动目录。
    B           启动应用程序,但不创建新窗口。
                应用程序已忽略 ^C 处理。除非应用程序
                启用 ^C 处理,否则 ^Break 是唯一可以中断
                该应用程序的方式。
    I           新的环境将是传递
                给 cmd.exe 的原始环境,而不是当前环境。
    MIN         以最小化方式启动窗口。
    MAX         以最大化方式启动窗口。
    SEPARATE    在单独的内存空间中启动 16 位 Windows 程序。
    SHARED      在共享内存空间中启动 16 位 Windows 程序。
    LOW         在 IDLE 优先级类中启动应用程序。
    NORMALNORMAL 优先级类中启动应用程序。
    HIGH        在 HIGH 优先级类中启动应用程序。
    REALTIME    在 REALTIME 优先级类中启动应用程序。
    ABOVENORMAL 在 ABOVENORMAL 优先级类中启动应用程序。
    BELOWNORMAL 在 BELOWNORMAL 优先级类中启动应用程序。
    NODE        将首选非一致性内存结构(NUMA)节点指定为
                十进制整数。
    AFFINITY    将处理器关联掩码指定为十六进制数字。
                进程被限制在这些处理器上运行。

                将 /AFFINITY 和 /NODE 结合使用时,会对关联掩码
                进行不同的解释。指定关联掩码,以便将零位作为起始位置(就如将 NUMA
                节点的处理器掩码向右移位一样)。
                进程被限制在指定关联掩码和 NUMA 节点之间的
                那些通用处理器上运行。
                如果没有通用处理器,则进程被限制在
                指定的 NUMA 节点上运行。
    WAIT        启动应用程序并等待它终止。
    command/program
                如果它是内部 cmd 命令或批文件,则
                该命令处理器是使用 cmd.exe 的 /K 开关运行的。
                这表示运行该命令之后,该窗口
                将仍然存在。

                如果它不是内部 cmd 命令或批文件,则
                它就是一个程序,并将作为一个窗口化应用程序或
                控制台应用程序运行。

    parameters  这些是传递给 command/program 的参数。

注意: 在 64 位平台上不支持 SEPARATE 和 SHARED 选项。

通过指定 /NODE,可按照利用 NUMA 系统中的内存区域的方式
创建进程。例如,可以创建两个完全
通过共享内存互相通信的进程以共享相同的首选 NUMA 节点,
从而最大限度地减少内存延迟。只要有可能,
它们就会分配来自相同 NUMA 节点的
内存,并且会在指定节点之外的处理器上自由运行。

    start /NODE 1 application1.exe
    start /NODE 1 application2.exe

这两个进程可被进一步限制在相同 NUMA 节点内的指定处理器
上运行。在以下示例中,application1 在
节点的两个低位处理器上运行,而 application2
在该节点的其后两个处理器上运行。该示例假定指定节点至少具有四个逻辑处理器。请注意,节点号可更改为该计算机的任何有效节点号,
而无需更改关联掩码。

    start /NODE 1 /AFFINITY 0x3 application1.exe
    启动 /NODE 1 /AFFINITY 0xc application2.exe

如果命令扩展被启用,通过命令行或 START 命令的外部命令
调用会如下改变:

将文件名作为命令键入,非可执行文件可以通过文件关联调用。
    (例如,WORD.DOC 会调用跟 .DOC 文件扩展名关联的应用程序)。
    关于如何从命令脚本内部创建这些关联,请参阅 ASSOC 和
     FTYPE 命令。

执行的应用程序是 32 位 GUI 应用程序时,CMD.EXE 不等应用
    程序终止就返回命令提示符。如果在命令脚本内执行,该新行为
    则不会发生。

如果执行的命令行的第一个符号是不带扩展名或路径修饰符的
    字符串 "CMD""CMD" 会被 COMSPEC 变量的数值所替换。这
    防止从当前目录提取 CMD.EXE。

如果执行的命令行的第一个符号没有扩展名,CMD.EXE 会使用
    PATHEXT 环境变量的数值来决定要以什么顺序寻找哪些扩展
    名。PATHEXT 变量的默认值是:

        .COM;.EXE;.BAT;.CMD

    请注意,该语法跟 PATH 变量的一样,分号隔开不同的元素。

查找可执行文件时,如果没有相配的扩展名,看一看该名称是否
与目录名相配。如果确实如此,START 会在那个路径上调用
Explorer。如果从命令行执行,则等同于对那个路径作 CD /D。

call

  1. 第一种用法,也就是最常用的一种,调用另一个批处理,在被调用的批处理执行完后在执行call下面的命令。如:
@echo off

call a.bat

dir c:\

pause

如果在被调用的批处理里面有参数,调用的时候需要在后面加上参数。
如:
a.bat内容:


@echo off

echo %0 %1

b.bat内容:

@echo off

call a.bat hello

dir c:\

pause

那么,在执行b.bat的时候,会将hello赋值给%1,而%0代表a.bat自己。

(在批处理中,可以使用%*代表所有参数%1-%9代表9个参数,%0代表批处理自己,其扩展用法见call /?,在讲for的时候也会讲到)

goto :eof的用法,如:

a.bat内容:

@echo off

echo %0 %1

goto :eof

b.bat内容:

@echo off

call a.bat hello

dir c:\

pause

这里,在显示完hello后,会执行dir c:\并暂停,如果将goto :eof改成exit,在显示完hello后就会自动退出。因为goto :eof后会转到a.bat结尾,即只退出a.bat然后会继续执行dir;由于call a.bat,在执行a.batb.bat是一个CMD窗口,exit的话就会直接退出这个窗口,这就是goto :eofexit区别。

  1. call的第二种用法,调用一个命令,如:call ping 127.1,这和直接ping 127.1看似是一样的,但还是有区别的。主要用法就是call set,在后面讲延迟环境变量的时候慢慢体会。
  2. call的第三种用法,调用一个应用程序,call notepad.exe。call可以这么用,但一般在调用应用程序的时候会使用start,很少用call。
  3. call的第四种用法,调用本批处理中的一个标签,可以用来实现函数。和 直接使用 goto 相比,call 调用完后会回到原位置继续执行。如:
@echo off

call :no1

start notepad.exe

exit

:no1

start calc

ping /n 2 127.1>nul

在这里会先打开计算器,然后打开记事本。在call标签的时候要加上:

2、变量声明

SET [variable=[string]]

  1. 等号两边不要有空格,带了空格会有奇怪的问题
  2. 变量值包含特殊字符需用双引号
    例如:`set "a=1&b=2"
  3. 避免使用系统环境变量同名的自定义变量
    path , date , errorlevel
  4. 声明多个变量 /a
    使用连等把多个变量赋值成数字 set /a x=y=100
    逗号分隔把多个变量赋值成数字 set /a x=1,y=2
    
  5. 显示所有的变量的值
    @echo off  
    set
    pause
    
  6. 打印某个变量的值
    在批处理中我们要引用这个变量就把var变量名用两个%(百分号)扩起来,如%var%
    @echo off  
    set var=123  
    echo %var%  
    pause
    

3、注释

bat 的注释和常用语言的注释大不相同。rem::代表单行注释,使用 goto 语法来实现多行注释。"::"其实就是不规范的标签名。

@echo off
rem 这是注释

:: 这是注释

goto :comment1
这是多行注释
这是多行注释
这是多行注释
:comment1

echo test comment .. hengyumo

pause

4、条件判断

if命令有以下5钟用法

if "字符串1"=="字符串2" command 语句
判断两个字符串是否相等
if 数值1 equ 数值2 command 语句
判断两个数值是否相等
if exist filename command 语句
判断判断驱动器,文件或文件夹是否存在
if defined 变量 command 语句
判断变量是否已经定义
if errorlevel 数值 command 语句
判断上个命令的返回值

示例

判断文件是否存在
if exist d:\test.txt (echo D盘下有test.txt存在) else (echo D盘下不存在test.txt)

判断字符串是否相等
if "abc"=="xyz" (echo 字符串abc等于字符串xyz) else (echo 字符串abc不等于字符串xyz)

判断两个数值是否相等
if 1 equ 2 (echo 1等于2) else (echo 1不等于2)

判断变量是否已经定义
if defined str (echo 变量str已经被赋值,其值为%str%) else (echo 变量str的值为空)

判断字符串是否相等的时候,if会区分大小写,比如,单纯的if语句会认为字符串abc和字符串Abc不相同,若不想区分大小写,则需要添 /i加开关,使用 if /i "字符串1"=="字符串2" 的格式;
另外,等于符号是连续的”==“而非单独的”="。

判断两个数值之间的大小关系,除了等于用equ之外,还有其他的关系符号,所有适用于if语句的关系符号见下表 ,和常见的 lt、gt并不相同。

中文含义 关系符 英文解释
等于 equ equal
大于 gtr greater than
大于或等于 geq greater than or equal
小于 lss less than
小于或等于 leq less than or equal
不等于 neq no equal

via

else if

@echo off
set /p num1=请第一个输入数字:
set /p num2=请第二个输入数字:
if "%num1%" gtr "%num2%" (
echo 第一个数字大
) ELSE if "%num1%" EQU "%num2%" (
echo 一样大
) ELSE (
echo 第二个数字大 
)
pause>nul

errorlevel 判断执行结果

批处理中的返回值一般表示了上个命令的执行结果(成功/失败/等)
每个命令执行完毕后返回值都会做相应的更改,一般返回值为0表示成功,1表示失败

@echo off
echo;>>%systemroot%\test.txt
if errorlevel 0 ( echo 写入成功! ) else echo 写入失败
pause>nul

利用 choice 命令判断返回值。

@echo off
choice /C ABC /T 10 /D A /M "plese choice a/b/c"
if errorlevel 3 echo You choose the C
if errorlevel 2 echo You choose the B
if errorlevel 1 echo You choose the A
pause>nul

5、循环

6、函数

通过标签和 goto:eof配合来定义函数,通过call来进行函数调用。

一个简单的函数,打印两个数的和,参数是3和5、2和2,打印的结果是8、4。其中函数中的 %1代表传入的第一个参数,函数的 %2代表第二个参数,以此类推,最多是到 %9。函数无法直接返回值,只能通过修改全局变量的方式返回值。传递的参数,如果是变量,则需要通过%val%先解引用。不建议用函数封装过于复杂的功能。如果确实有这样的需要,可以用别的语言实现,然后再使用bat调用。尽可能保证 bat 脚本足够简单,流程一目了然。

当参数以引号开头时,%~1会自动将引号删除,而 %1不会。

@echo off

call:add 3,5

set /a x=y=2
call:add %x% %y%

pause

:add
set /a sum=%1+%2
echo %sum%
goto:eof

7、特殊命令

1、set /p 读取输入

@echo off
set /p input=请输入一个字符串:
echo %input%
pause

读取文件的第一行内容

C:\>echo BatHome>1.txt
C:\>set /p input=<"1.txt"
C:\>echo %input%
BatHome

批处理光标回退(非cls清屏)动画效果演示

@echo off
echo bbs.bathome.net
set /p =光标回退(非cls清屏)动画效果演示:<nul
for /l %%i in (1,1,10) do (
    set /p =%%i<nul
    set /p =<nul
    ping -n 2 127.1 >nul
)
echo,
pause

2、使用 set /a 命令进行数学运算

数字精确度限为 32 位。不支持直接计算浮点数。

C:\>set x=1
C:\>set y=2
C:\>set /a n=%x%+%y%
3
C:\>set /a n=x+y 
3

取余

C:\>set /a n=3%2
1

逻辑运算的特殊字符需要使用双引号

C:\>set /a "m=1<<10"
1024
C:\>set /a n=1"<<"10
1024

版权声明

知识共享许可协议 本文章由作者“衡于墨”创作,转载请注明出处,未经允许禁止用于商业用途

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
发布时间:2023年01月26日 16:03:40

评论区#

还没有评论哦,期待您的评论!

关闭特效