Προς το περιεχόμενο

Batch file


100 010 000

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπερα σε όλους σας,

 

Έχω φτιάξει ένα μπατσάκι για να παίρνω κάποια αρχεία backup και θα ήθελα να φτιάξω μέσα στο ίδιο μια υπορουτίνα που θα ελέγχει την ημερομηνία δημιουργίας του αρχείου, έτσι ώστε να με παραπέμπει σε λάθος αν για καποιο λόγο δεν γίνει το backup.

 

Όλοι οι καλοί................. χωράτε:mrgreen:

Δημοσ.

Θα ελεγχει την ημερομηνια και θα τη συγκρινει με τη σημερινη ή με καποια αλλη γνωστη απο πριν? παραμετρικα?

Πρεπει να γινεις λιγο πιο συγκεκριμένος. Δυσκολεύεσαι στη συνταξη της υπορουτίνας ή στο πως θα αποσπάσεις την ημερομηνία?

 

Κατι για να σε βοηθησει να αρχισεις:

 

for /f "tokens=1 delims= " %%f in ('dir ^| findstr readme.txt') do (echo %%f)

for /f "tokens=2 delims= " %%f in ('echo %%date%%') do (echo %%f)

 

Η πρωτη εντολη επιστρεφει την ημερομηνια του αρχειου readme.txt που βρισκεται στον ιδιο φακελο με το batch

 

Η δευτερη επιστρεφει τη σημερινη ημερομηνια.

 

Μπορεις να το κανεις παραμετρικο για τα αρχεια και να αποθηκευεις τις ημερομηνιες σε μεταβλητες για συγκριση

 

Υποψην, αν τις τρεξεις σε γραμμη εντολων και οχι σε batch file, τα %% γινονται %

Δημοσ.

Ας πουμε οτι το backup που θέλω να τρέξω είναι αυτό:

 

 

"C:\program Files\winzip\wzzip" -a -p -r C:\BACKUP\BACKUP.zip "C:\Program Files\Ahead\*.*"

copy C:\BACKUP\BACKUP.zip E:\BACKUP\BACKUP.zip

 

c > τοπικός

ε > flashaki ή external usb dsk

 

θα ήθελα την ώρα που τρέχει και τελειώσει να κάνει έλεγχο με την ημερομηνία (γιατι ο φακελος και το .zip αρχείο πιθανό να υπάρχει και από χτές ή προχθές κ.λ.π.) και αφού τελειώσει να τσεκάρει μέσα στους φακέλλους των δίσκων αν η ημερομηνια είναι η σημερινή που τρέχω το backup, ειδάλλως να μου βγάλει λάθος.

Δηλαδή τρέχω τώρα το μπατσάκι (23-4-07) και θέλω να τσεκάρει το date modified του αρχείου και αν δεν είναι ίδια ημερομηνία θα το στέλνω σε ρουτινίτσα που θα του λεω "μεγάλε... το backup δεν έγινε", κάτι σαν αυτό :

 

 

CLS

@ECHO THIS PROGRAM IS COPYRIGHTED BY * ------------------*

@ECHO AND IT WILL BACKUP, ALL THE FILES THAT YOU NEED

@ECHO FROM YOUR MACHINE, IN TO TWO LOCAL DRIVES

@SET /P userchoice1=Select "y" or "n" to continue

 

@IF "%userchoice1%"=="Y" GOTO USERAGREE1

@IF "%userchoice1%"=="y" GOTO USERAGREE1

@IF "%userchoice1%"=="N" GOTO USERAGREE2

@IF "%userchoice1%"=="n" GOTO USERAGREE2

 

 

:USERAGREE1

 

mkdir "E:\BACKUP"

mkdir "C:\BACKUP"

GOTO BACKUP

 

 

:BACKUP

 

"C:\program Files\winzip\wzzip" -a -p -r C:\BACKUP\BACKUP.zip "C:\Program Files\Ahead\*.*"

copy C:\BACKUP\BACKUP.zip E:\BACKUP\BACKUP.zip

GOTO ELSE

 

 

