bat_cmd常用命令

::   注释
md   创建目录
xcopy   xcopy要用绝对路径才能在脚本里运行,遇到目录会提示,要指定参数,具体参数看帮助xcopy /?
rd /s /q   删除目录
如果要删除一个目录下的所有文件,用del命令是无法删除目录的,可以先rdmd
同样移动文件夹move只能移动文件,而不能移动文件夹;可以先xcopy然后rd

puase   结尾加上这个,不用goto exit则会等待用户按任意键后才会退出脚本。


关于时间的获取(格式:20170318):

win7中:%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
win_server:%date:~10,4%%date:~4,2%%date:~7,2%


电源管理(具体参数看:shutdown /?):

在5:30分自动关机:at 05:30 shutdown -s -f
在XXX分钟后重启:shutdown -r -t 60


xcopy

xcopy /s /e /y D:\Logs E:\Logs

参数:https://www.cnblogs.com/yang-hao/p/6003308.html


forfiles命令(针对文件的操作命令):

/p 指定的路径
/s 包括子目录
/m 查找的文件名掩码
/d 指定日期,有绝对日期和相对日期, 此处-7指当前日期 的7天前
/c 运行的命令行 表示为每个文件执行的命令。命令字符串应该用双引号括起来。默认命令是 "cmd /c echo @file"。下列变量可以用在命令字符串中:

  • @file - 返回文件名。
  • @fname - 返回不带扩展名的文件名。
  • @ext - 只返回文件的扩展。
  • @path - 返回文件的完整路径。
  • @relpath - 返回文件的相对路径。
  • @isdir - 如果文件类型是目录,返回 "TRUE";如果是文件,返回 "FALSE"。
  • @fsize - 以字节为单位返回文件大小。
  • @fdate - 返回文件上一次修改的日期。
  • @ftime - 返回文件上一次修改的时间。

示例
要列出驱动器 C: 上的所有批处理文件,请键入:

forfiles /p c:/ /s /m*.bat /c"cmd /c echo @file is a batch file"

要列出驱动器 C: 上的所有目录,请键入:

forfiles /p c:/ /s /m*.* /c"cmd /c if @isdir==true echo @file is a directory"

要列出驱动器 C: 上存在时间多于 100 天的所有文件,请键入:

forfiles /p c:/ /s /m*.* /dt-100 /c"cmd /c echo @file :date >= 100 days"

要列出驱动器 C: 上 1993 年 1 月 1 日以前创建的所有文件,而且对于日期早于 1993 年 1 月 1 日的文件显示“file is quite old!”,请键入:

forfiles /p c:/ /s /m*.* /dt-01011993 /c"cmd /c echo @file is quite old!"

要按列格式列出驱动器 C: 上所有文件的扩展名,请键入:

forfiles /p c:/ /s /m*.* /c "cmd /c echo extension of @file is 0x09@ext0x09" With:

要列出驱动器 C: 上的所有批处理文件,请键入:

forfiles /p c:/ /s /m *.bat /c "cmd /c echo @file is a batch file"

要列出驱动器 C: 上的所有目录,请键入:

forfiles /p c:/ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory"

要列出驱动器 C: 上存在时间多于 100 天的所有文件,请键入:

forfiles /p c:/ /s /m *.* /d t-100 /c "cmd /c echo @file :date >= 100 days"

要列出驱动器 C: 上 1993 年 1 月 1 日以前创建的所有文件,而且对于日期早于 1993 年 1 月 1 日的文件显示“file is quite old!”,请键入:

forfiles /p c:/ /s /m *.* /d t-01011993 /c "cmd /c echo @file is quite old!"

要按列格式列出驱动器 C: 上所有文件的扩展名,请键入:

forfiles /p c:/ /s /m*.* /c "cmd /c echo extension of @file is 0x09@ext0x09"

清理指定天数的旧日志

# bat直接调用system32下的cmd,切换分区,之后才能进入目录,copy可以把文件修改时间改为当前系统时间。
E:
cd E:\Logs
copy /b E:\Logs\web.config +,,     #加号和逗号不要少
# 上面两句是配合forfiles用的,web.config的修改时间可能很旧,但要保留它
forfiles /p E:\Logs /S /M *.* /D -30 /C "cmd /c echo del@relpath file… & echo. & del /s /q @file"

for循环

