【bat】bat命令实践
【1】变量使用,获取当前年月日,字符串截取
net use Z: \\192.168.135.1\share_linux a123456! /user:chaoqun.guo set bath=c:\backup\ set today=%date:~0,4%%date:~5,2%%date:~8,2% ::%date:~0,4%,表示从第0下标开始获取4位长度的值 set db_name=test set filename=%db_name%%today% path="C:\Program Files\WinRAR" winRAR a %bath%%filename%.rar %bath%%filename%.bak copy %bath%%filename%.rar \\192.168.135.1\share_linux /Y net use \\192.168.135.1\share_linux /delete
删除一个字符串最后一个字符
set a=123456 echo %a:~,-1%
如何让当前系统时间在for循环里面实时显示?
如下:我们在for里打印时间,输出的是 for 循环第一次运行的时候的时间,后面无论多少次一直是一样的;
最终修改
exec.bat
@echo on setlocal enabledelayedexpansion for /l %%i in (1,1,10000000) do ( call time.bat 1>>error.log sqlcmd -S 10.20.50.55,1433 -d test -i select.sql >>sql.log 2>>error.log ping 10.20.50.55 >nul )
time.bat
echo %date%%time%
【2】DOS/sql server下使用net use
Rem dos net use Z: \\192.168.135.1\share_linux a123456! /user:chaoqun.guo net use \\192.168.135.1\share_linux /delete Rem sql server EXEC sp_configure 'show advanced options',1; RECONFIGURE WITH OVERRIDE; EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE WITH OVERRIDE EXEC master.dbo.xp_cmdshell 'net use x: \\219.129.239.217\master_1_temp "AO%7Ro*AD35@bTa" /user:"7RoAdmin"'
【3】如何写注释?Rem
Rem 注释内容
【4】快速把 bat 安装成定时任务
、注意,这里 /ru SYSTEM 很有可能导致运行不成功,建议 administrators
/* --ddt_db_backup_install.bat @echo off color 2 echo. echo ----------------- ddt_db_backup_install -------------------- echo ----------------- ddt_db_backup_install -------------------- > install.log echo. schtasks /delete /TN ddt_db_backup /F schtasks /delete /TN ddt_db_bakcup /F schtasks /create /ru SYSTEM /tn "ddt_db_backup" /tr "C:\shell\ddt_db_bakcup.bat" /sc daily /st 06:10:00 /F IF ERRORLEVEL 1 (ECHO Error: ddt_db_backup install error ECHO Error: ddt_db_backup install error >> install.log 2>&1 goto error) echo OK echo OK >> install.log 2>&1 :ok echo. echo ------------------- Install Success --------------------- ping -n 2 127.1>nul ping -n 2 127.1>nul ping -n 2 127.1>nul goto end :error echo. echo. ping -n 2 127.1>nul ping -n 2 127.1>nul ping -n 2 127.1>nul ping -n 2 127.1>nul ping -n 2 127.1>nul ping -n 2 127.1>nul ping -n 2 127.1>nul ping -n 2 127.1>nul ping -n 2 127.1>nul exit 1 :end exit */ /* --ddt_db_backup.bat --add the code for delete override files if exist F:\Db_Tank_Back (set data_path=F:\Db_Tank_Back) else if exist E:\Db_Tank_Back (set data_path=E:\Db_Tank_Back) else (if exist D:\Db_Tank_Back (set data_path=D:\Db_Tank_Back) ) forfiles /p %data_path% /s /m *.7z /d -7 /c "cmd /c del @path" */
【5】不换行打印输出,echo输出空行
set /p="测试引擎服务是否启动......"<nul Rem 输出空行 echo. 或者 echo: , .可以被替换成 :;/ 等符号
【6】上一条命令执行成功与否 errorlevel
1为失败,0为成功
echo 开始重命名数据库/创建数据库...... set /p="开始重命名数据库/创建数据库......"<nul >>%logfile% sqlcmd -S 127.0.0.1,1433 -i 1_DB_renameAndCreate.sql -E -b 2>>%errorfile% 1>db_log_%today%.log IF ERRORLEVEL 1 echo fail......请检查db_log_%today%.log 文件>>%logfile% IF ERRORLEVEL 0 echo ok>>%logfile%
ERRORLEVEL 与 %ERRORLEVEL % 的区别
IF ERRORLEVEL 1 ( command ) 与 IF %ERRORLEVEL% LEQ 1 ( command ) 等效
也就是 ERRORLEVEL 1 等效于 “大于等于”
环境变量的比较符号可以使用的有:
● EQU - 等于
● NEQ - 不等于
● LSS - 小于
● LEQ - 小于或等于
● GTR - 大于
● GEQ - 大于或等于
【7】如何复制文件到一个文件夹下,重复则跳过?replace
官网:https://docs.microsoft.com/zh-cn/windows-server/administration/windows-commands/replace
使用replace,可以完成这个功能。
形式:replace /a source_dir\* des_dir
举例:replace /a d:\temp_bak\* d:\copy_file
source_dir:为源文件夹
des_dir:为目标文件夹
【8】bat中流程控制
【8.1】for
其中 in 种的 . 表示目录 * 表示文件
核心参数
/d /l /r /f /d:仅查看目录 /r:递归查看 /f:查看文件内容 /l:迭代数值范围:如 for %%l in (1,2,5),则等价于 for %%l in (1,3,5)..即(#start,#step,#end),开始位置、步长、结束位置
最佳实践
(1)执行6次循环 如果只要循环6次的话 for /l %%i in (1,1,6) do就可以了。 (2)处理文本 要循环处理文本文件的话 for /f %%i in (a.txt) do
(3)在循环中运行多个命令 for %%i in (resource1 ^ resource2 ^ resource3 ^ resource4) ^ do ( echo %%i XCOPY /Y /S /q %%i %OFFICE_DIR% )
【8.2】if
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
(0)比较
EQU - 等于 NEQ - 不等于 LSS - 小于 LEQ - 小于或等于 GTR - 大于 GEQ - 大于或等于 set /a a=1,b=2 if %a% equ %b% (echo yes) else (echo no) if %a% neq %b% (echo yes) else (echo no) if %a% lss %b% (echo yes) else (echo no)
(1)如果盘符 c: 存在 则输出 1,否则输出 2
if exists c: (echo 1) else (echo 2)
(2)errorlevel
@echo off dir c: rem退出代码为>=1就跳至标题1处执行,>=0就跳至标题0处执行 IF ERRORLEVEL 1 goto 1 IF ERRORLEVEL 0 goto 0 Rem 上面的两行不可交换位置,否则失败了也显示成功。 :0 echo 命令执行成功! Rem 程序执行完毕跳至标题exit处退出 goto exit :1 echo 命令执行失败! Rem 程序执行完毕跳至标题exit处退出 goto exit :exit pause
【9】bat中使用timeout来做等待
TIMEOUT [/T] timeout [/NOBREAK] 描述: 这个工具接受超时参数,等候一段指定的时间(秒)或等按任意键。它还接受一个参数,忽视按键。 参数列表: /T timeout 指定等候的秒数。有效范围从 -1 到 99999 秒。 /NOBREAK 忽略按键并等待指定的时间。 /? 显示此帮助消息。 注意: 超时值 -1 表示无限期地等待按键。
【10】bat中的过滤与统计
【10.1】bat中统计行数(find),类似于 wc -l
netstat -an|find /c "1433" 判断1433的TCP连接数
【10.2】bat中的过滤(findstr),类似于 grep
findstr "显示的过滤字符"
详细使用,参考 findstr /?
【11】bat 开通防火墙
netsh advfirewall firewall add rule name="prometheus_monitor" dir=in action=allow remoteip="10.20.53.13,10.20.53.12,115.238.30.139,115.238.30.138" protocol=TCP localport="1433,9182"
【12】sc config 设置服务为自动(延迟启动)
-------- sc.exe命令功能列表: 注:以下命令中。=号后面都有一个空格,=号前面没有空格!
一般形式:
sc config 服务名 start= demand //手动 sc condig 服务名 start= auto //自动 sc config 服务名 start= disabled //禁用 sc start 服务名 sc stop 服务名
案例:
sc config MSSQLSERVER start= delayed-auto
sc config wuauserv start= disabled
sc config SQLSERVERAGENT start= delayed-auto
参考官网:sc config
【13】获取逻辑磁盘盘符
wmic logicaldisk where drivetype=3 get deviceid
获取最大盘符
wmic logicaldisk where drivetype=3 get deviceid>>disk_info.txt for /f %%i in ('type disk_info.txt') do (set temp=%%i ) set disk=%temp:~,-1%
for /f %%i in ('Wmic Logicaldisk Where "DriveType=3" Get Name^|findstr ":"') do (set temp=%%i)
【14】文件操作
【14.1】获取文件第一行、最后一行
最后一行:
for /f %%i in ('type disk_info.txt') do (set a=%%i) echo %a% pause
第一行:
set /p ip=<ip.txt
【14.2】把命令结果赋值给变量
for /f "tokens=16" %%i in ('ipconfig ^|find /i "ipv4"') do (echo %%i>>ip.txt) set /p ip=<ip.txt Rem echo >ip.txt
【14.3】for中使用set
定义了之后,需要用 !变量! 的方式使用
@echo off setlocal enabledelayedexpansion for /r %%q "%backup_path%" in (*%today%*) do ( set ftp_uploadcmd=put %%q echo !ftp_uploadcmd!>>ftp.txt )
【14.4】for 把文件中多行记录合并成一行
把多行文本拼接成用连接的一行 ,楼主可以参考如下代码。 方法1 : @echo off :: 把多行文本拼接成用;连接的一行 :: <nul 不能省略,省略掉就无法运行下去 for /f "tokens=*" %%i in (源文件.txt) do set /p "var=%%i;" <nul >>目标文件.txt exit 方法2 : set tmpstr= setlocal enabledelayedexpansion for /f "tokens=*" %%i in (1.txt) do set tmpstr=!tmpstr! %%i echo %tmpstr% pause exit 方法3 : 还有一种不启用变量延迟的方法,能兼容除英文双引号外的所有特殊字符: @echo off :: code by jm 2006-12-14 for /f "delims=" %%i in (1.txt) do call set "var=%%var%%%%i" echo "%var%" pause
【14.5】获取IP地址,把所有IP地址整合到一行字符串
@echo off
for /f "tokens=16" %%i in ('ipconfig ^|find /i "ipv4"^|sort /R') do (echo %%i>>ip.txt) set tmpstr= setlocal enabledelayedexpansion for /f "tokens=*" %%i in (ip.txt) do set tmpstr=!tmpstr!%%i_ echo %tmpstr:~,-1% pause
【14.6】获取文件所在目录
cd %~dp0
cd %~dp0