:ELSE

 

IF NOT EXIST C:\BACKUP\BACKUP.zip GOTO WRONGDRIVELETTER

IF NOT EXIST E:\BACKUP\BACKUP.zip GOTO WRONGDRIVELETTER

GOTO SUCCESS

 

 

:USERAGREE2

 

CLS

@ECHO THE BACKUP WAS CANCELLED BY USER - PRESS ANY KEY TO EXIT

@PAUSE

EXIT

 

 

:WRONGDRIVELETTER

 

CLS

@ECHO * ATTENTION * THE DRIVE THAT YOU SELECTED FOR YOUR

@ECHO BACKUP DOES NOT EXIST - PLEASE CONTACT YOUR TECHNICAL

@ECHO SUPPORT ADMINISTRATOR, TEL: ********

@PAUSE

EXIT

 

:SUCCESS

CLS

@ECHO THE BACKUP WAS SUCCESFULLY DONE - PRESS ANY KEY TO EXIT

@PAUSE

EXIT

 

Αλλα δε μου κάνει διότι οι φάκελλοι που δηλώνω να ψαξει αν υπάρχουν, μπορει να υπάρχουν από χτες, προχτές κ.λ.π. όπως ανέφερα, μόνο με σύγκριση ημερομηνίας μπορώ να είμαι σίγουρος.

Tα αρχεία που ελέγχω είναι : (Με μικρές αλλαγές folder ή δίσκων)

C:\BACKUP\BACKUP.zip

E:\BACKUP\BACKUP.zip

 

Ευχαριστώ εκ των προτέρων

 

Υ.Γ θα ήθελα και μια σύνταξη για προγραμματισμένο backup σε συγκεκριμένη ώρα χωρίς σαφώς να το βαλω στα schedule tasks των windows

Δημοσ.

Βασικά αν μπορώ να βοηθήσω στη κατανόηση μαλλον πρεπει να κάνω set date (ή κατι τεσπα) και μετα verify για να είμαι σίγουρος πως το backup έγινε ειδάλλως θα ανατρέχει σε μήνυμα λάθους. To πώς να το κάνω δε ξέρω

Δημοσ.

Δεν μπορω να καταλαβω που δυσκολευεσαι.

>
"C:\program Files\winzip\wzzip" -a -p -r C:\BACKUP\BACKUP.zip "C:\Program Files\Ahead\*.*"

 

Αυτη η εντολη παντα θα φτιαχνει ενα αρχειο με τη σημερινη ημερομηνια. Μπορεις πριν την τρεξεις να σβησεις και το προηγουμενο C:\BACKUP\BACKUP.zip για σιγουρια. Δεν υπαρχει κανενας λογος να τη συγκρινεις με τη σημερινη

 

Αν θες να συγκρινεις το backup.zip του e: και του c: για ημερομηνιες, τοτε με τον τροπο που σου εδειξα μπορεις να αποθηκευσεις τις ημερομηνιες τους σε μεταβλητες. πχ

 

>

for /f "tokens=1 delims= " %%f in ('dir c:\backup\backup.zip ^| findstr backup.zip') do (set cdate=%%f)

for /f "tokens=1 delims= " %%f in ('dir e:\backup\backup.zip ^| findstr backup.zip') do (set edate=%%f)

 

 

πριν τα κανεις αυτα μπορεις να εχεις ελεγξει οτι υπαρχει το drive e: και το backup.zip εκει μεσα.

 

Τα cdate, edate θα πρεπει να ειναι απλα strings οποτε με ενα απλο IF ελεγχεις αν ειναι ομοια. Αν δεν ειναι, το e:\backup.zip ειναι σιγουρα πιο παλιο.

 

Ελπιζω αυτο να ξεκαθαρισε λιγο τα πραγματα. Αν οχι, μαλλον κατι ακομα δεν εχω καταλαβει καλα.

Δημοσ.

Φίλε σε ευχαριστώ και πάλι για την απάντηση, αλλα δυσκολεύομε λίγο στη σύνταξη γιατί είμαι σχετικά καινούργιος.....

 