for /?
FOR 变量参照的替换已被增强。您现在可以使用下列
选项语法:

 ~I         - 删除任何引号("),扩充 %I
 %~fI        - 将 %I 扩充到一个完全合格的路径名
 %~dI        - 仅将 %I 扩充到一个驱动器号
 %~pI        - 仅将 %I 扩充到一个路径
%~nI        - 仅将 %I 扩充到一个文件名
 %~xI        - 仅将 %I 扩充到一个文件扩展名
 %~sI        - 扩充的路径只含有短名
 %~aI        - 将 %I 扩充到文件的文件属性
 %~tI        - 将 %I 扩充到文件的日期/时间
 %~zI        - 将 %I 扩充到文件的大小
 %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩充
               到找到的第一个完全合格的名称。如果环境变量名
               未被定义,或者没有找到文件,此组合键会扩充到
               空字符串

可以组合修饰符来得到多重结果:

 %~dpI       - 仅将 %I 扩充到一个驱动器号和路径
 %~nxI       - 仅将 %I 扩充到一个文件名和扩展名
 %~fsI       - 仅将 %I 扩充到一个带有短名的完整路径名
 %~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充
               到找到的第一个驱动器号和路径。 
 %~ftzaI     - 将 %I 扩充到类似输出线路的 DIR

删除D:\Logs下的空目录

for /f "delims=" %%a in ('dir D:\Logs /b /ad /s ^|sort /r' ) do rd /q "%%a" 2>nul

示例脚本1

这个脚本是复制备份文件到指定目录(目录以20170318这种格式创建),并递归查找7天以上的旧内容并删除。

@echo off
echo  ----------------------------------------------------------- >>SQL_bat.log
echo SQL Databases backup start %Date% - %time% >>SQL_bat.log

::set yymmdd=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
set yymmdd=%date:~10,4%%date:~4,2%%date:~7,2%
md F:\DB_Buckup\%yymmdd%
C:\Windows\System32\xcopy.exe C:\DBBackUp_Plan\* F:\DB_Buckup\%yymmdd% /s /e /y
C:\Windows\System32\xcopy.exe /e /i C:\DBBackUp_Plan\* F:\DB_Buckup\%yymmdd%
rd /s /q C:\DBBackUp_Plan

::下面这段是搜索7天以上旧内容并删除
set file_dir="F:\DB_Buckup"
set bak_dat=7
forfiles /s /p %file_dir% /S /M *.* /D -%bak_dat% /C "cmd /c echo del@relpath file… & echo. & del /s /q @file" >>SQL_bat.log

echo SQL Databases backup stop %Date% - %time% >>SQL_bat.log

echo  ----------------------------------------------------------- >>SQL_bat.log
goto exit
:exit

功能实现

远程执行程序、脚本

下载PsExec:https://technet.microsoft.com/en-us/sysinternals/bb897553.aspx
下载页面有相关的使用说明
解压文件后把psexec放到你需要的位置,如果没有添加环境变量就要用绝对路径去执行。目标主机的防火墙要开135,139这两个端口。
要开启共享:net share admin$可以看到,如果没有开启,编辑注册表:
1,HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Lsa中的restrictanonymous的值改为1
2,HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Service/LanmanServer/Parameters
新建两个QWORD,AutoShareWks 和 AutoShareServer 值都为1
然后重启。

常见用法
语法psexec 远程主机名/IP -u 用户名 -p 密码 [参数] [被执行的程序]
只在局域网内应用成功,外网没有测试过,用IP可能会连接不了远程主机,可能是防火墙的问题,可以改用主机名,在cmd里输入hostname查看主机名。

psexec \\hostname -u Administrator -p mypassword -i "D:\123.bat"
psexec \\hostname -u Administrator -p mypassword -c "D:\123.bat"

参数
-i  是执行远程相应位置的脚本。
-c  是复制本地脚本到远程执行。

参考:
http://blog.csdn.net/miss_easy/article/details/47780797
http://blog.sina.com.cn/s/blog_4e46983d0101ovkw.html


powershell发送邮件

代码保存为ps1(powershell脚本)格式的文件

############################################################################### 
 
###########Define Variables########
 
$fromaddress = "admin@xxxxxxx.cn"     #发件人
 
$toaddress = "leo@xxxxxx.cn"         #收件人
 
$Subject = "Patterson_del_log succeed"      #邮件主题
 
#$attachment = "C:\powershell_mail.txt"     #附件、内容

$smtpserver = "smtp.xxxxxxx.cn"             #SMTP地址
 
####################################
 
$message = new-object System.Net.Mail.MailMessage
 
$message.From = $fromaddress

$message.To.Add($toaddress)
 

 
$message.IsBodyHtml = $True

$message.Subject = $Subject
 
#$attach = new-object Net.Mail.Attachment($attachment)
 
$message.Attachments.Add($attach)

$smtp = new-object Net.Mail.SmtpClient($smtpserver)
 
$smtp.Send($message)

#################################################################################

计划任务里调用:
执行程序(路径可能不同):C:\Windows\WinSxS\wow64_microsoft-windows-powershell-exe_31bf3856ad364e35_6.3.9600.17415_none_6475a3ed0a50d87b\powershell.exe
参数:-command "& 'D:\auto_bat\pshell_email_del_oldfile.ps1'"

参考:https://gallery.technet.microsoft.com/scriptcenter/Send-HTML-Email-Powershell-6653235c


备份数据库

对于某些SQL不是完全版数据库是没有备份计划功能的,这事可以用bat脚本调用sql语句来备份。

说明:脚本通过调用mssql_idance_backup.sql文件备份数据库idance为idance_backup.bak,然后以时间戳命名备份

sql部分:
BACKUP DATABASE [idance] TO  DISK = N'D:\Backup\idance_backup.bak' WITH NOFORMAT, NOINIT,  NAME = N'idance-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO
BACKUP DATABASE [idance2] TO  DISK = N'D:\Backup\idance2_backup.bak' WITH NOFORMAT, NOINIT,  NAME = N'idance-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

bat部分:
sqlcmd  -i D:\Backup\backup_task\mssql_idance_backup.sql -S localhost\SQLEXPRESS -U sa -P [数据库密码]
::时间设置这部分有几种格式,第一种有中横岗,第二种是yyyymmdd格式(注意windows时间中设置格式)echo %Today%检查。
SET Today=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%-%time:~3,2%-%time:~6,2%
SET Today=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
ren D:\Backup\idance_backup.bak idance_%Today%.bak
ren D:\Backup\idance2_backup.bak idance2_%Today%.bak
FORFILES /P C:\DBBackUp\ /S /M *.bak /D -7 /C "cmd /c del @file"

备份SqlServer数据库:SqlServer备份数据库的4种方式介绍


文章作者: Leo
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LeoLan的小站
Dev 脚本 bat脚本
喜欢就支持一下吧