过去: DOS系统 bat命令
现在: 假DOS cmd命令
echo 表示显示此命令后的字符
echo off 表示在此语句后所有运行的命令都不显示命令行本身
@ 与echo off相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。
call 调用另一个批处理文件(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)。
pause 运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue...的提示,等待用户按任意键后继续
rem 表示此命令后的字符为解释行(注释),不执行,只是给自己今后参考用的(相当于程序中的注释)。
:标号
GOTO标号
goto:eof 跳转到末尾
cls 清屏
---------------------------------------------------------set
set /P var=[string] 显示string,然后接受输入给var
set DB_PATH=%CD% 设置DB_PATH为当前目录
---------------------------------------------------------if
命令1 if [NOT] ERRORLEVEL 数字0-255 命令2 命令1返回值=数字时 执行命令2
if [NOT] string1==string2 命令 string1等于string2 执行命令
if [NOT] EXIST 文件 命令 文件存在 执行命令
---------------------------------------------------------for、shift
for 参数 %I in (command1) do command2 #(cmd)
for 参数 %%I in (command1) do command2 #(bat)
##遍历 command1的值赋予形式变量I,带到command2中参与命令的执行
/d 仅匹配command1目录,仅在当前路径,不进入下级目录
/R 递归,会进入下级目录
/L 迭代数值范围
/F 处理文件和一些命令的输出结果
for /F %%i IN (file) DO command
##for会依次将file中的文件打开,每一行作为一个元素 遍历
for /f "delims=+" %%i in (file) DO command
## delims=分隔符,每一行按照+号切割,取第1个元素 然后下一行
for /f "tokens=2 delims=+" %%i in (file) DO command
## tokens=角标, 每一行按照+号切割,取第2个元素 然后下一行
--------------------------------------------------------
& 连接符,命令格式 [...] command1 & command2
#用来分隔一个命令行中的多个命令。Cmd.exe 运行第一个命令,然后运行第二个命令。
&& 代表上一句执行成功,命令格式 [...] command1 && command2
#只有在符号 && 前面的命令成功时,才用于运行该符号后面的命令。Cmd.exe
%CD% 当前目录
%~dp0 为脚本自身目录
cd /d %~dp0 跳转到自身目录
^ 转义,末尾续行(转义了回车符号)
> < 管道赋值
│ 命令
Usage:第一条命令 │ 第二条命令
将第一条命令的结果作为第二条命令的参数来使用
;封号作用
dir c:\\;d:\\;e:\\;
相当于
dir c:\\
dir d:\\
dir e:\\
DOS命令如copy、dir、del、type、path、break、start等内部命令,以及ping、net、cmd、at、sort、attrib、fc、find等外部命令
#延迟
1.ping :时间精度为1秒,不够精确
@ping 127.0.0.1 -n 6
2.vbs start /wait cscript
3.choice 时间精确,CPU占用低,是最佳选择
choice /t 5 /d y /n >nul
/t:timeout,做出默认选择前暂停的秒数,可接受从0-9999的值。如果选择0就不会有暂停,直接选择默认选项。
/d:choice,在x秒后的默认选项。字符必须在/c选项指定的一组选择中,同时必须用/t指定暂停时间。
/n:在提示符中隐藏选项列表。提示前面的消息得到显示,选项依旧处于启用状态。注意,该命令默认选项是Y和N。
%date:~0,4% 年
%date:~5,2% 月
%date:~8,2% 日
%time% 时分秒
#网卡操作
ipconfig/release 以太网 #释放当前"以太网"的ip
ipconfig/renew 以太网 #向DHCP获取一个"以太网"的ip
netsh interface set interface "以太网" disabled #禁用"以太网"
netsh interface set interface "以太网" enabled #启用"以太网"
#开关防火墙:
netsh firewall set opmode mode=disable #win10已启用
netsh advfirewall set allprofiles state on
netsh advfirewall set allprofiles state off
#防火墙恢复默认配置:
netsh firewall reset
#最小化运行cmd
%1(start /min cmd.exe /c %0 :&exit)
用bat脚本批量执行sql文件, 操作数据库
例:输入数据库登录信息, 用sqlplus连接数据库,执行当前路径下的First.sql文件, 执行日志保存在ALL.log
@echo off
cd /d %~dp0
::color 2f
echo ************************************************************
echo ** **
echo ** esb srcb addtion **
echo ** **
echo ** **
echo ************************************************************
set DB_PATH=%CD%
echo current path is %DB_PATH%
echo 请输入网点管理平台安装的数据库的IP和端口(127.0.0.1:1521):
set /p HOST=
echo 请输入网点管理平台安装的数据库SID:
set /p ORACLE_SID=
echo 请输入指定的数据库用户名:
set /p DB_USER=
echo 请输入%DB_USER%的密码:
set /p DB_PWD=
echo 如果以上参数有问题,请Ctrl+C终止操作,若无问题,请按任意键创建表空间与用户
pause
cd %DB_path%
sqlplus %DB_USER%/%DB_PWD%@%HOST%/%ORACLE_SID% @./First.sql %DB_USER% >"%DB_PATH%\ALL.log"
set /p =安装完毕,详情请到“%DB_PATH%”目录下查看日志;
exit
项目要求密码不能明文显示,找到两种可用方法, 使用以下代码替换 " set /p DB_PWD= " 即可
1.XP系统使用 [不显示字符]
>"%temp%\GetPwd.vbs" echo WScript.Echo CreateObject("ScriptPW.PassWord").GetPassWord()
set DB_PWD=
set /p =请输入数据库用户[%DB_USER%]的密码:
2.win7及以上(内置powershell可用) [输入字符以*号显示]
echo 请输入数据库用户[%DB_USER%]的密码:
set "psCommand=powershell -Command "$pword = read-host -AsSecureString ; ^
$BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
for /f "usebackq delims=" %%p in (`%psCommand%`) do set DB_PWD=%%p