Exiled2 Δημοσ. 11 Οκτωβρίου 2006 Δημοσ. 11 Οκτωβρίου 2006 Αν ξέρει κάποιος να με βοηθήσει θέλω να φτιάξω ενα batch file το οποίο θα ελέγχει το μέγεθος ενός φακέλου και αν είναι μεγαλύτερο από ένα συγκεκριμένο μέγεθος θα κάνει μια μετονομασία και μια δημιουργία φακέλου. Το έψαξα λίγο αλλά δεν μπόρεσα να βγάλω κάποια άκρη. Ευχαριστώ.
Highlander Δημοσ. 11 Οκτωβρίου 2006 Δημοσ. 11 Οκτωβρίου 2006 Με batch file δεν νομίζω ότι θα καταφέρεις κάτι. Αν έχεις κάποιες γνώσεις προγραμματισμού, δοκίμασε να φτάξεις ένα απλό exe αρχείο που να κάνει αυτό που ζητάς.
tarrasque Δημοσ. 11 Οκτωβρίου 2006 Δημοσ. 11 Οκτωβρίου 2006 πιστεύω ότι με cygwin μπορείς να το κάνεις αυτό αλλά θέλει δουλίτσα
Bspus Δημοσ. 11 Οκτωβρίου 2006 Δημοσ. 11 Οκτωβρίου 2006 Ημουν ετοιμος να γραψω τη λυση οταν προσεξα οτι ζητας τον ελεγχο να γινει σε folder και οχι σε file. Ειμαι σιγουρος οτι γινεται, εστω και θεωρητικα. Πες μου μονο για τι μεγεθος περιπου μιλαμε και αν το folder εχει μεσα και αλλα folders η μονο files. Edit:To βρηκα. ------- @Echo off Set normalsize=1000000000 dir d:\programs\games /s | findstr File(s) > file.txt For /f "tokens=3" %%i in (file.txt) Do Echo %%i > file2.txt For /f "tokens=1,2,3,4 delims=." %%i in (file2.txt) Do Set thissize=%%i%%j%%k%%l If %thissize% GTR %normalsize% (Goto bigger) Else (Goto smaller) :smaller Echo %thissize% is smaller than %normalsize% Goto End :bigger Echo %thissize% is bigger than %normalsize% Goto End :End Set normalsize= Set thissize= del file.txt del file2.txt ------- Στο παραπανω ελεγχω το φακελο d:\programs\games. Εχω βαλει μεγιστο μεγεθος 1000000000 bytes Το Files(s) μετα το findstr θελει οπωσδηποτε κεφαλαιο F. Το findstr νομιζω οτι υπαρχει στα XP απο το SP2 και μετα. Αν δεν το εχεις κατεβασε το απο το net ή βαλε SP2 ή κατεβασε δωρεαν απο τη microsoft το resource kit tools για server2003/XP. Εκει θα βρεις το qgrep.exe που κανει ακριβως το ιδιο πραγμα. Υπ'οψην οτι οι αριθμοι που καταλαβαινει το windows command ειναι απο -2147483648 ως 2147483648, δηλαδη ακριβως 2GB. Αν το folder σου ειναι μεγαλυτερο θα πρεπει να βρουμε κατι αλλο. Επεξηγηση: dir d:\programs\games /s | findstr File(s) > file.txt Αν δεν καταλαβαινεις τι κανει αυτο, τρεξε πρωτα σε γραμμη εντολων το dir d:\programs\games /s ή κατι αναλογο σε ενα φακελο με πολλους υποφακελους Μετα τρεξε dir d:\programs\games /s | findstr File(s) και θα καταλαβεις τι κανει. Το > file.txt απλως λεει οτι οσα θα σου γραφονταν στην οθονη γραφονται αντι γαι εκει σε ενα text file. αν δεν δωσεις path, θα βρισκεται εκει που ειναι και το batch file. For /f "tokens=3" %%i in (file.txt) Do Echo %%i > file2.txt Το file.txt εχει μεσα πολλες γραμμες text. Για καθε μια απο αυτες τις γραμμες παιρνει το τριτο στοιχειο. Τα στοιχεια ξεχωριζουν απο το space. Δηλαδη παιρνει την τριτη λεξη που τυχαινει να ειναι το file size. Επειδη κανω > file2.txt και οχι >> file2.txt, καθε καινουρια γραμμη κανει overwrite το file2.txt. Αποτελεσμα ειναι να επιβιωνει μονο η τελευταια γραμμη που -πολυ βολικα- ειναι αυτη που χρειαζομαστε γιατι ειναι αυτη που δινει την τελικη σουμα του μεγεθους των αρχειων! For /f "tokens=1,2,3,4 delims=." %%i in (file2.txt) Do Set thissize=%%i%%j%%k%%l Το file2.txt εχει μεσα το τελικο size αλλα με τελειες που μπερδευουν το command οταν παει να κανει αριθμητικη. οποτε τις ξεφωρτονομαστε με το παραπανω. Βαζουμε το filesize στη μεταβλητη thissize Πιστευω τα υπολοιπα ειναι κατανοητα. Εννοειται οτι μεσα στο :smaller και :bigger blocks θα βαλεις οτι κωδικα θες εσυ.
Exiled2 Δημοσ. 12 Οκτωβρίου 2006 Μέλος Δημοσ. 12 Οκτωβρίου 2006 Φίλε είσαι θεός. Ήξερα ότι γινόταν αλλά δεν είχα ιδέα πως. Δυστυχώς όμως αυτό που θέλω να κάνω είναι: Έχω φτιάξει ενα batch file το οποίο γράφει με το nerocmd ένα φάκελο σε dvd. Θέλω να ελέγχει το μέγεθος του φακέλου ώστε αν ξεπεράσει το dvd να μετονομάσει τον φάκελο και μετά να δημιουργήσει έναν καινούριο με αυτό το όνομα. Στο dir πάντως έχει και στοιχείο τον συνολικό αριθμό των αρχειών. Αν πάρουμε αυτών τον διαιρέσουμε με το 3 και το συγκρίνουμε έτσι? Τα αρχεία του φακέλου είναι πάνω κάτω το κοντινό μέγεθος. Σ' ευχαριστώ που ασχολήθηκες αν βρεις κάποια λύση και για το μέγεθος σου είμαι ευγνώμων.
alkisg Δημοσ. 12 Οκτωβρίου 2006 Δημοσ. 12 Οκτωβρίου 2006 Πάντως καλύτερα να το κάνεις με jscript ή vbscript παρά με batch file... Εκτός του ότι είναι πιο "ανθρώπινος" ο κώδικας, έχει και περισσότερες δυνατότητες, γιατί μπορεί να χρειαστεί στο μέλλον να προσθέσεις κάτι που με batch file να ΜΗ γίνεται...
Bspus Δημοσ. 12 Οκτωβρίου 2006 Δημοσ. 12 Οκτωβρίου 2006 Οντως alkisg. Παντως αφου μεσα απο batch μπορεις ανα πασα στιγμη να καλεσεις vbs-js για να κανει κατι που δεν γινεται με batch αυτο δεν ειναι μεγαλο προβλημα. Τωρα για να ξεπεραστει το προβλημα των 2 γιγα, δυστυχως δεν μπορει να γινει με διαιρεση γιατι αμα εχεις ενα subfolder η ακομα και file > 2 γιγα δεν θα δουλεψει. Πρεπει να μπορω ομως να ελεγξω τα gb, mb κλπ ως ξεχωριστους αριθμους. Στο batch τα ενωνα σε ενα μεγαλο αριθμο. Θα το ψαξω αυριο.
Exiled2 Δημοσ. 12 Οκτωβρίου 2006 Μέλος Δημοσ. 12 Οκτωβρίου 2006 Δεν υπάρχουν subfolders και τα αρχεία είναι των κάτι mb. Δεν ήθελα κάποιο εξωτερικό αρχείο γιατί πολλές φορές μπορεί να χρειαστεί να το ρυθμίσω τηλεφωνικός και οι παράμετροι μπορεί να αλλάζουν συχνά.
alkisg Δημοσ. 12 Οκτωβρίου 2006 Δημοσ. 12 Οκτωβρίου 2006 Για ευκολία, μπορείτε με μια μόνο εντολή να βρείτε το μέγεθος ενός φακέλου, χρησιμοποιώντας μάλιστα dir /-c για να μην ασχολείστε με τις τελείες. Επίσης, για τον περιορισμό των 2 Gb μπορείτε να σβήσετε τα τρία τελευταία ψηφία του μεγέθους, οπότε το αποτέλεσμα εκφράζεται σε (περίπου) kb. > @echo off for /f "tokens=1,2,3,4* delims= " %%l in ('"dir /a /s /-c | find "Αρχεία""') do set size=%%n echo This folder is %size% bytes echo This folder is %size:~0,-3% kb όπου "Αρχεία" βάλτε "file(s)" για τα αγγλικά Windows...
Bspus Δημοσ. 13 Οκτωβρίου 2006 Δημοσ. 13 Οκτωβρίου 2006 Δεν το ηξερα το dir /-c Thanks Το διαθεσιμα byte (bytes free) αναφερει τον ελευθερο χωρο στο δισκο. Η γραμμη που αναφερει το συνολικο μεγεθος του φακελου ειναι η ακριβως προηγούμενη. Οι τελειες τελικα αποδειχτηκαν σωτηριες γιατι ετσι ξεπερνιεται το προβλημα των 2 γιγα. ---- @Echo off Set count=0 For /f "tokens=3" %%i in ('"dir d:\programs /s | findstr File(s)"') Do Echo %%i > file.txt REM file.txt now has the size in bytes For /f "tokens=1 delims=." %%i in (file.txt) Do Set /a count=%count%+1 For /f "tokens=2 delims=." %%i in (file.txt) Do Set /a count=%count%+1 For /f "tokens=3 delims=." %%i in (file.txt) Do Set /a count=%count%+1 For /f "tokens=4 delims=." %%i in (file.txt) Do Set /a count=%count%+1 REM If count is 4, then the size is at least 1000000000 bytes REM If count is 3, then the size between 1000000 and 999999999 For /f "tokens=1 delims=." %%i in (file.txt) Do Set gigs=%%i For /f "tokens=2 delims=." %%i in (file.txt) Do Set megs=%%i For /f "tokens=3 delims=." %%i in (file.txt) Do Set kilos=%%i For /f "tokens=4 delims=." %%i in (file.txt) Do Set bytes=%%i REM If the size is >= 1000000000, the above will work out the REM number of GB, MB, KB and bytes, assuming 1KB = 1000 bytes REM which is wrong but good enough for this job if %count% LEQ 3 (Goto smaller) REM In this case, size is less than 1000000000, so its small REM The following only runs if size >= 1000000000 if %gigs% GTR 4 (Goto bigger) if %gigs% LSS 4 (Goto smaller) REM We only get here if gigs=4 if %megs% GTR 680 (Goto bigger) if %megs% LSS 680 (Goto smaller) REM We only get here if gigs=4 and megs=680 if %kilos% GTR 786 (Goto bigger) if %kilos% LSS 786 (Goto smaller) if %bytes% GTR 500 (Goto bigger) if %bytes% LEQ 500 (Goto smaller) :smaller Echo The folder is smaller than, or exactly 4680786500 bytes! Echo It's actually %gigs%%megs%%kilos%%bytes% bytes! Goto End :bigger Echo The folder is bigger than 4680786500 bytes! Echo It's actually %gigs%%megs%%kilos%%bytes% bytes! Goto End :End del file.txt Set gigs= Set megs= Set kilos= Set bytes= Set count= ---- Διαλεξα αυθαιρετα το μεγεθος 4680786500 bytes. Ειναι πολυ κοντα στο dvd αλλα λιγο πιο κατω. Πιστευω δεν θα εχεις προβλημα να το αλλαξεις σε ο,τι μεγεθος θες. Μπορεις επισης αν θες να κανεις το batch να παιρνει το μεγεθος και το path παραμετρικα καθε φορα που το τρεχεις. Παντως αν εχεις ελληνικα windows δεν θα δουλεψει ετσι οπως ειναι. Θα πρεπει να αντικατασταθει το File(s) με το αντιστοιχο ελληνικο string
alkisg Δημοσ. 13 Οκτωβρίου 2006 Δημοσ. 13 Οκτωβρίου 2006 @Bspus: είχα δει αυτό με τα διαθέσιμα bytes και το είχα αλλάξει, αλλά μάλλον (επειδή ποστάραμε κοντινές ώρες) είχες δει την "παλιά έκδοση". Δε χρειάζεται ενδιάμεσο αρχείο files.txt, μπορεί να δουλέψει και με set size=%%n Τα ενδιάμεσα αρχεία καλό είναι να αποφεύγονται, γιατί μπορεί να τύχει να υπάρχουν ήδη και να γίνουν overwrite, χαλώντας δεδομένα... Επίσης, στο dir αν θες βάλε /a για να παίρνει και τυχόν κρυφά αρχεία ή αρχεία συστήματος... Cheers, Άλκης
Exiled2 Δημοσ. 13 Οκτωβρίου 2006 Μέλος Δημοσ. 13 Οκτωβρίου 2006 Πως πρέπει να γράψω τη λέξη "Αρχεία". Με το notepad που το γράφω όταν το τρέχω το bat την εμφανίζει κινέζικα. Το αρχείο το έχω σώσει και ως utf και ως unicode. Τι πρέπει να κάνω? Αυτή η εντολή For /f "tokens=3" %%i in ('"dir %HomeDrive%\%backupdir% /s/-c"') do set size=%%i μου εμφανίζει το διαθέσιμο μέγεθος αντί να μου εμφανίζει το συνολικό μέγεθος αρχείων. Γιατί?
Bspus Δημοσ. 13 Οκτωβρίου 2006 Δημοσ. 13 Οκτωβρίου 2006 Πως πρέπει να γράψω τη λέξη "Αρχεία". Με το notepad που το γράφω όταν το τρέχω το bat την εμφανίζει κινέζικα. Το αρχείο το έχω σώσει και ως utf και ως unicode. Τι πρέπει να κάνω? Αυτή η εντολή For /f "tokens=3" %%i in ('"dir %HomeDrive%\%backupdir% /s/-c"') do set size=%%i μου εμφανίζει το διαθέσιμο μέγεθος αντί να μου εμφανίζει το συνολικό μέγεθος αρχείων. Γιατί? Τρεξε σε γραμμη εντολων dir %HomeDrive%\%backupdir% /s/-c Η τελευταια γραμμη που θα δεις ειναι αυτη που θα κρατησει τελικα το size ενω εσενα σε ενδιαφερει η πρωτελευταια. Αντιθετως το dir %HomeDrive%\%backupdir% /s/-c | find "File(s" ( ή "Αρχεια") θα εχει στην τελευταια γραμμη αυτο που θες οποτε το size θα κρατησει τη σωστη τιμη Δοκιμασε, για ελληνικα ή αγγλικα αντιστοιχα For /f "tokens=3" %%i in ('"dir %HomeDrive%\%backupdir% /s/-c | find "Αρχεια""') do set size=%%i For /f "tokens=3" %%i in ('"dir %HomeDrive%\%backupdir% /s/-c | find "File(s""') do set size=%%i Υποψην οτι αν θες να τρεξεις την εντολη εξω απο batch file τα %%i γινονται %i Δυστυχως δεν εχω ιδεα τι να κανεις με τα ελληνικα. Και εμενα δεν παιζουν σωστα στο command Ξαναεγραψα ολο το batch και τωρα ειναι πολυ μικροτερο ---- @echo off Set max=4570000 for /f "tokens=1,2,3,4* delims= " %%l in ('"dir "%1" /a /s /-c | find "File(s""') do set size=%%n if %size% GEQ 1000 (Set size=%size:~0,-3%) if %size% GTR %max% (Goto bigger) if %size% LEQ %max% (Goto smaller) :bigger Echo %size% ^> %max% Goto end :smaller Echo %size% ^<= %max% Goto end :end Set max= Set size= ---- Τωρα καθε φορα που το τρεχεις θα δινεις και το path. Αυτο θα αντικαθισταται στο batch file στο σημειο που γραφει %1. ΠΡΟΣΕΧΕ ΤΟ PATH ΝΑ ΜΗΝ ΕΧΕΙ SPACE, πχ c:\program files. Αν θες κατι τετοιο γραφτο κατευθειαν μεσα αντι για %1 @alkisg Ωραιο το %size:~0,-3% Υποψην: Το argument του find ειναι case sensitive ενω απαιτει να ειναι μεσα σε "" Σε αντιθεση, το findstr δεν απαιτει τα "" Εκει που λες ('"dir /a /s /-c | find "Αρχεία""'), αν το κανω ('"dir /a /s /-c | find "File(s)""') χτυπαει. Πρεπει να βαλω File(s ή να χρησιμοποιησω το findstr χωρις τα "" ή να γραψω File(s^). Κοιτα προβληματα που μπορει να εχει κανεις και μετα να αναρωτιεται γιατι δεν δουλευει!
tarrasque Δημοσ. 13 Οκτωβρίου 2006 Δημοσ. 13 Οκτωβρίου 2006 bspus πολύ καλό! μου έδωσες ιδέες για πολλά πράγματα /respect
alkisg Δημοσ. 13 Οκτωβρίου 2006 Δημοσ. 13 Οκτωβρίου 2006 1) Για τα ελληνικά: ΜΗ ΔΟΥΛΕΥΕΤΕ ΜΕ NOTEPAD. Το notepad χρησιμοποιεί κωδικοσελίδα windows-1253. Το DOS έχει κωδικοσελίδα windows-737. Επομένως τα ελληνικά που γράφετε με το Notepad δε διαβάζονται από DOS. Απλή λύση: δουλεύετε με το edit του DOS ή με κάποιον από τους πολλούς editors που υποστηρίζουν OEM charset (=DOS charset). Π.χ. visual studio, pspad, scite, ultraedit... 2) Για case insensitive, χρησιμοποιήστε το find /I. 3) Για να μη ρυπαίνουν το περιβάλλον οι τοπικές μεταβλητές, χρησιμοποιήστε τη setlocal. Έτσι αποφεύγονται τα Set max= στο τέλος. Regards...
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.