@echo off

:: variables

set drive=C:\BACKUP

set drive=E:\BACKUP

set date="%date:~0,3%_%date:~12,2%-%date:~7,2%-%date:~4,2%"

 

Εδώ τώρα αν βάλω IF NOT EXIST στο date θα μου βγάλει λάθος.

Πως να κάνω SET την ημερομηνία η οποία ανανεώνετε μόνη της καθε μερα?

Αν μπορεις δώσε μου όλη τη σύνταξη σύμφωνα με αυτο το backup που έχω γράψει

 

Ευχαριστώ εκ των προτέρων

Δημοσ.

 

set drive=C:\BACKUP

set drive=E:\BACKUP

 

 

Στην ιδια μεταβλητή (drive) ξανααποδίδεις τιμή. Μετα την εκτέλεση πάντα θα εχει τη δευτερη τιμη

 

 

set date="%date:~0,3%_%date:~12,2%-%date:~7,2%-%date:~4,2%"

 

Μην αλλάζεις τη μεταβλητη DATE. Αν θελεις μια άλλη μοργή εμφανισης στη date βάλε νεα μεταβλητη

πχ set mydate=%date:~0,3%_%date:~12,2%-%date:~7,2%-%date:~4,2%

Δημοσ.

Σε ευχαριστώ φίλε....

 

ασε τα set drives, θα τη βρώ την άκρη, αυτό που θέλω να κάνω είναι το μπατσάκι που τρέχει σε schedule task καθε μέρα, να ελεχγει την ημερομηνία του εκάστοτε αρχείου ( π.χ. c:\backup\ahead.zip ) που δημιουργείτε και αν δε συμφωνεί με την εκάστοτε σημερινή, να με πηγαίνει σε λάθος.

 

Δηλαδή τρέχει σήμερα 26/4/07 και μετά πρέπει να ελέξει το date modified του ahead.zip που υπάρχει ήδη από προηγούμενα backup και αν δεν είναι ίδια η ημερομηνία (π.χ. 25/4/07), να με πάει σε λάθος. Το να το σβήνω και να το δημιουργώ πάλι όπως είπε ο Bspus δεν το θεωρώ και πολύ ασφαλές γιαυτό θέλω να το συγκρίνω πάντα με την ημερομηνία, αλλά δε μπορω να το συντάξω και θέλω βοήθεια.

 

Ευχαριστώ

Δημοσ.

 

"C:\program Files\winzip\wzzip" -a -p -r C:\BACKUP\BACKUP.zip "C:\Program Files\Ahead\*.*"

copy C:\BACKUP\BACKUP.zip E:\BACKUP\BACKUP.zip

 

 

set file1="C:\BACKUP\BKP_%date:~0,3%_%date:~12,2%-%date:~7,2%-%date:~4,2%.zip"

set file2="E:\BACKUP\BKP_%date:~0,3%_%date:~12,2%-%date:~7,2%-%date:~4,2%.zip"

 

 

και τις παραπάνω εντολές καντες

 

"C:\program Files\winzip\wzzip" -a -p -r %file1% "C:\Program Files\Ahead\*.*"

copy %file1% %file2%

και για πολυτέλεια αν θελεις βάζεις

if not exist %file2% goto ..........

YΓ. Το προγραμμα σου θαχει πρόβλημα αν δεν είναι συνδεδεμένο το flash-ακι

ΥΓ2. Τρέξε πρωτα ενα δοκιμαστικό bat με τις εντολές

 

set file1="C:\BACKUP\BKP_%date:~0,3%_%date:~12,2%-%date:~7,2%-%date:~4,2%.zip"

set file2="E:\BACKUP\BKP_%date:~0,3%_%date:~12,2%-%date:~7,2%-%date:~4,2%.zip"

echo %file1%

echo %file2%

για να δεις αν σου κανουν τα ονόματα των αρχείων ...

Δημοσ.

