PC Ekspert Forum

PC Ekspert Forum (https://forum.pcekspert.com/index.php)
-   Web dizajn, programiranje i ostalo (https://forum.pcekspert.com/forumdisplay.php?f=39)
-   -   Batch skripta za sync sa remote hosta (https://forum.pcekspert.com/showthread.php?t=275107)

potemkin.hr 17.12.2015. 20:33

Batch skripta za sync sa remote hosta
 
Radim jednu skriptu koja bi trebala prekopirati trenutno stanje neke mape udaljenog računala u lokalnu mapu i spremiti changelog, a nakon toga na dnevnoj bazi pakirati u .zip sa dodanim datumom.
To sam uspio napraviti jednostavno sa kombinacijom robocopyja i 7za, ali moram još nekako uvrstiti kontrolu u 2 stupnja da li je računalo online:
  • Prva provjera prije samog pokretanja robocopyja; ako je računalo offline/ugašeno nema smisla da 2 sata vrti skriptu i puni log bezveze wait requestima.
  • Druga provjera prije trpanja u arhivu, ako se u međuvremenu računalo ugasilo postoji dobra šansa da robocopy nije svoje odradio do kraja
U oba slučaja bi skripta trebala u predefined lokaciju baciti prazan fajl sa _failed afixom kako bi lako kasnije vidio što je gdje puklo.
Na serveru sam dodao preko File screening policyja da mi automatski mailom dojavi ako se pojavi koji _failed.txt fajl i stvar šljaka da bi skripta šljakala kako spada.

Uspio sam skemijati si skriptu koja radi, ali izbacuje fail log
Code:

IF EXIST "\\192.168.121.2\c$" (
robocopy "\\192.168.121.2\c$\share" "D:\Store\ProgressULJ" *.* /mir /copyall /zb /np /xf lbia*.* rcda*.* srta*.* dbi*.* *.lk /r:2 /log+:"C:\Logs\Sync-progressULJ_%DATE:~7,2%_%DATE:~4,2%_%DATE:~12,2%.txt") else (type NUL > C:\Logs\Sync-progressULJ_%DATE:~7,2%_%DATE:~4,2%_%DATE:~12,2%_failed.txt
)
IF EXIST "\\192.168.121.2\c$" (
7za a -tzip "D:\Daily\ProgressULJ_%DATE:~7,2%_%DATE:~4,2%_%DATE:~12,2%.zip" "D:\Store\ProgressULJ\*" -mx=5) else (type NUL > C:\Logs\Sync-progressULJ_%DATE:~7,2%_%DATE:~4,2%_%DATE:~12,2%_failed.txt
)

Zajeb je da mi skripta baca fail log fajl i neovisno o tome ako se primarni uvjet izvršio (sinkronizacija uspjela i skripta odradi svoje) pa mi dolaze mailovi za ispravno odrađene taskove.
Zasad sam izbacio if exist loop da mi ne dolaze na mail upozorenja, ali bi rado to osposobio, otvoren sam za razne prijedloge :fala:

rodney 17.12.2015. 21:52

Nisam siguran da sam dobro razumio sto ti skripta radi..
Dakle sad imaš (nekakav pseudokod):

if "živ" robocopy + log
else log
if "živ" 7z
else log

I problem je ako se robocopy uspješno izvrši i onda se ugasi pc?

Za to ne trebaš dva put provjeravati je li server živ, već samo za robocopy.
Robocopy ti vrati status da li se uspješno izvršio ili ne. Laički, trebaš pokušati robocopy, ako uspije super, ako ne kreiraj taj "fail" file. To se u programiranju zove "try - catch".

Ovako nabrzaka, bez iole relevantnog iskustva sa batch skriptama (u svoju obranu napisao sam "pokoju" shell, python, php skriptu) bi to bilo ovako nekako:
Code:

IF EXIST "\\192.168.121.2\c$" (
robocopy "\\192.168.121.2\c$\share" "D:\Store\ProgressULJ" *.* /mir /copyall /zb /np /xf lbia*.* rcda*.* srta*.* dbi*.* *.lk /r:2 /log+:"C:\Logs\Sync-progressULJ_%DATE:~7,2%_%DATE:~4,2%_%DATE:~12,2%.txt")
IF %ERRORLEVEL% NEQ 0 GOTO ProcessError

7za a -tzip "D:\Daily\ProgressULJ_%DATE:~7,2%_%DATE:~4,2%_%DATE:~12,2%.zip" "D:\Store\ProgressULJ\*" -mx=5
IF %ERRORLEVEL% NEQ 0 GOTO ProcessError

exit /b 0

:ProcessError
type NUL > C:\Logs\Sync-progressULJ_%DATE:~7,2%_%DATE:~4,2%_%DATE:~12,2%_failed.txt
exit /b 1

Ovo sam nabrzinu sklepa, nemam pojma jesam li krivo pokupio koju zagradu, znak, štoviše i naredbu.. Pokušaj to malo razlomiti da izgleda preglednije.

Možeš se malo igrat s error codovima, vidim npr. ovdje da se vraćeni statusi manji od 9 ne smatraju fatalnim greškama (za i samo za robocopy, svaka metoda ima svoje, to nije nekakvo općenito pravilo)..
Osim nekakve estetike, tu bi se još moglo par sitnica popraviti. Npr, zašto prazan "fail" file, kad možeš unutra spremiti i koji je error bio, iz varijable %ERRORLEVEL%.. Možda nebi bilo loše i odmah iz skripte poslat mail zajedno sa tom porukom o grešci koristeći preuređeni kod odavde:
Code:

if %ERRORLEVEL% EQU 16 echo ***FATAL ERROR*** & goto end    if %ERRORLEVEL% EQU 15 echo OKCOPY + FAIL + MISMATCHES + XTRA & goto end    if %ERRORLEVEL% EQU 14 echo FAIL + MISMATCHES + XTRA & goto end    if %ERRORLEVEL% EQU 13 echo OKCOPY + FAIL + MISMATCHES & goto end    if %ERRORLEVEL% EQU 12 echo FAIL + MISMATCHES& goto end    if %ERRORLEVEL% EQU 11 echo OKCOPY + FAIL + XTRA & goto end    if %ERRORLEVEL% EQU 10 echo FAIL + XTRA & goto end    if %ERRORLEVEL% EQU 9 echo OKCOPY + FAIL & goto end    if %ERRORLEVEL% EQU 8 echo FAIL & goto end    if %ERRORLEVEL% EQU 7 echo OKCOPY + MISMATCHES + XTRA & goto end    if %ERRORLEVEL% EQU 6 echo MISMATCHES + XTRA & goto end    if %ERRORLEVEL% EQU 5 echo OKCOPY + MISMATCHES & goto end    if %ERRORLEVEL% EQU 4 echo MISMATCHES & goto end    if %ERRORLEVEL% EQU 3 echo OKCOPY + XTRA & goto end    if %ERRORLEVEL% EQU 2 echo XTRA & goto end    if %ERRORLEVEL% EQU 1 echo OKCOPY & goto end    if %ERRORLEVEL% EQU 0 echo No Change & goto end    :end
Znači umjesto "echo" što je ispis, spremiš taj string kao poruku unutar maila, ili kao sadržaj onog error fajla...
Ispalo mi je slučajno ovako sve u jednoj liniji zbog c/p, ali neka, da vidiš kako je meni bilo :D (to je sa onog linka robocopy exit codes pa možeš tamo vidjet)
Sretno!

Nikky 17.12.2015. 22:46

Možda ti je lakše da upotrebiš AutoIt ili sl. alat da dobiješ bolji rezultat, a osim toga tada imaš na raspolaganju cijeli set funkcija / kontrola ...


Sva vremena su GMT +2. Sada je 12:43.

Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 1999-2024 PC Ekspert - Sva prava pridržana ISSN 1334-2940
Ad Management by RedTyger