配合Windows计划任务,编写脚本并设置定时启动

从192.168.1.1test文件夹下复制全部文件到本地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

dir官方文档

/a 仅显示具有指定属性的目录和文件的名称

d - 目录
h - 隐藏文件
s - 系统文件

可以使用这些值的任何组合,但不要使用空格分隔值。 (可选)可以使用冒号 (:) 分隔符,也可以使用连字符 (-) 作为前缀来表示“not”。 例如,使用 -s 属性不会显示系统文件

/b 显示目录和文件的裸列表,没有其他信息
/o[[:]<sortorder>] 根据 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

preView