Αντί να παιδεύεσαι έτσι γιατί δεν ψάχνεις λίγο τις παραμέτρους του winzip έτσι ώστε όταν πάει να συμπιέσει τα αρχεία μέσα σε ένα .zip και αυτά υπάρχουν ήδη εκεί να τσεκάρει την ημερομηνία τους.

 

Αν το backup.zip υπάρχει τότε τρέξε την εντολή που θα συμπιέσει με παράμετρο ελέγχου ημερομηνίας των αρχείων.

Αν δεν υπάρχει τότε θα το φτιάχνει.

 

 

Αν κατάλαβα καλά τώρα ότι θέλεις να κάνεις κάτι τέτοιο.

Δημοσ.

Αν δυσκολεύεσαι με το winzip, προσωπικά δεν γνωρίζω καθόλου τις παραμέτρους του όταν τρέχει από command line, προτίμησε και το παλιό καλό και αειθαλές pkzip...

Δημοσ.

Παιδιά ευχαριστώ για τη βοήθεια, αλλά.....

 

α) Ο τρόπος που μου λέει να κανω SET o citizen, ελέγχει μόνο τη συγκεκριμένη μέρα που κάνει set date και χρειάζετε να επεμβαίνω στο batch κάθε μέρα και να αλλάζω τη μεταβλητή. Άρα δε μου κάνει. Χρειάζετε να ανανεώνετε μόνο του 7 ημέρες την εβδομάδα

 

β) To wizzip έχει παράμετρο ελέγχου της ημερομηνίας ( -ο ), αλλά απλά σου ανακοινώνει στο ντοσικό παράθυρο που τρέχει ότι δε ταιριάζει η ημερομηνία και εξακολουθεί να τρέχει και να σου δείχνει ότι κάνει backup, ενώ στην ουσία δε κάνει. Δεν είναι πολύ ασφαλές γιατί εκεί που το έχω βάλει να τρέχει δεν το παρακολουθεί κανείς

 

Γιαυτό έγραψα πιο πρίν ότι θέλω να το ελέχγω εγώ με IF NOT EXIST

Υπάρχει τρόπος?

 

τηνχ και πάλι

Δημοσ.

Ακόμα δεν έχω καταλάβει τί θες να κάνεις...

 

Γιατί δεν χρησιμοποιείς την εντολή update, αντί να φτιάχνεις από την αρχή το αρχείο και να το αντιγράφεις μετά πάνω στο άλλο; Νομίζω σου το είπαν και πιο πάνω.

 

Με το 7-Zip και το φορμάτ 7Z δεν έχω κανένα πρόβλημα με την update (χρησιμοποιώ 7Z επειδή είναι πολύ πιο γρήγορο για ίδια συμπίεση και επειδή υποστηρίζει Unicode και μεγάλα archives).

 

Εναλλάξ μπορείς να δοκιμάσεις κι αυτόν τον κάπως μαϊμουδίστικο τρόπο:

 

Βάζε στο όνομα των ZIP την ημερομηνία, αφού την πάρεις πρώτα σε μορφή που μπαίνει σε όνομα αρχείου. Π.χ., σε ISO 8601. Από Τετ 02/05/2007 παίρνεις 20070502 έτσι:

 

>
set mydate=%date:~10,4%%date:~7,2%%date:~4,2%

 

Και φτιάχνε τα αρχεία έτσι: backup-%mydate%.zip

 

Πριν ξεκινήσεις το backup ή την αντιγραφή του backup, κάνε chdir και μετονόμασε το τελευταίο ZIP που θα υπάρχει από χθες ή προχθές ή παραπροχθές κλπ.:

 

>
ren backup-*.zip backup-*-oldbak.zip

 

Στείλε το νέο backup στη θέση του με όνομα: backup-%mydate%.zip

 

Κάνε έλεγχο αν υπάρχει το backup-%mydate%.zip εκεί που το έστειλες.

 

Αν υπάρχει, σβήσε το backup-*-oldbak.zip. (Ή σβήσε το την επόμενη φορά, πριν μετονομάσεις το πιο πρόσφατο).

 

Αλλιώς μήνυμα.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...