[TOC] ## 批处理命令 ### echo 基本所有的批处理开头第一句就是`@echo off` ### rem / :: 注释 ``` @echo off @rem 这是注释 :: 这是注释 dir pause ``` ### pause 暂停 ### call 调用其他 bat `call [[Drive:][Path] FileName ] [:label [arguments]] ` demo ``` call 2.bat ``` ### start 调用第三方软件 ``` start calc.exe start cmd ``` ### goto ``` demo: //code goto demo ``` ### set 显示,设置,删除变量 显示全部 ``` set ``` 显示 但个变量 ``` set a="123" set a ``` 删除变量 ``` set a= ``` ## 系统命令 所有命令按 `/?` 即可显示 help 如`dir /?` ### md 创建目录 ``` md \a\b\c #不存在则自动创建 ``` ### rd 删除目录 删除单个目录要求不为空 ``` rd abc #删除当前目录里的 abc 子目录,要求为空目录 rd /s/q d:/temp #删除 d:/temp 文件夹及其子文件夹和文件,不需要按 Y 确认 ``` ### del 删除文件 ``` del d:/test.txt #删除指定文件,不能是隐藏、系统、只读文件 del *.*删除当前目录里的所有文件,不包括隐藏、系统、只读文件,要求按 Y 确认 del /q/a/f d:/temp/*.*删除 d:/temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录 del /q/a/f/s d:/temp/*.*删除 d:/temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录 ``` ### ren 文件重命名 ``` ren 1.txt 2.bak #把 1.txt 更名为 2.bak ren *.txt *.ini #把当前目录里所有.txt文件改成.ini文件 ren d:/temp tmp #支持对文件夹的重命名 ``` ### cls 清屏 ### type 显示文件内容 类似`cat` ``` type *.txt ``` ### copy 拷贝文件 复制 1.txt 到4.txt ``` copy 1.txt 4.txt ``` 合并 ``` copy 1.txt + 2.txt 3.txt ``` ### title 修改cmd窗口标题 ``` title 测试标题 ``` ### ver 显示系统版本 ### date 和 time 日期和时间 ``` date #显示当前日期,并提示输入新日期,按"回车"略过输入 date/t #只显示当前日期,不提示输入新日期 time #显示当前时间,并提示输入新时间,按"回车"略过输入 time/t #只显示当前时间,不提示输入新时间 ``` ### find (外部命令)查找命令 ``` find "abc" c:/test.txt 在 c:/test.txt 文件里查找含 abc 字符串的行如果找不到,将设 errorlevel 返回码为1 find /i "abc" c:/test.txt 查找含 abc 的行,忽略大小写 find /c "abc" c:/test.tx t显示含 abc 的行的行数 ``` ### tre e显示目录结构 ``` tree 当前目录 tree D:/ d盘目录 ``` ### & 顺序执行多条命令,而不管命令是否执行成功 ### && 顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令 ### || 顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令 ### | 管道命令 前一个命令的执行结果输出到后一个命令 ``` dir . | find ".doc" ``` ### > / >> 覆盖内容 \ 追加内容 ### < 从文件中获得输入信息,而不是从屏幕上 在有些需要循环或者手动输入参数的场景,可以把输入提前放入文件中,在相应的位置读取 ``` @echo off echo 2005-05-01>temp.txt date <temp.txt del temp.txt ``` ### %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %* 命令行传递给批处理的参数 可以通过 `call /?` 查看更多参数的帮助 ``` %0 批处理文件本身 %1 第一个参数 %9 第九个参数 %* 从第一个参数开始的所有参数 ``` demo ``` @echo off echo %0 echo %1 echo %2 echo %* // 输入 5.bat a /b /c //输出 5.bat a /b a /b /c ``` 高级版 demo2 ``` //输入 demo.bat "/a" /b /c /d @echo off echo %1 // "/a" echo %~1 // /a echo %0 // 5.bat echo %~f0 // C:\Users\idcpj\Desktop\demo.bat echo %~d0 // C: echo %~p0 // \Users\idcpj\Desktop\ echo %~n0 // demo echo %~x0 // .bat echo %~s0 // C:\Users\idcpj\Desktop\demo.bat echo %~a0 // --a-------- echo %~t0 // 2019/05/13 11:00 echo %~z0 // 136 ``` ### 变量相关 ``` 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=3set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用set /a p="1&0" #"与"运算,要加引号。其它支持的运算符参见set/? set p= #取消p变量 set /p p= 请输入屏幕上显示"请输入",并会将输入的字符串赋值给变量p注意这条可以用来取代 choice 命令 ``` ``` %CD% #代表当前目录的字符串 %DATE% #当前日期 %TIME% #当前时间 %RANDOM% #随机整数,介于0~32767 %ERRORLEVEL% #当前ERRORLEVEL 值 %CMDEXTVERSION% #当前命令处理器扩展名版本号 %CMDCMDLINE% #调用命令处理器的原始命令行可以用echo命令查看每个变量值,如 echo %time% 注意 %time%精确到毫秒,在批处理需要延时处理时可以用到 ``` ### pushd 和 popd切换当前目录 ``` pushd c:/mp3 //or pushd . //切换到其他路径 popd 返回到 c:/mp3 ``` ### SC 服务器管理 ``` sc create aaa displayname= bbb start= auto binpath= "C:/WINDOWS/System32/alg.exe"创建服务,服务名称aaa,显示名称bbb,启动类型:自动可执行文件的路径"C:/WINDOWS/System32/alg.exe" sc description aaa "ccc"更改aaa的描述为ccc sc config aaa start= disabled binpath= "C:/WINDOWS/System32/svchost.exe -k netsvcs"更改aaa的启动类型:已禁用更改aaa的可执行文件的路径"C:/WINDOWS/System32/svchost.exe -k netsvcs" sc config aaa start= demand displayname= ddd更改aaa的启动类型:手动更改aaa的显示名称ddd sc start aaa启动aaa服务 sc stop aaa停止aaa服务 sc delete aaa删除aaa服务 ```