¿Copiar carpetas del servidor al cliente creadas entre sellos de tiempo específicos?

0

Quiero crear un archivo por lotes que elimine las carpetas en mi destino específico, luego copiar todas las carpetas modificadas después de las 7AM de ayer desde mi origen esto se debe a que quiero poder ejecutar esto diariamente, a las 7AM.

El sistema operativo que pretendo usar es Windows Server 2003.

Por lo tanto, básicamente quiero poder reemplazar el contenido actual de una carpeta, con todos los archivos modificados de las últimas 24 horas.

Vipul
fuente
No puedo ver una forma fácil (es decir, sin herramientas adicionales, por ejemplo: rsync o al menos usando vbscript). XCOPY / D solo lo hace por día.
carveone
¡¡¡Ese es el problema !!!!!!
Vipul
Entiendo. Es posible, pero tedioso. Puede utilizar varias funciones y trucos por lotes para extraer los detalles del archivo y compararlos. Añadiré una respuesta en una o dos horas ...
carveone

Respuestas:

2

Windows XP agregó una gran cantidad de funciones a los parámetros y comandos por lotes, pero no son tan fáciles de usar. Tenga mucho cuidado al citar ya que los archivos pueden contener espacios. He mantenido las citas en torno a los nombres de archivo, ya que es más útil de esa manera.

El lugar para comenzar con el proceso por lotes generalmente es "ayuda" (en un shell CMD, naturalmente). Luego "cmd /?", "Set /?", "For /?" y también el Sitio web de lotes de Microsoft . Esto es lo que he hecho: no está completo pero imprimirá los archivos modificados desde ayer a las 7 am. Puedo añadir más bits si quieres. Lo guardaré yo mismo, ya que a veces quiero saber qué archivos he cambiado hoy.

(Editado: ¡Ayer es más difícil que solo restar uno del día! ...)

@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

Tenga en cuenta que hacer eco de VBScript en un archivo por lotes es propenso a errores y está desordenado. El método preferido es crear un archivo vbs fijo que pueda llamarse a voluntad. Otra forma es agregar el vbscript al final del archivo por lotes, marcar cada línea con una etiqueta, asegurarse de preceder al script con goto: EOF y usar findstr en el propio script para grep las cadenas (sí, es desagradable) :

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

Sí. No es agradable

carveone
fuente
¡¡Muchas gracias!! Carveone ... esto es muy útil ... pero, ¿puedes aclarar qué pasará el primer día de cada mes?
Vipul
Oh! ¡Buena atrapada! Como pueden ver, lo hice por "hoy", recordé que quería "ayer" y rápidamente tiré las dos líneas para restar una. Ni siquiera usé otro nombre de variable. Eso es lo que obtengo por no probar casos de vanguardia Tienes razón: el código es incorrecto tal como está, también para fechas como 20130102 que se convierten en 2013011. Oh, cielos.
carveone
Supongo que es demasiado tarde para preguntar, ¿se puede usar VBScript? Está instalado en todo de forma predeterminada :-) "ayer" resulta ser molesto para calcular los años bisiestos dados, etc.
carveone
¡¡¡Sí!!! eso es lo que incluso me enfrenté. Así que para lograr la salida de I deseada ... He fusionado códigos de dos fuentes diferentes, es decir, la suya y otra escrita por "Rob van der Woude" para encontrar la fecha de ayer. Y mi problema está resuelto. Muchas gracias por ayudarme.
Vipul
De nada. De todos modos, volví a hacer el código utilizando un archivo tmp en vbscript, porque el código existente era totalmente incorrecto y ¡tenía que hacerlo realmente! Fue más difícil de lo que pensé, principalmente debido a los ceros iniciales (gracias a: sogeeky.blogspot.ie/2006/08/… ) y la rareza del archivo por lotes de escape (^)
carveone
0

Bueno, te recomiendo que instales PowerShell en ... desde cualquier dispositivo desde el que ejecutes esto, y podrías estar contento con los resultados.

# 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

} 

Guárdalo como un as-you-want.ps1 , asegúrese de haber establecido su política de ejecución en Sin restricciones (o firme lo anterior y cambie a AllSigned) y ejecute!

Thor
fuente
Gracias Thor por la sugerencia, pero no puedo instalar nada en el cliente. Acceso restringido.
Vipul