mphxths Δημοσ. 4 Ιουλίου 2014 Δημοσ. 4 Ιουλίου 2014 καλησπερα σε ολους , θελω να φτιαξω ενα batch file που θα κανει το εξης. 1.θα τσεκαρει σε συγκεκριμενο φακελο (συνηθως στον φακελο απο οπου θα τρεχει) αν υπαρχουν φακελοι με ονομασια για παραδειγμα testX , οπου Χ θα ειναι ενα νουμερο απο 1 εως 100 ας πουμε 2.αν δεν βρει κανενα φακελο με σχετικη ονομασια θα δημιουργει εναν φακελο με τον πρωτο διαθεσιμο αριθμο , δηλ αν δεν υπαρχει κανενας φακελος ονοματι testX , θα δημιουργει τον φακελο test1. 3.αν υπαρχει φακελος test1,test2 τοτε θα δημιουργει τον φακελο test3 .Aν υπαρχουν φακελοι , test1,test2,test10 , θα ελεγχει απο χαμηλα πρωτα και θα δημιουργει το test3..δηλ το πρωτο διαθεσιμο...και οταν φτασει στο test10..θα δημιουργησει το test11...κλπ κλπ 4.θα εκτελει στην συνεχεια καποιες αλλες εντολες που δεν ειναι του παροντος , ισως να καλει καποιο αλλο .bat . στην ουσια τα 3 πρωτα με ενδιαφερουν Ευχαριστω εκ των προτερων
micos000 Δημοσ. 5 Ιουλίου 2014 Δημοσ. 5 Ιουλίου 2014 Ψάχνοντας λίγο βρήκα αυτό: @echo off setlocal enabledelayedexpansion set version=New_Folder set "lastFolder=0" for /f "delims=" %%F in ( '2^>nul dir /b /ad "%version%*."^|findstr /xri "%version%[0-9]*"' ) do ( set "name=%%F" set "name=!name:*%version%=!" if !name! gtr !lastFolder! set "lastFolder=!name!" ) set /a nextFolder=lastFolder+1 md "%version%%nextFolder%" echo Created "%version%%nextFolder%" pause Δεν ψάχνει όμως για ενδιάμεσα νούμερα, μόνο για το μεγαλύτερο.Αν έχεις όρεξη ψάξε παραπάνω (https://www.google.gr/#q=incremental+folder+creation+in+batch+file) ή ρίξε μια ερώτηση στο http://stackoverflow.com
australis Δημοσ. 5 Ιουλίου 2014 Δημοσ. 5 Ιουλίου 2014 (επεξεργασμένο) Με bat script δεν ξερω , αλλα είναι πανευκολο με ένα vbscript που μπορεις να το καλεσεις μεσα από ένα bat file. Φτιαξε ένα αρχειο με extension .vbs (πχ newfold.vbs) και βαλε αυτές τις εντολες: Dim FSO Set FSO = CreateObject("Scripting.FileSystemObject") BasicFolder="c:\basic folder" FolderPrefix="Test" first=0 last=512 Do NewFolder=BasicFolder+"\"+FolderPrefix+cstr(last) If FSO.FolderExists(NewFolder) Then first=last last=2*last else last=(first+last) \ 2 end if Loop Until first = last FSO.CreateFolder(NewFolder) Για να τρεξεις το .vbs μεσα από bat αρχειο , βαλε την εντολη: cscript newfold.vbs (αν το vbs είναι σε άλλο φακελο θα βαλεις ολη τη διαδρομή - cscript "c:\...\...\newfold.vbs") Φυσικα θα πρεπει να βαλεις και τις σωστες αρχικες τιμες για τις μεταβλητες BasicFolder & FolderPrefix ΥΓ.Η λογικη test1,test2,...., test10,test11,....test99,test100,... δεν είναι ότι καλυτερο καθως στο sorting by name θα σου βγαινουν ανακατα: πχ πρωτα το test125 και μετα το test82 Θα ηταν καλυτερα να αποφασισεις με ποσους χαρακτήρες θες να σωζεται το νουμερο πχ για 5 χαρακτήρες test00001, test00002 κλπ Αν επιλεξεις αυτή τη λογικη (εσυ ξερεις καλυετρα τι χρειαζεσαι) το script χρειαζεται μια μικρη αλλαγή: Dim FSO Set FSO = CreateObject("Scripting.FileSystemObject") BasicFolder="c:\basic folder" FolderPrefix="Test" FormatName="00000" first=0 last=512 Do last_string=right(formatname+cstr(last),len(formatname)) NewFolder=BasicFolder+"\"+FolderPrefix+cstr(last_string) If FSO.FolderExists(NewFolder) Then first=last last=2*last else last=(first+last) \ 2 end if Loop Until first = last FSO.CreateFolder(NewFolder) Στη μεταβλητη FormatName βαλε τοσα 0 οσο το μέγεθος που θελεις να σωζεται το νουμερο Ουπς, τωρα ειδα ότι μπορει να λειπουν ενδιάμεσα αρχεια οποτε αυτά τα script δεν είναι σωστα ... ακολουθουν τροποποιημένα αλλα αφηνω και τα προηγουμενα αν χρειαστουν για καποιον άλλο.... Το προτέρημα των παραπσνω είναι ότι εντοπιζουν μεσω διαδικης αναζητησης πολύ γρηγορα το επομενο αρχειο ακομα και για χιλιαδες αρχεια. Τα επομενα θα χρειαζονται περισσοτερο χρονο αφου η αναζητηση γινεται σειριακα αρχιζοντας από το αριθμο 1. Αν υπάρχουν όλοι οι φακελοι από το 1-10000 θα γινουν 10000 ασκοπoι έλεγχοι ενώ με διαδικη αναζητηση αρκουν 14 έλεγχοι.... Dim FSO Set FSO = CreateObject("Scripting.FileSystemObject") BasicFolder="c:\basic folder" FolderPrefix="Test" FolderPostfix=0 Do FolderPostfix=FolderPostfix+1 NewFolder=BasicFolder+"\"+FolderPrefix+cstr(FolderPostfix) Loop Until not FSO.FolderExists(NewFolder) FSO.CreateFolder(NewFolder) ή με εναλλακτικο format Dim FSO Set FSO = CreateObject("Scripting.FileSystemObject") BasicFolder="c:\basic folder" FolderPrefix="Test" FormatName="00000" FolderPostfix=0 Do FolderPostfix=FolderPostfix+1 last_string=right(formatname+cstr(FolderPostfix),len(formatname)) NewFolder=BasicFolder+"\"+FolderPrefix+last_string Loop Until not FSO.FolderExists(NewFolder) FSO.CreateFolder(NewFolder) Επεξ/σία 5 Ιουλίου 2014 από australis
mphxths Δημοσ. 5 Ιουλίου 2014 Μέλος Δημοσ. 5 Ιουλίου 2014 Ευχαριστω και τους 2 για τις απαντησεις... Το τελευταιο του australis δουλεψε οπως προβλεπεται , τουλαχιστον με καποιες δοκιμες που εκανα.Ολα αυτα ειναι μερος ευρυτερου προτζεκτ για αυτο και δεν εχω τον χρονο να τα ψαξω μονος μου...
mphxths Δημοσ. 6 Ιουλίου 2014 Μέλος Δημοσ. 6 Ιουλίου 2014 να κανω ακομα μια ερωτηση.. εστω οτι χρησιμοποιω το vb script μεσα σε ενα batch file που το καλω με cscript . Αν στην συνεχεια θελω να χρησιμοποιησω μια μεταβλητη του vb script , π.χ. το NewFolder , στο batch file αυτο πως θα γινει?
australis Δημοσ. 7 Ιουλίου 2014 Δημοσ. 7 Ιουλίου 2014 Προσθεσε στο script τα παρακατω: Set wshshell = CreateObject("WScript.Shell")Dim WshSySEnvSet WshSysEnv = wshshell.Environment("Volatile")WshSysEnv("TEST_ENV_VAR") = NewFolderSet WshSySEnv = Nothing Αυτό θα δημιουργησει τη μεταβλητη περιβάλλοντος TEST_ENV_VAR και θα τις αποδώσει τη τιμη της newfolder Μπορεις να γραψεις πολλες εντολες WshSysEnv("...") = .... και να δημιουργήσεις παραπανω από μια μεταβλητες περιβαλλοντος Φαντάζομαι ότι ξερεις διαχειριση και κανονες των environment variables Σημ. Όταν κανεις log-off το συστημα η τιμη θα χαθει To παραπανω χρησιμοποιησε το αν θελεις να περνας στο περιβαλλον κατι που υπολογιστηκε στο script πχ το newfolder Aν κατι δεν υπολογίζεται στο script (πχ basicfolder) είναι προτιμοτερη άλλη διαχειριση (env.variable που θα περναει στο script)
mphxths Δημοσ. 7 Ιουλίου 2014 Μέλος Δημοσ. 7 Ιουλίου 2014 Ευχαριστω για την απαντηση αν και δεν ξερω αν με βοηθαει σε αυτο που θελω να κανω. το vb script οπως ξερεις δινει μια τιμη στο NewFolder και στο τελευταιο βημα απο οσο καταλαβαινω γιατι δεν κατεχω απο vb δημιουργει τον φακελο με την τιμη του NewFolder , που την παιρνει με τον τροπο που θελουμε...αυξανοντας το νουμερο κλπ. καλω λοιπον με cscript folder.vbs , το σκριπτ αυτο και οντως λειτουργει αψογα...δημιουργει τα φακελακια. Αυτο ομως που θελω εχει και συνεχεια...μεσα στο ιδιο το .bat τρεχω ενα προγραμμα (που παιρνει μερικες παραμετρους) και μια απο αυτη ειναι να αντιγραψει καποια αρχεια σε καποιον φακελο που θα του πω. Ο φακελος αυτος ειναι συνθετος.. το πρωτο συνθετικο θελω να ειναι η τιμη του NewFolder και το δευτερο συνθετικο το παιρνει απο καποια μεταβλητη μεσα στο ιδιο το .bat , δεν εχω προβλημα με αυτο. Αρα με λιγα λογια , θελω αυτη η μεταβλητη , το NewFolder , ή η τιμη της δεν με απασχολει το τεχνικο κομματι..να "ερθει" με καποιον τροπο σαν μεταβλητη στο .bat για να την κολλησω στον προαναφερθεν φακελο ... Με το παραπανω που εγραψες μιλας για enviroment variables..δεν ξερω καν αν εχει νοημα να δημιουργηθει τετοιου ειδους μεταβλητη μιας και το NewFolder (η τιμη του τελοσπαντων) , θα χρησιμοποιηθει μια φορα μεσα στο batch file και το τι θα γινει μετα το περας της εκτελεσης αυτου δεν με απασχολει.Ετσι και αλλιως οταν το ξαναεκτελεσω θα παρει νεα τιμη... To TEST_ENV_VAR μεσα στο batch πλεον πως "παιρνω" την τιμη του? με %TEST_ENV_VAR ? %%TEST_ENV_VAR ? %TEST_ENV_VAR%? με καποια αλλη μορφη?δοκιμασα διαφορα δεν παιρνω κατι. Εχω καιρο να ασχοληθω με batch scripting και απλα προσπαθω να υλοποιησω το σκριπτακι αμεσα μιας και ειναι το μεσο του σκοπου μου
micos000 Δημοσ. 7 Ιουλίου 2014 Δημοσ. 7 Ιουλίου 2014 Στο τελευταίο σκριπτ αφαίρεσε το WshSysEnv("TEST_ENV_VAR") = NewFolder και πρόσθεσε πριν το Set WshSySEnv = Nothing την γραμμή Wscript.Echo last_string Τώρα κάλεσε το σκρίπτ με τον παρακάτω τρόπο (όπου newfold.vbs το όνομα του σκρίπτ). Θα πάρεις σε μεταβλητή το νούμερο του φάκελου. Αν δώσεις στην echo το FolderPrefix+last_string θα πάρεις όλο το όνομα του φάκελου for /f "tokens=*" %%i in ('cscript //nologo newfold.vbs') do set Value=%%i echo %Value% 1
mphxths Δημοσ. 7 Ιουλίου 2014 Μέλος Δημοσ. 7 Ιουλίου 2014 Στο τελευταίο σκριπτ αφαίρεσε το WshSysEnv("TEST_ENV_VAR") = NewFolder και πρόσθεσε πριν το Set WshSySEnv = Nothing την γραμμή Wscript.Echo last_string Τώρα κάλεσε το σκρίπτ με τον παρακάτω τρόπο (όπου newfold.vbs το όνομα του σκρίπτ). Θα πάρεις σε μεταβλητή το νούμερο του φάκελου. Αν δώσεις στην echo το FolderPrefix+last_string θα πάρεις όλο το όνομα του φάκελου for /f "tokens=*" %%i in ('cscript //nologo newfold.vbs') do set Value=%%i echo %Value% ωραιος ο παιχτης.. οντως επαιξε ! ευχαριστω και σενα και τον australis για τις απαντησεις σας
australis Δημοσ. 8 Ιουλίου 2014 Δημοσ. 8 Ιουλίου 2014 Ενδιαφερον! θα πρεπει να μαθω πως δουλευει η for /f tokens ....
mphxths Δημοσ. 9 Ιουλίου 2014 Μέλος Δημοσ. 9 Ιουλίου 2014 ενα ακομα θεματακι για να μην βαριομαστε οπως ηδη ξερετε το σκριπτακι , δημιουργει φακελους με αυξανομενους αριθμους στην ονομασια και ελεγχοντας ποιο νουμερο λειπει κλπ επειτα καλω αυτο το σκριπτ μεσα σε ενα αλλο σκριπτ (bat file) για να χρησιμοποιησω την ονομασια του εκαστοτε δημιουργηθεντου φακελου ως παραμετρο για αλλες εντολες Προκυπτει ενα αλλο θεμα τωρα και για να γινει αντιληπτο , θα δωσω ενα συγκεκριμενο παραδειγμα Εστω οτι τρεχω το σκριπτ (to bat file) το οποιο καλει το vb script και αυτο που προκυπτει ειναι το εξης. 1.Ενας φακελος test0001 (σαν απορροια της εκτελεσης του vb script) 2.Η εντολη που ακολουθει μεσα στο bat file , δημιουργει Χ (οπου Χ , ενας αριθμος σεβαστος , π.χ. 20,30,40 κλπ) υποφακελους Η ιδια αυτη εντολη μεσα σε καθε εναν απο τους Χ αυτους υποφακελους δημιουργει καποια αρχεια. Εχουμε δηλ ενα σκηνικο του στυλ test0001/blabla1/blabla1.txt test0001/blabla2/blabla2.txt test0001/blabla3/blabla3.txt .... test0001/blabla60/blabla60.txt Λογω της φυσης της εντολης αυτης και ισως καποιον δυσλειτουργιων καποια απο τα αρχεια (στο παραδειγμα τα .txt αρχεια) ισως να μην δημιουργηθουν σε ΚΑΠΟΙΟΥΣ απο τους υποφακελους. Το να κλικαρω απο τον explorer εναν εναν καθε υποφακελο για να δω αν σε καποιον λειπουν αρχεια το θεωρω μαλακια Και ερχομαστε στο ζητουμενο Υπαρχει καποιος τροπος (σε vb , σε bat , σε οτιδηποτε δεν εχω θεμα) , που να τσεκαρει τους δημιουργηθεντες φακελους και να αναφερει οτι στον ΤΑΔΕ δεν υπαρχουν αρχεια ? Αν βοηθαει ο ΓΟΝΙΚΟΣ φακελος (αυτος που προκυπτει απο το vb δηλ) εχει σταθερη ονοματοδοσια (π.χ. test0001 , test0002 κλπ) ενω οι υποφακελοι που δημιουργουνται απο την εντολη στο bat εχουν και παλι σταθερη ονοματοδοσια και ειναι της μορφης (0001,0002,κλπ κλπ) Θα πρεπει με καποιον τροπο να τρεχει μαζι με το πρωτο vb για να παιρνει τον τρεχον αριθμο του φακελου που θα δημιουργηθει ?! θα πρεπει με καποιον τροπο να βρισκει τις ονομασιες των υποφακελων που δημιουργηθηκαν ?(τους 0001,0002 , κλπ που ανεφερα παραπανω) ---> αυτο ειναι ευκολο και προκυπτει με bat εντολες στο "κυριως" bat file. Ευχαριστω εκ των προτερων EDIT : ενταξει βιαστηκα να ρωτησω , γινεται ευκολα με bat http://stackoverflow.com/questions/10813943/check-if-any-type-of-files-exist-in-a-directory-using-batch-script Eιναι ομως τροφη για σας που ασχολειστε με την VB
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα