bat脚本远程备份文件
配合Windows计划任务,编写脚本并设置定时启动
从192.168.1.1\test文件夹下复制全部文件到本地test文件夹下,并保留修改时间最近的3个sql文件,删除其他的sql文件
@echo off&setlocal enabledelayedexpansion xcopy /F /d \\192.168.1.1\test\*.* F:\test\ pushd F:\test\ set n=0 for /f "delims=" %%a in ('dir /a-d-h /b /o-d *.sql') do ( if !n! geq 3 del "%%~a" set /a n+=1 ) popd
脚本说明
xcopy
/f 复制时显示源文件名和目标文件名。
/d [:MM-DD-YYYY] 仅复制指定日期或之后更改的源文件。 如果未包含 MM-DD-YYYYY 值,xcopy则复制比现有目标文件更新的所有源文件。 此命令行选项允许更新已更改的文件。
setlocal enabledelayedexpansion 扩展本地环境变量延迟
在cmd执行命令前会对脚本进行预处理,其中有一个过程是变量识别过程,在这个过程中,如果有两个%括起来的如%value%类似这样的变量,就会对其进行识别,并且查找这个变量对应的值,再而将值替换掉这个变量,这个替换值的过程,就叫做变量扩展,然后再执行命令。
但如果出现动态的情况会怎样?在cmd执行中,发生动态的一种情况是在 for语句中进行变量赋值。
开启了变量延迟,在for循环中每次赋予str的值才会被传递下去,但这里的str变量符必须要写成!str!
Pushd&Popd
Pushd 命令
改变当前目录到指定目录,并保存当前的目录在堆栈顶端
Popd 命令
改变当前目录,跳转到堆栈顶端保存的目录,并将堆栈顶端的目录删除
for
delims= 用来告诉for每一行应该拿什么作为分隔符
用%%a代替循环中的每一行(每个文件名)
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
set /a 是指定一个变量等于一串运算字符
dir /a-d-h /b /o-d *.sql
/a 仅显示具有指定属性的目录和文件的名称
d - 目录
h - 隐藏文件
s - 系统文件
可以使用这些值的任何组合,但不要使用空格分隔值。 (可选)可以使用冒号 (:) 分隔符,也可以使用连字符 (-) 作为前缀来表示“not”。 例如,使用 -s 属性不会显示系统文件
/b 显示目录和文件的裸列表,没有其他信息
/o[[:]] 根据 sortorder 对输出进行排序,它可以是以下值的任意组合
d - 按日期/时间,最早-使用前缀反转排序顺序
获取昨天的日期并格式化输出
配合vbs脚本
:: yesterdays date @echo off set day=-1 echo >"%temp%\%~n0.vbs" s=DateAdd("d",%day%,now) : d=weekday(s) echo>>"%temp%\%~n0.vbs" WScript.Echo year(s)^& right(100+month(s),2)^& right(100+day(s),2) for /f %%a in ('cscript /nologo "%temp%\%~n0.vbs"') do set "result=%%a" del "%temp%\%~n0.vbs" set "YYYY=%result:~0,4%" set "MM=%result:~4,2%" set "DD=%result:~6,2%" set "data=%yyyy%-%mm%-%dd%" echo Yesterday was "%data%" pause