Copia pastas do servidor para o cliente criadas entre os registros de data e hora específicos?

0

Eu quero criar um arquivo de lote que irá apagar as pastas no meu destino especificado, depois copiar todas as pastas modificadas depois das 7 da manhã de ontem da minha fonte; isso é porque eu quero ser capaz de rodar isso diariamente, às 7 da manhã.

O sistema operacional que pretendo usar é o Windows Server 2003.

Assim, basicamente eu quero poder substituir o conteúdo atual de uma pasta, com todos os arquivos alterados das últimas 24 horas.

    
por Vipul 30.12.2013 / 13:09

2 respostas

2

O Windows XP adicionou muita funcionalidade a parâmetros e comandos em lote, mas eles não são tão fáceis de usar. Tenha muito cuidado com as citações, pois os arquivos podem conter espaços. Eu mantive as aspas em torno dos nomes de arquivos, pois é mais útil dessa forma.

O local para começar com lote geralmente é "help" (em um shell CMD naturalmente). Então "cmd /?", "Set /?", "For /?" e também o site em lote da Microsoft . Isso é o que eu fiz - não está completo, mas vai imprimir arquivos alterados desde ontem às 7 da manhã. Eu posso adicionar mais bits se você quiser. Eu vou manter isso sozinho, pois às vezes quero saber quais arquivos eu mudei hoje!

(Editado: Ontem é mais difícil do que simplesmente subtrair um do dia! ...)

@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

Observe que o eco do VBScript em um arquivo em lote é propenso a erros e confuso. O método preferido é criar um arquivo vbs fixo que possa ser chamado à vontade. Outra maneira é anexar o vbscript ao final do arquivo de lote, marcar cada linha com uma tag, certificar-se de preceder o script com goto: EOF e usar o findstr no próprio script para liberar as strings (sim, é desagradável) :

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

Sim. Não é agradável.

    
por 31.12.2013 / 14:03
0

Bem, eu recomendo que você instale o PowerShell em ... qualquer dispositivo do qual você o rode, e você pode ficar feliz com os 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

} 

Salve-o como como-você-deseja.ps1 , verifique se você definiu sua política de execução como Irrestrito (ou assine o acima e altere-o para AllSigned) e execute!

    
por 30.12.2013 / 16:01