![将特定时间戳之间创建的文件夹从服务器复制到客户端?](https://linux22.com/image/1391537/%E5%B0%86%E7%89%B9%E5%AE%9A%E6%97%B6%E9%97%B4%E6%88%B3%E4%B9%8B%E9%97%B4%E5%88%9B%E5%BB%BA%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B9%E4%BB%8E%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%A4%8D%E5%88%B6%E5%88%B0%E5%AE%A2%E6%88%B7%E7%AB%AF%EF%BC%9F.png)
我想创建一个批处理文件,它将删除我指定目的地的文件夹,然后从我的源复制昨天早上 7 点之后修改的所有文件夹;这是因为我希望能够每天早上 7 点运行它。
我打算使用的操作系统是 Windows Server 2003。
因此,基本上我希望能够用过去 24 小时内更改的所有文件替换文件夹的当前内容。
答案1
Windows XP 为批处理参数和命令添加了大量功能,但它们并不那么容易使用。使用引号时要非常小心,因为文件可能包含空格。我保留了文件名周围的引号,因为这样更有用。
批处理开始的地方通常是“help”(自然是在 CMD shell 中)。然后是“cmd /?”、 “set /?”、 “for /?”,还有Microsoft 批处理网站。这就是我所做的 - 它并不完整,但会打印出自昨天早上 7 点以来更改的文件。如果您愿意,我可以添加更多内容。我会自己保留它,因为有时我想知道我今天更改了哪些文件!
(已编辑:昨天比从这一天中减去一天还要困难!……)
@echo off
setlocal
rem Start at current directory. Customise as you wish.
set my_root=.
rem First get yesterday at 7am.
rem The format of %DATE% depends on locale so this is a
rem hack using a tmp file in VBScript...
rem Note the use of the caret, which is the batch escape character
echo yday = DateAdd("d", -1, Date) > "%temp%\tmp$$$.vbs"
echo Wscript.Echo DatePart("yyyy",yday) ^& Right("0" ^& DatePart("m",yday), 2) ^& Right("0" ^& DatePart("d",yday), 2) >> "%temp%\tmp$$$.vbs"
for /F %%a in ('cscript //nologo "%temp%\tmp$$$.vbs"') do set after_ymd=%%a
if exist "%temp%\tmp$$$.vbs" del "%temp%\tmp$$$.vbs"
set after_time=0700
echo Files after: %after_ymd% %after_time%
for /R %my_root% %%f in (*.*) do call :checkdate "%%f" "%%~tf"
goto :EOF
:checkdate
set fname=%1
set fdate=%2
for /f "tokens=1-5 delims=./-: " %%a in (%fdate%) do (
set f_d=%%a
set f_m=%%b
set f_y=%%c
set f_hr=%%d
set f_mn=%%e
)
if %f_y%%f_m%%f_d% LSS %after_ymd% goto :EOF
if %f_y%%f_m%%f_d% EQU %after_ymd% if %f_hr%%f_mn% LSS %after_time% goto :EOF
REM Copy your file here...
echo Newer: %fname%
goto :EOF
请注意,在批处理文件中回显 VBScript 很容易出错,而且很麻烦。首选方法是创建一个可以随意调用的固定 vbs 文件。另一种方法是将 vbscript 附加到批处理文件的末尾,用标签标记每行,确保在脚本前面加上 goto :EOF,并在脚本本身上使用 findstr 来 grep 字符串(是的,这很讨厌):
echo off & setlocal enableextensions
rem Build a script:
findstr "'VBS" "%~f0" | findstr /v "findstr" > %TEMP%\tmp$$$.vbs
....
goto :EOF
'
'VBS
DateAdd("d", -1, Date) 'VBS
Wscript.Echo DatePart("yyyy",yday) & Right("0" & DatePart("m",yday), 2) & Right("0" & DatePart("d",yday), 2) 'VBS
是的。不太愉快。
答案2
好吧,我建议您在...任何运行它的设备上安装 PowerShell,您可能会对结果感到满意。
# Define the folder that you want to copy FROM
$SourceFolder = "D:\test"
# Define the folder that you want to copy FROM, AND DELETE CONTENTS FROM BEFORE DOING SO
$DestinationFolder = "D:\testTarget"
# Make any changes to what criteria you want for the copying
$CopyingCriteria = $( Get-ChildItem $SourceFolder | Where-Object { $_.LastWriteTime -gt ((Get-Date).AddDays(-1)) } )
If ( $CopyingCriteria ) {
# Delete the items of the folder
Get-ChildItem $DestinationFolder | Remove-Item -Force
# Copy the files that have changed using criteria already defined
$CopyingCriteria | Copy-Item -Destination $DestinationFolder -Force
}
将其保存为如你所愿.ps1,确保您已将执行策略设置为“不受限制”(或对上述内容进行签名并将其更改为“AllSigned”)并运行!