worldsite / blog.sc

Blogging soul chat, stay cool. via: https://blog.sc
3 stars 0 forks source link

常用批处理 #46

Open suhao opened 2 years ago

suhao commented 2 years ago

本文整理了工作中常用的批处理命令,汇总后可以便于查找和提高工作效率。

批处理

批处理是一系列DOS命令,通常用于自动执行重复性任务。批处理也称为批处理脚本,就是对某个对象进行批量处理,批处理文件扩展名为bat/cmd。批处理类似于Unix系统中的shell脚本。

批处理的常见规则如下:

常用命令

文件夹管理

文件管理

网络命令

系统管理

常用命令和解析

  1. 回显命令:echo和@

    @                #关闭单行回显
    echo off         #从下一行开始关闭回显
    @echo off        #从本行开始关闭回显,一般批处理第一行都是这条命令
    echo on          #从下一行开始打开回显
    echo             #显示当前回显状态
    echo.            #输出一个回车换行空白行
  2. 错误码

    echo %errorlevel%   #每个命令运行结束可以用这个命令行格式查看返回码,默认值为0,执行出错会设置为1
  3. 显示文件夹内容:dir

    dir              #显示当前目录中的文件和子目录
    dir /a           #显示当前目录中的文件和子目录,包含隐藏文件和系统文件
    dir c: /a:d      #显示当前目录中的目录
    dir c: /a:-d     #显示当前目录中的文件
    dir c: /b/p      #b显示文件名,p分页显示
    dir *.exe /s     #显示当前目录和子目录的所有exe文件
  4. 目录操作及文件:cd/md/rd

    cd /d D:\
    md d:\a\b\c       #如果不存在将自动创建中级目录
    rd abc            #删除当前目录里的abc子目录,要求为空目录
    rd /s/q d:\temp   #删除文件夹及其子文件夹和文件,q指示为安静模式
    del d:\test.txt   #删除指定文件不能是隐藏、系统、只读文件
    del /q/a/f d:\temp\*.*    #删除temp文件夹里的所有文件,包含隐藏、只读、系统文件,不包含子目录
    del /q/a/f/s d:\temp\*.*  #同上,同时删除子文件夹里的文件,不包含子目录
  5. 拷贝文件:copy

    copy c:\t.txt d:\b.bak   #复制文件并重命名
    copy con test.txt        #从屏幕上等待输入,按ctrl+z结束输入,输入内容存为text.txt文件;con-屏幕,prn-打印机,nul-空设备
    copy 1.txt + 2.txt 3.txt #合并1.txt和2.txt的内容保存到3.txt,如果不指定3.txt则存到1.txt
    copy 1.txt +             #复制文件到自己,实际是修改文件日期
  6. 时间日期

    date                     #显示当前日期,/t控制不提示输入新日期,输入时按回车可以略过输入
    time                     #显示当前时间,/t控制不提示输入新时间,输入时按回车可以略过输入
  7. 跳转命令:goto和:

    :label                   #行首为:表示该行是标签行,标签行不执行操作
    goto lable               #跳转到指定的标签那一行
  8. 外部命令

    find "abc" c:\test.txt    #find查找命令,在txt文件里查找含abc字符串的行,如果找不到将errorlevel返回码设为1
    find /i "abc" c:\test.txt #查找,忽略大小写
    find /c "abc" c:\test.txt #显示含abc的行的函数
    more c:\test.txt          #逐屏显示文件内容
  9. 逻辑命令和管道命令:&、&&、||和|

    &                         #顺序执行多条命令,而不管命令是否执行成功
    &&                        #顺序执行多条命令,当遇到执行出错的命令后将不再执行后续命令
    find "ok" c:\test.txt && echo 成功
    ||                        #顺序执行多条命令,当碰到执行正确的命令后将不执行后续命令
    find "ok" c:\test.txt || echo 不成功
    |                         #管道命令
    dir *.* /s/a | find /c ".exe" #先执行dir命令对其输出结果执行后边的find命令
  10. 输出重定向:>和>>,主要将本来显示在屏幕上的内容输出到指定文件,若文件不存在则自动创建

    >                             #清除文件中原有的内容后再写入
    >>                            #追加内容到文件末尾而不会清除原有内容
    type c:\test.txt >prn         #屏幕上不显示文件内容,转向输出到打印机
    echo hello world > con        #在屏幕上显示,实际上所有输出默认都为con
    copy C:\test.txt f: >nul      #拷贝文件,不显示复制成功提示;如果f盘不存在会显示出错信息
    copy c:\test.txt f: >nul 2>nul#拷贝文件,不显示复制成功提示,也不显示出错信息
    echo ^^W ^> ^W > c:\test.txt  #生成的文件内容为 ^W > W, ^和>是控制命令,要输出到文件需要在前面加个^符号
  11. 输入信息重定向:<,从文件中获得输入信息而不是屏幕上,用于data time lable等需要等待输入的命令

    @echo off
    :: 不等待输入直接修改当前日期
    echo 2022-09-01 > temp.txt
    data < temp.txt
    del temp.txt
  12. 命令行传递给批处理的参数:%0、%1、%*

    
    %0                           #批处理文件本身
    %1                           #第一个参数
    %2                           #第二个参数
    %9                           #第九个参数
    %*                           #从第一个参数开始的所有参数
    %~1                          #删除引号,扩充%1
    %~f1                         #将%1扩充到一个完全合格的路径名
    %~d1                         #仅将 %1 扩充到一个驱动器号
    %~p1                         #仅将 %1 扩充到一个路径
    %~n1                         #仅将 %1 扩充到一个文件名
    %~x1                         #仅将 %1 扩充到一个文件扩展名
    %~s1                         #扩充的路径指含有短名
    %~a1                         #将 %1 扩充到文件属性
    %~t1                         #将 %1 扩充到文件的日期/时间
    %~z1                         #将 %1 扩充到文件的大小
    %~$PATH : 1                  #查找列在 PATH 环境变量的目录,并将 %1扩充到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩充到空字符串

