Windows批处理用法记录

查看手册

打开命令提示符窗口,如果对某个命令的用法不清楚,可以输入 /? 来查看手册。

cd /?

两种模式

一种是在黑框框里直接输入命令。

另一种是执行脚本文件。

需要注意的是,两种模式下稍有点区别,比方说:for命令里的变量,在命令行里是一个%,在批处理里是两个%。

C:\>for /?
对一组文件中的每一个文件执行某个特定命令。

FOR %variable IN (set) DO command [command-parameters]

  %variable  指定一个单一字母可替换的参数。
  (set)      指定一个或一组文件。可以使用通配符。
  command    指定对每个文件执行的命令。
  command-parameters
             为特定命令指定参数或命令行开关。

在批处理程序中使用 FOR 命令时,指定变量请使用 %%variable
而不要用 %variable。

文件夹操作

  1. rd 删除一个目录。

    /S 除目录本身外,还将删除指定目录下的所有子目录和文件。用于删除目录树。

    /Q 安静模式,带 /S 删除目录树时不要求确认

  2. del 删除一个或多个文件。

    /P 删除每一个文件之前提示确认。

    /F 强制删除只读文件。

    /S 删除所有子目录中的指定的文件。

    /Q 安静模式。删除全局通配符时,不要求确认

    /A 根据属性选择要删除的文件

用法记录

  1. 用两个%包起来的就是使用变量

    @echo off
    set var1=3
    echo %var1%
    pause
    @echo off
    chcp 65001
    set dirname=HelloWorld
    if not exist %dirname% (
        echo %dirname%文件夹不存在
    ) else (
        echo %dirname%文件夹存在
    )
    pause
  2. 如何接收用户输入

    @echo off
    chcp 65001
    set /p var1=请输入:
    echo 您输入的是%var1%
    pause
  3. 如何比较数字大小

    @echo off
    chcp 65001
    set var1=1
    set var2=2
    set var2a=2
    
    if %var2% EQU %var2a% (
        echo %var2%等于%var2a%
    )
    
    if %var2% LEQ %var2a% (
        echo %var2%小于或等于%var2a%
    )
    
    if %var2% GEQ %var2a% (
        echo %var2%大于或等于%var2a%
    )
    
    if %var1% NEQ %var2% (
        echo %var1%不等于%var2%
    )
    
    if %var1% LSS %var2% (
        echo %var1%小于%var2%
    )
    
    if %var2% GTR %var1% (
        echo %var2%大于%var1%
    )
    
    pause
  4. 如何使用for循环

    rem 基础用法:没有开关
    @echo off
    chcp 65001
    for %%i in (a,b,c,"你好!我的朋友") do (
        echo %%i
    )
    pause
    rem 基础用法:有/L,根据set里面的设置进行循环
    rem 格式:FOR /L %%variable IN (start,step,end) DO command
    @echo off
    chcp 65001
    for /L %%i in (1,2,6) do (
        echo %%i
    )
    pause

    /F的用法有点复杂,我就不写了,哈哈。

    /R 文件遍历

    FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
    
    检查以 [drive:]path 为根的目录树,指向每个目录中的 FOR 语句。
    如果在 /R 后没有指定目录规范,则使用当前目录。如果集仅为一个单点(.)字符,
    则枚举该目录树。
    rem 基础用法:有/R,文件夹遍历,打印AAA文件夹(包含子目录)下的所有png文件
    @echo off
    chcp 65001
    for /R C:\Users\xxx\Desktop\AAA %%i in (*.png) do (
        echo %%i
    )
    pause
    rem 基础用法:有/R,文件夹遍历,打印file文件夹下的所有子目录
    @echo off
    chcp 65001
    for /R D:\file %%i in (.) do (
        echo %%i
    )
    pause
    rem 基础用法:有/R,文件夹遍历,打印该bat所在目录及子目录下的所有文件
    @echo off
    chcp 65001
    for /R %%i in (*.*) do (
        echo %%i
    )
    pause
    rem 基础用法:有/R,文件夹遍历,打印该bat所在目录及子目录下的所有目录
    @echo off
    chcp 65001
    for /R %%i in (.) do (
        echo %%i
    )
    pause

写文件

输出重定向命令

> 清除文件中原有的内容后再写入

>> 追加内容到文件末尾,而不会清除原有的内容

主要将本来显示在屏幕上的内容输出到指定文件中

指定文件如果不存在,则自动生成该文件

@echo off
chcp 65001
set a1=1
set b1=2
set a2=3
set b2=4
echo %a1% > a.txt
echo %b1% >> b.txt
echo %a2% > a.txt
echo %b2% >> b.txt
echo 你看这是追加 >> b.txt
pause

延迟变量

批处理读取命令时是按行读取的(另外例如for命令等,其后用一对圆括号闭合的所有语句也当作一行),在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。

rem 这是没有使用延迟变量的例子,打印出来是2
@echo off
set var1=2
set var1=3 & echo %var1%
pause

变量延迟的启动语句是 setlocal enabledelayedexpansion ,并且变量要用一对感叹号包起来。

rem 这是使用延迟变量的例子,打印出来是3
@echo off
setlocal enabledelayedexpansion
chcp 65001
set var1=2
set var1=3 & echo !var1!
pause
rem 这是不使用延迟变量的例子,打印出来全是2
@echo off
chcp 65001
set var1=2
for /L %%i in (1,1,3) do (
    set /a var1=var1+1
    echo %var1%
)
pause
rem 这是使用延迟变量的例子,打印出来是2,3,4
@echo off
setlocal enabledelayedexpansion
chcp 65001
set var1=2
for /L %%i in (1,1,3) do (
    set /a var1=var1+1
    echo !var1!
)
pause

调用程序

rem 这是调用exe的例子,很简单,直接指明路径就可以了,也可以传入参数
@echo off
chcp 65001
for /R %%i in (*.png) do (
    D:\libwebp-1.2.2-windows-x64\bin\cwebp -q 100 %%i -o %%i -quiet
)
pause

参考文章

https://article.itxueyuan.com/KLep1R