Копировать папки с сервера на клиент, созданные между определенными отметками времени?

959
Vipul

Я хочу создать пакетный файл, который будет удалять папки в указанном месте назначения, а затем скопировать все папки, измененные после 7 часов утра вчера, из моего источника; это потому, что я хочу иметь возможность запускать это ежедневно, в 7 утра.

Операционная система, которую я собираюсь использовать, - Windows Server 2003.

Таким образом, в основном я хочу иметь возможность заменить текущее содержимое папки всеми измененными файлами за последние 24 часа.

0
Я не могу увидеть простой способ (то есть: без дополнительных инструментов - например, rsync или, по крайней мере, с помощью vbscript). XCOPY / D делает это только на дневной основе. carveone 10 лет назад 0
Вот в чем проблема !!!!!! Vipul 10 лет назад 0
Я понимаю. Это возможно, но утомительно. Вы можете использовать различные пакетные функции и приемы для извлечения деталей файла и их сравнения. Я добавлю ответ через час или два ... carveone 10 лет назад 0

2 ответа на вопрос

2
carveone

Windows XP добавила множество функций для пакетных параметров и команд, но они не так просты в использовании. Будьте очень осторожны с цитатами, так как файлы могут содержать пробелы. Я сохранил кавычки вокруг имен файлов, так как это более полезно.

Как правило, начинать с пакета - «помощь» (естественно, в оболочке CMD). Тогда "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 в самом сценарии для извлечения строк (да, это неприятно) :

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 

Да. Мне не приятно.

Большое спасибо!! Carveone .... это очень полезно ... но не могли бы вы уточнить, что произойдет в первый день любого месяца !!! Vipul 10 лет назад 0
Ой! Хороший улов! Как вы можете видеть, я сделал это для «сегодня», вспомнил, что вы хотели «вчера», и быстро бросил две строки, чтобы вычесть одну. Я даже не использовал другое имя переменной. Вот что я получаю за то, что не тестирую крайние случаи. Вы правы - код неверен в том виде, в каком он есть, также для таких дат, как 20130102, которые превращаются в 2013011. О, дорогой. carveone 10 лет назад 0
Я полагаю, уже слишком поздно спрашивать, можно ли использовать VBScript. По умолчанию он установлен на все :-) «вчера» оказывается раздражающим для расчета данных високосных лет и т. Д. carveone 10 лет назад 0
Да уж!!! вот с чем даже я столкнулся. Поэтому для достижения желаемого результата я ... Я объединил коды из двух разных источников - вашего и другого, написанного "Робом ван дер Вуде" для нахождения вчерашней даты. И моя проблема решена. Большое спасибо за помощь. Vipul 10 лет назад 0
Пожалуйста. В любом случае я переделал код, используя файл tmp в vbscript, потому что существующий код был полностью неверным, и мне пришлось это сделать! Это было труднее сделать, чем я думал, в основном из-за ведущих нулей (спасибо: http://sogeeky.blogspot.ie/2006/08/vbscript-add-leading-zero-to-date.html) и странности партии выход файла (^) carveone 10 лет назад 0
О, и я отредактировал ответ, который, кажется, лишил меня галочки "принятый ответ". Штопать... carveone 10 лет назад 0
Имеет ли это какое-то значение, если вы потеряете этот "принятый ответ" ... в любом случае, я благодарю вас за все усилия, которые вы вложили в решение проблемы !! СПАСИБО..!! Vipul 10 лет назад 0
0
Thor

Well, I recommend you install PowerShell on... whatever device you run this from, and you might be happy with the results.

# 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 } 

Save it as a as-you-want.ps1, make sure you've set your execution policy to Unrestricted (or sign the above and change it to AllSigned) and run!

Спасибо Тору за предложение, но я не могу ничего установить на клиент. Ограниченный доступ. Vipul 10 лет назад 0