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

batch file


Exiled2

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

Δημοσ.

Αν ξέρει κάποιος να με βοηθήσει θέλω να φτιάξω ενα batch file το οποίο θα ελέγχει το μέγεθος ενός φακέλου και αν είναι μεγαλύτερο από ένα συγκεκριμένο μέγεθος θα κάνει μια μετονομασία και μια δημιουργία φακέλου. Το έψαξα λίγο αλλά δεν μπόρεσα να βγάλω κάποια άκρη.

 

Ευχαριστώ.

Δημοσ.

Με batch file δεν νομίζω ότι θα καταφέρεις κάτι.

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

Δημοσ.

Ημουν ετοιμος να γραψω τη λυση οταν προσεξα οτι ζητας τον ελεγχο να γινει σε 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 θα βαλεις οτι κωδικα θες εσυ.

Δημοσ.

Φίλε είσαι θεός. Ήξερα ότι γινόταν αλλά δεν είχα ιδέα πως.

Δυστυχώς όμως αυτό που θέλω να κάνω είναι:

Έχω φτιάξει ενα batch file το οποίο γράφει με το nerocmd ένα φάκελο σε dvd.

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

 

Στο dir πάντως έχει και στοιχείο τον συνολικό αριθμό των αρχειών. Αν πάρουμε αυτών τον διαιρέσουμε με το 3 και το συγκρίνουμε έτσι? Τα αρχεία του φακέλου είναι πάνω κάτω το κοντινό μέγεθος.

 

Σ' ευχαριστώ που ασχολήθηκες αν βρεις κάποια λύση και για το μέγεθος σου είμαι ευγνώμων.

Δημοσ.

Πάντως καλύτερα να το κάνεις με jscript ή vbscript παρά με batch file... Εκτός του ότι είναι πιο "ανθρώπινος" ο κώδικας, έχει και περισσότερες δυνατότητες, γιατί μπορεί να χρειαστεί στο μέλλον να προσθέσεις κάτι που με batch file να ΜΗ γίνεται...

Δημοσ.

Οντως alkisg. Παντως αφου μεσα απο batch μπορεις ανα πασα στιγμη να καλεσεις vbs-js για να κανει κατι που δεν γινεται με batch αυτο δεν ειναι μεγαλο προβλημα.

 

Τωρα για να ξεπεραστει το προβλημα των 2 γιγα, δυστυχως δεν μπορει να γινει με διαιρεση γιατι αμα εχεις ενα subfolder η ακομα και file > 2 γιγα δεν θα δουλεψει.

 

Πρεπει να μπορω ομως να ελεγξω τα gb, mb κλπ ως ξεχωριστους αριθμους. Στο batch τα ενωνα σε ενα μεγαλο αριθμο. Θα το ψαξω αυριο.

Δημοσ.

Δεν υπάρχουν subfolders και τα αρχεία είναι των κάτι mb. Δεν ήθελα κάποιο εξωτερικό αρχείο γιατί πολλές φορές μπορεί να χρειαστεί να το ρυθμίσω τηλεφωνικός και οι παράμετροι μπορεί να αλλάζουν συχνά.

Δημοσ.

Για ευκολία, μπορείτε με μια μόνο εντολή να βρείτε το μέγεθος ενός φακέλου, χρησιμοποιώντας μάλιστα 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...

Δημοσ.

Δεν το ηξερα το 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

Δημοσ.

@Bspus: είχα δει αυτό με τα διαθέσιμα bytes και το είχα αλλάξει, αλλά μάλλον (επειδή ποστάραμε κοντινές ώρες) είχες δει την "παλιά έκδοση".

Δε χρειάζεται ενδιάμεσο αρχείο files.txt, μπορεί να δουλέψει και με set size=%%n

Τα ενδιάμεσα αρχεία καλό είναι να αποφεύγονται, γιατί μπορεί να τύχει να υπάρχουν ήδη και να γίνουν overwrite, χαλώντας δεδομένα...

 

Επίσης, στο dir αν θες βάλε /a για να παίρνει και τυχόν κρυφά αρχεία ή αρχεία συστήματος...

 

Cheers,

Άλκης

Δημοσ.

Πως πρέπει να γράψω τη λέξη "Αρχεία". Με το notepad που το γράφω όταν το τρέχω το bat την εμφανίζει κινέζικα. Το αρχείο το έχω σώσει και ως utf και ως unicode. Τι πρέπει να κάνω?

 

Αυτή η εντολή For /f "tokens=3" %%i in ('"dir %HomeDrive%\%backupdir% /s/-c"') do set size=%%i μου εμφανίζει το διαθέσιμο μέγεθος αντί να μου εμφανίζει το συνολικό μέγεθος αρχείων. Γιατί?

Δημοσ.
Πως πρέπει να γράψω τη λέξη "Αρχεία". Με το 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^). Κοιτα προβληματα που μπορει να εχει κανεις και μετα να αναρωτιεται γιατι δεν δουλευει!

Δημοσ.

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...

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

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

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