14. 设置变量: set,引用变量可在变量名前后加 % ,即 %变量名%

set #显示目前所有可用的变量,包括系统变量和自定义的变量 echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用 set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1 set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2 echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2 echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2 echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2 echo %p:~0,3% #显示前3个字符,即aa1 echo %p:~-2% #显示最后面的2个字符,即b2 echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2 echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2 echo %p:bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2 set p=%p:bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2 set /a p=39 #设置p为数值型变量,值为39 set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3 set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用 set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/? set p= #取消p变量 set /p p=请输入 #屏幕上显示”请输入”,并会将输入的字符串赋值给变量p,注意可以用来取代 choice 命令


15. for循环命令

这个比较复杂,请对照 for/? 来看 for %%i in (c: d: e: f:) do echo %%i 依次调用小括号里的每个字符串,执行 do 后面的命令 注意%%i,在批处理中 for 语句调用参数用2个% 默认的字符串分隔符是"空格键","Tab键","回车键" for %%i in (.txt) do find "abc" %%i 对当前目录里所有的txt文件执行 find 命令 for /r . %%i in (.txt) do find "abc" %%i 在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行 for /r . %%i in (.) do echo %%~pni 显示当前目录名和所有子目录名,包括路径,不包括盘符 for /r d:mp3 %%i in (.mp3) do echo %%i>>d:mp3.txt 把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去 for /l %%i in (2,1,8) do echo %%i 生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1 for /f %%i in ('set') do echo %%i 对 set 命令的输出结果循环调用,每行一个 for /f "eol=P" %%i in ('set') do echo %%i 取 set 命令的输出结果,忽略以 P 开头的那几行 for /f %%i in (d:mp3.txt) do echo %%i 显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称 for /f "delims=" %%i in (d:mp3.txt) do echo %%i 显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称 for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a 对 dir 命令的结果,跳过前面5行,余下的每行取第4列 每列之间的分隔符为默认的"空格" 可以注意到 dir 命令输出的前5行是没有文件名的 for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do ( echo %%a echo %%b echo %%c ) 对 date /t 的输出结果,每行取1、2、3列 第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列 分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格" 其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的 for /f "tokens=2 delims=- " %%a in ('date /t') do echo %%b 取第2列给 %%a ,其后的列都给 %%b


16. 其他

title 标题 #设置cmd窗口标题 cls #清屏 ver #显示系统版本 vol #显示卷标 label #显示卷标,同时提示输入新卷标 pause #暂停命令 rem #注释命令,注释不执行操作 :: #注释命令,注释不执行操作 start #批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令 call #批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行 choice #选择命令,让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……


# 常用实例

1. 管理员权限执行

@ECHO OFF

Rd "%WinDir%\system32\test_permissions" >NUL 2>NUL Md "%WinDir%\System32\test_permissions" 2>NUL||(Echo 请使用右键管理员身份运行!&&PAUSE >NUL&&EXIT) Rd "%WinDir%\System32\test_permissions" 2>NUL


2. 删除Visual Studio编译的临时文件

@echo off echo ---------------------------------------------------- echo Press any key to delete all files with ending: echo .aps .idb .ncp .obj .pch .tmp *.sbr echo Visual c++/.Net junk echo ----------------------------------------------------

del /F /Q /S .aps .idb .ncp .obj .pch .sbr .tmp .bsc .ilk .res .ncb .opt .suo .manifest *.dep


3. 生成目录链接

mklink /D E:\dev\intermediate "F:\cache\build\dev"


4. 进入bat文件所在目录

cd /d "%~dp0"


注意这里的~dp是变量扩充,变量%0是批处理的路径。