Διάβασμα και εγγραφή σε αρχείο, από batch file

Γενικά θέματα για τις γλώσσες προγραμματισμού που δεν καλύπτονται από τις άλλες περιοχές της κατηγορίας.

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
mechpanos
Honorary Member
Δημοσιεύσεις: 1709
Εγγραφή: 20 Μαρ 2003 00:59
Τοποθεσία: Athens - Pyrgos
Επικοινωνία:

Διάβασμα και εγγραφή σε αρχείο, από batch file

Δημοσίευση από mechpanos » 17 Ιούλ 2012 16:47

Καλησπέρα...
Φτιάχνω ένα batch scriptάκι, που θα παίρνει backup μια database όποτε το προγραμματίζω από το scheduler να τρέχει.
Μέχρι στιγμής όλα καλά!

2 θέματα θέλω να επιτύχω, για να έχω 100% αυτό που θέλω:
1) Κάθε φορά να φτιάχνει log αρχείο, ό,τι βγάζει και στην οθόνη ώστε να ξέρω αν υπήρξαν τυχόν σφάλματα, κλπ.

2) Θέλω να κρατάω backup μέχρι κάποιες φορές πριν...για παράδειγμα, να έχω τα τελευταία 5 backup και τα παλαιότερα, να σβήνονται αυτόματα.
Σκέφτηκα ότι αυτό μπορεί να γίνει ως εξής: Έχω βάλει για λόγους εποπτικότητας, κάθε backup να αποθηκεύεται στον φάκελο D:\BackupYYYYMMDD
όπου ΥΥΥΥ το έτος, MM ο μήνας και DD η ημέρα που έγινε το Backup.
Τώρα επειδή εγώ μπορεί να βάλω το backup να τρέχει κάθε μέρα, ή κάθε εβδομάδα, ή 2 φορές την βδομάδα για παράδειγμα, να φτιάξω ένα αρχείο όπου σειριακά θα αποθηκεύει το πρόγραμμα σε γραμμές τις πληροφορίες αύξοντα αριθμού που έτρεξε, και ημερομηνίας, πχ
1 20120710
2 20120711
3 20120712
...
ν 20120825

οπότε την κάθε φορά, θα διαβάζει το τελευταίο ν ποιο ήταν και θα γράφει το τελευταίο ν ότι είναι το σημερινό και τελειώνοντας θα διαγράφει ότι είναι παλαιότερο πχ από ν-5...

Πώς μπορεί να γίνει κάτι τέτοιο; Μήπως υπάρχει γενικά και κανένας άλλος, καλύτερος τρόπος υλοποίησης;...

Για το 1) ξέρετε πώς γίνεται;;;
Πύργος θεός Πανηλειακός!!

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Διάβασμα και εγγραφή σε αρχείο, από batch file

Δημοσίευση από dva_dev » 17 Ιούλ 2012 18:39

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

Άβαταρ μέλους
mechpanos
Honorary Member
Δημοσιεύσεις: 1709
Εγγραφή: 20 Μαρ 2003 00:59
Τοποθεσία: Athens - Pyrgos
Επικοινωνία:

Διάβασμα και εγγραφή σε αρχείο, από batch file

Δημοσίευση από mechpanos » 18 Ιούλ 2012 08:30

Καλημέρα!
Το λειτουργικό είναι τα Windows Server 2003, ένα bat με εντολές φτιάχνω!.

Όσον αφορά το κομμάτι της database δεν απασχολεί, αυτό το κομμάτι του script το έχω πάρει έτοιμο και λειτουργεί μια χαρά.
Πρέπει όμως κάθε τόσο να μπαίνω στο server και να σβήνω με το χέρι τα παλιά backups.
Αυτό θέλω να αυτοματοποιήσω.

Το 1ο, είναι ότι θέλω να loggάρει ό,τι τυπώνει στην οθόνη, και σε ένα αρχείο .log ώστε αν κάτι κολλήσει ή πάει στραβά, να δώ τί μήνυμα σφάλματος έβγαλε.
Πύργος θεός Πανηλειακός!!

Άβαταρ μέλους
mechpanos
Honorary Member
Δημοσιεύσεις: 1709
Εγγραφή: 20 Μαρ 2003 00:59
Τοποθεσία: Athens - Pyrgos
Επικοινωνία:

Διάβασμα και εγγραφή σε αρχείο, από batch file

Δημοσίευση από mechpanos » 21 Ιούλ 2012 10:54

Καλημέρα και πάλι στο αγαπημένο μου forum!!!

Ενημερώνω ότι βρήκα την λύση στο πρόβλημά μου, ψάχνοντας στο internet.

Γίνεται και με τον τρόπο που έλεγα, αλλά υπάρχει άλλος σαφώς ευκολότερος, να κρατήσεις τα αρχεία των τελευταίων Χ ημερών και να σβήσεις όλα τα προηγούμενα!
Η διαδικασία γίνεται με την εντολή FORFILES την οποία βέβαια δεν είχα καν υπόψη μου και διαπίστωσα ότι δεν υπάρχει καν στα XP παρά μόνο στα server 2003 και στις μετέπειτα εκδόσεις (vista κλπ).
Στην δική μου περίπτωση που ήθελα να σβήνει τα τελευταία Χ backup δεν δουλεύει ακριβώς όπως το ενοούσα (δεν έχω βάλει να παίρνω backup κάθε μέρα αλλά 2 φορές την εβδομάδα), αλλά είναι το ίδιο πχ αν θέλω τα τελευταία 5 backup του λέω να σβήνει όλα τα αρχεία παλαιότερα από 15 ημέρες, οπότε θα μείνει το σημερινό + άλλα 2 την τελευταία εβδομάδα + άλλα 2 την προηγούμενη.

