【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 指定等候的秒数。有效范围从 -199999 秒。

/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

posted @ 2020-06-23 10:04  郭大侠1  阅读(923)  评论(0编辑  收藏  举报