Windows dos命令 & bat批处理文件
总结自己遇到的一些常用命令 & 问题
帮助
<命令> /?
或help <命令>
:显示该命令的帮助内容
设置变量:set
set var1=abc
:之后使用 %var1% 就可以获取值 abc
echo
-
@echo off
:表示执行了这条命令后关闭所有命令(包括本身这条命令)的回显;echo off
执行以后,后面所有的命令均不显示回显,但本条命令是显示的- 详见:https://blog.csdn.net/fly_as_tadpole/article/details/85177379
-
echo xxx
:打印xxx到控制台,这里的xxx可以是系统环境变量(例如%JAVA_HOME%),也可以是之前set的变量a(%a%),也可以是类似%cd%之类的
chcp
chcp 65001
:为了在命令行正确显示中文
call和start
- 参考:
- https://www.cnblogs.com/Braveliu/p/5078283.html
- https://blog.csdn.net/weixin_38316697/article/details/91389811
call
-
call xx.exe
:相当于在本窗口运行了xx.exe,执行完这个程序后才会执行下面的命令
,如果此exe阻塞会导致下面的命令执行不了 -
一个用处:如果直接在bat文件执行 mvn -v ,因为mvn自带一个退出,所以mvn命令执行完之后直接就退出了,在这后面的命令就全部运行不了。此时可以使用 call mvn -v
-
一个用法:获取其他bat文件中的变量
- a.bat
set value=10
- b.bat
call a.bat echo %value%
start
-
不阻塞后面的命令执行
-
start xx.exe
:直接弹出另一个窗口运行xx.exe -
start /b xx.exe
:在本窗口运行xx.exe
exit
-
help exit
:EXIT [/B] [exitCode] /B 指定要退出当前批处理脚本而不是 CMD.EXE。如果从一个 批处理脚本外执行,则会退出 CMD.EXE exitCode 指定一个数字号码。如果指定了 /B,将 ERRORLEVEL 设成那个数字。如果退出 CMD.EXE,则用那个数字设置 过程退出代码。
-
exit 结合 start、call、errorlevel的试验
REM 文件: 1.bat @echo off echo in 1.bat ping -n 3 127.0.0.1>nul exit 10 ===>[1]
REM 文件: 2.bat @echo off 1.bat ===>[2] echo in 2.bat, after 1.bat, ret: %errorlevel% pause
-
不同情况下,执行 2.bat 的结果:
[1]:1.bat 中exit的方式
[2]:2.bat 中调用 1.bat 的方式
taskkill
taskkill /f /t /im
- /T 终止指定的进程和由它启用的子进程。
- /F 指定强制终止进程。
- /IM imagename 指定要终止的进程的映像名称。通配符 '*'可用来指定所有任务或映像名称。
拷贝
- xcopy /e /y /i
- xcopy:拷贝目录
- /e: 复制目录和子目录,包括空目录。
- /y:取消提示以确认要覆盖现有目标文件。
- /i: 如果目标不存在,且要复制多个文件,则假定目标必须是目录。
删除
- rd/s/q <path_name>:
- rd是删除命令
- /s是删除本身目录及其所有的子目录与文件,用于删除目录树
- /q是安静模式,删除目录树时不要求确认
获取命令返回值
-
直接使用
%errorlevel%
即可获得上一条执行的命令的返回值。 -
常见返回值含义:
- 0: 正常返回
- 1: (如果是进程返回的)表示进程被kill了
-
举例:利用返回值,配合if else,实现当进程存在时kill,不存在时报告不存在信息
set doe_exe_name=PRO.exe :: Shutdown doe if exists tasklist|find /i "%doe_exe_name%" if %errorlevel% == 0 (taskkill /f /t /im %doe_exe_name%) else (echo %doe_exe_name% not found)
cd命令
-
参考:https://blog.csdn.net/jiangfuqiang/article/details/4822942
-
cd命令是不会修改当前的drive的。比如如果当前目录是E:/execute,执行
cd c:/temp
命令之后,当前目录不会产生任何变化。 -
要保证当前目录修改成功,必须加/d参数,即
cd /d c:/temp
%%
-
%cd%:当前目录(结尾不带\)
-
%~dp0:批处理文件所在的目录(结尾带\),在批处理文件中写
cd /d %~dp0
,意思是:更改当前目录为批处理本身的目录
if else
多选符合if…else语句
- 参考:https://www.jianshu.com/p/f0bde7d355a4
这个主要是针对一层if,然后有很多个else if的情况的坑
-
正确写法:
if %option% == 3 ( echo three ) ^ else if %option% == 2 ( echo two ) ^ else if %option% == 1 ( echo one ) ^ else ( echo zero )
或者
if %option% == 3 ( echo three ) else if %option% == 2 ( echo two ) else if %option% == 1 ( echo one ) else ( echo zero )
未解之谜(多层if else的嵌套)
- 比如有三个bat文件:
a.bat
set value=10
set op=10
b.bat
@echo off
echo call a
call a.bat
echo call c
call c.bat
pause
c.bat
@echo off
if %value% == 10 (
echo value: %value%
if %op% == 10 (
echo op: %op%
) else (
echo op not 10
)
) else (
echo value not 10
)
-
调用逻辑:a.bat设置了一些变量,b.bat先从a.bat获取这些变量,再调用c.bat(c.bat使用了这些变量)
-
诡异的情况:
此时调用b.bat,输出为:
call a call c value: 10 op: 10 请按任意键继续. . .
但是如果把c.bat里第4行的
echo value: %value%
去掉,就会出错,后来试又不出错。。。几种奇怪的情况如下:
注释
rem,@rem和:: 在echo on还是off的时候的区别
- 参考:https://jingyan.baidu.com/article/a3a
ad71a0b7449b1fb009602.html