Παραθέτω τον κώδικα από το script που σβήνει τα αρχεία, παλαιότερα από Χ ημέρες:

Κώδικας: Επιλογή όλων

@REM Διαγραφή Backup παλαιότερων από X ημέρες...
@echo off
:: set folder path
set dump_path=D:\ORACLE_BACKUP\
 
:: set min age of files and folders to delete
set max_days=X
 
:: remove files from %dump_path%
forfiles -p %dump_path% -m *.* -d -%max_days% -c "cmd  /c del /q @path"
 
:: remove sub directories from %dump_path%
forfiles -p %dump_path% -d -%max_days% -c "cmd /c IF @isdir == TRUE rd /S /Q @path"
pause
ο κώδικας προέρχεται από την ιστοσελίδα
http://elderec.org/2012/02/scripting-de ... an-x-days/


Τώρα για να επιστρέψω στην λογική του τρόπου που είχα σκεφτεί εγώ, βρήκα κάτι απλά ήθελε βαβούρα για να γίνει και δεν μου αρέσουν τα περίπλοκα πράγματα...
Πάντως κράτησα το μισό κομμάτι της φιλοσοφίας του, για να γράφω σε ένα log το πότε έγιναν τα backup
(έστω ότι έχουμε ένα αρχείο datelog.txt της μορφής
1,20120720
2,20120721
.
.
.
)

Κώδικας: Επιλογή όλων

@echo off
@REM Τρόπος ανάκτησης της ημερομηνίας σε μορφή ΜΜΗΗΧΧΧ ισχύει για Ελληνικές τοπικές ρυθμίσεις.
		@For /F "tokens=2,3,4 delims=/ " %%A in ('Date /t') do @( 
	Set Day=%%A
	Set Month=%%B
	Set Year=%%C
)
	set date=%Year%%Month%%Day%

@REM Γράφουμε στο logfile τον α.α. και την ημερομηνία του backup

@REM Διαβάζουμε τον αύξοντα αριθμό της εγγραφής στο log 1,2,3... ως την μεταβλητή ΑΑ
FOR /F "tokens=1,2 delims=," %%G IN (datelog.txt) DO set AA=%%G

@REM Κατά την εγγραφή θέτουμε τον α.α. της νέας εγγραφής ΒΒ=ΑΑ+1
set/A BB=AA+1

@REM αλλάζουμε γραμμή στο logfile
echo.>>datelog.txt
@REM Γράφουμε στο logfile στην νέα γραμμή που δημιουργήσαμε τον τρέχοντα α.α. , τρέχουσα ημερομηνία
echo %BB%,%date%>>datelog.txt
Θα μπορούσα με τη βοήθεια του logfile σειριακά να ελέγχω τις καταχωρημένες ημερομηνίες και αν είναι παλαιότερες από ένα όριο που έχω θέσει να πηγαίνω και να σβήνω τα αντίστοιχα backup, αλλά είναι λίγο μπελαλίδικο και δεν μου άρεσε τελικά σαν λύση αφού όντως, δεν είναι η σωστή!

Τώρα βρίσκομαι σε αναζήτηση, πώς θα κάνω όλο το output της γραμμής εντολών να γράφεται και σε log αρχείο...
Πύργος θεός Πανηλειακός!!

Άβαταρ μέλους
mechpanos
Honorary Member
Δημοσιεύσεις: 1709
Εγγραφή: 20 Μαρ 2003 00:59
Τοποθεσία: Athens - Pyrgos
Επικοινωνία:

Διάβασμα και εγγραφή σε αρχείο, από batch file

Δημοσίευση από mechpanos » 21 Ιούλ 2012 11:43

Λοιπόν, το internet είναι πολύ καλός συνεργάτης, τελικά!

Τα βρήκα όλα!


Λοιπόν, βρήκα ένα εργαλειάκι που κάνει αυτό ακριβώς που θέλω, streamάρει όλο το output της command line σε ένα αρχείο που θα του πω εγώ...

Πρόκειται για το εργαλείο MTEE που βρήκα εδώ:
http://www.commandline.co.uk/mtee/index.html

και η χρήση του είναι:

εντολή | mtee αρχείο

Οπότε έφτιαξα ένα bat που έβαλα μέσα ό,τι δεν χρειάζεται logάρισμα, και μέσα από αυτό καλώ το script που είχα έτοιμο, προσθέτοντας την παράμετρο | mtee log%date%.txt

Έτσι οτιδήποτε πάει στραβά στην όλη διαδικασία, καταγράφεται και στο log της ημερομηνίας, το οποίο μάλιστα με άλλο εργαλειάκι, το mailsend, έχω βάλει να μου έρχεται και με το email...
Πύργος θεός Πανηλειακός!!

Απάντηση

Επιστροφή στο “γλώσσες προγραμματισμού - γενικά”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες