知识点收集:Windows dos命令 & bat批处理文件

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值