Bat 脚本【批处理文件】
一:介绍
1. bat文件是dos下的批处理文件(无格式的文本文件,它包含一条或多条命令);
2. 文件拓展名可为.bat 或 .cmd;
3. 在命令提示下输入文件的名称,或者双击该文件,系统就会调用cmd.exe按照该文件中各个命令出现的顺序来逐个运行;
4. 编码方式
@rem 声明编码方式 UTF-8 GB2312
@rem chcp 65001 UTF-8的
@rem chcp 936 默认的GBK
@rem chcp 437 是美国英语
二:命令符:
1. start 是在新窗口运行调用的文件,call是在当前的窗口运行。 start /wait是指启动应用程序并等待其结束
-
@ : 隐藏@后面的命令(在命令行窗口中不显示当前正在运行的命令);
-
echo:
1. 打开回显或关闭请求回显;
echo on/off: off状态相当于加了@,不显示执行命令;
2. 也可用于显示消息;
echo xxxx
3. 如果没有任何参数,将显示当前回显设置;
echo off
echo
echo xxx
@echo xxx
echo on
echo
echo xxx
@echo xxx
- 注释(不执行语句):
1. rem:在echo on状态下仍然会打印出来;
2. @rem:在echo on/off状态下都不会打印出来;
3. :: :等同于@rem;
4. @goto tag
...xxxx...
:tag
/
goto 跳转到标签指定的位置并从标签的下一行命令开始执行
:xxx 标签[标签名 xxx]
echo
rem 11111
:: 22222
@rem 33333
@goto tag
44444
55555
66666
:tag
rem 00000
- call: (在.bat 中调用另一个 .bat)
1. 用于在一个批处理程序中调用另一个批处理程序;
2. 此调用过程中只是暂时挂起父批处理程序,当子批处理程序运行完毕后会返回父批处理程序继续执行;
call [Drive:][Path] FileName
# filename 参数必须具有 .bat 或 .cmd 扩展名;
# 与父批处理程序在同一目录下可直接使用文件名;
-
开启关闭外部程序: ( .exe)
# 所有的DOS命令和命令行程序都可以由start命令来调用, 绝对路径; start D:\..\xx.exe # 结束进程xxx.exe: 在任务管理器详细信息进程名称; taskkill /f /im xxx.exe
-
变量使用:
# 申明变量 %var # 条件 if / if not # 如果等于指定的字符串,则条件成立; if "%var"=="xxx" # do something # 如果有指定的文件[filename],则条件成立; if exist filename # do something # 如果返回码等于指定的数字[NUMBER],则条件成立; if errorlevel number # do something # 循环 for {%var|%%var} in (set) do command [ CommandLineOptions]
三:案例
-
获取本地ip v4, mac:
@echo off @for /f "tokens=16" %%i in ('ipconfig ^|find /i "ipv4"') do ( @set myip=%%i @goto out ) :out @echo local ip == %myip% @rem ========== @rem 获取mac地址 for /f %%i in ('getmac /nh ^| findstr "..-..-..-..-..-.."') do ( @echo %%i )
-
运行jar:
#编译.java javac xx.java #运行.class:(不需要后缀) @echo off start javaw xx 运行jar: @echo off 1. start -jar xxx.jar @rem 无对话框 2. start javaw -jar xxx.jar
-
管理入、出站规则:
# 重复调用add会多次创建 netsh advfirewall firewall delete rule name="minio" netsh advfirewall firewall add rule name="minio" dir=in protocol=tcp action=allow localport=9990-9991
-
注册系统环境变量:
@rem 注册 CATALINA_HOME(tomcat) @if {%CATALINA_HOME%}=="" ( @set CATALINA_HOME=D:\Harine\tomcat @set RegV=HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment reg add "%RegV%" /v "CATALINA_HOME" /d "%CATALINA_HOME%" /f @rem =============================================================================== @set JAVA_HOME=D:\Harine\java\jdk1.8 @set CATALINA_HOME=D:\Harine\tomcat @set CLASSPATH=.;%%JAVA_HOME%%\lib;%%JAVA_HOME%%\lib\tools.jar @set PATH=%%JAVA_HOME%%\bin;%%JAVA_HOME%%\jre\bin;%PATH% @rem ----使用新的注册方式,可立即生效:win7 以后----- @setx "JAVA_HOME" "%JAVA_HOME%" -M @setx "CATALINA_HOME" "%CATALINA_HOME%" -M @setx "CLASSPATH" "%CLASSPATH%" -M @setx "Path" "%PATH%" -M
-
以管理员身份运行:
@rem 1. 在该bat文件开头添加某些代码,实现该bat文件默认以管理员权限运行 @echo off&color 17 if exist "%SystemRoot%\SysWOW64" path %path%;%windir%\SysNative;%SystemRoot%\SysWOW64;%~dp0 bcdedit >nul if '%errorlevel%' NEQ '0' (goto UACPrompt) else (goto UACAdmin) :UACPrompt %1 start "" mshta vbscript:createobject("shell.application").shellexecute("""%~0""","::",,"runas",1)(window.close)&exit exit /B :UACAdmin cd /d "%~dp0" echo 当前运行路径是:%CD% echo 已获取管理员权限 @rem 3. bat脚本获取管理员权限; @echo off %1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit cd /d "%~dp0" @rem 4. bat脚本中以管理员权限执行命令; %1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c "^&chr(34)^&"%~0"^&chr(34)^&" ::","%cd%","runas",1)(window.close)&&exit
-
读取文件内容:
@if not exist licence.lc goto error @rem 读取文件内容,每行 for /f %%i in ('type licence.lc') do ( @echo %%i ) :error
四:问题
-
为什么.bat文件运行闪一下就没了?
原因:运行结束了,但你没有告诉它运行完要保持cmd打开状态; 解决方法: 1. 结尾加一个 pause;(会在运行结束之后提示按任意键继续) 2. 结尾写上 cmd /k;