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

batch file σε windows7/8


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

Δημοσ.

καλησπερα σε ολους , 

 

θελω να φτιαξω ενα batch file που θα κανει το εξης.

 

1.θα τσεκαρει σε συγκεκριμενο φακελο (συνηθως στον φακελο απο οπου θα τρεχει) αν υπαρχουν φακελοι με ονομασια για παραδειγμα testX  , οπου Χ θα ειναι ενα νουμερο απο 1 εως 100 ας πουμε

2.αν δεν βρει κανενα φακελο με σχετικη ονομασια θα δημιουργει εναν φακελο με τον πρωτο διαθεσιμο αριθμο , δηλ αν δεν υπαρχει κανενας φακελος ονοματι testX , θα δημιουργει τον φακελο test1.

3.αν υπαρχει φακελος test1,test2 τοτε θα δημιουργει τον φακελο test3 .Aν υπαρχουν φακελοι , test1,test2,test10 , θα ελεγχει απο χαμηλα πρωτα και θα δημιουργει το test3..δηλ το πρωτο διαθεσιμο...και οταν φτασει στο test10..θα δημιουργησει το test11...κλπ κλπ

4.θα εκτελει στην συνεχεια καποιες αλλες εντολες που δεν ειναι του παροντος , ισως να καλει καποιο αλλο .bat .

 

στην ουσια τα 3 πρωτα με ενδιαφερουν

 

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

Δημοσ.

Ψάχνοντας λίγο βρήκα αυτό:

@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

Δημοσ. (επεξεργασμένο)

Με 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)



Επεξ/σία από australis
Δημοσ.

Ευχαριστω και τους 2 για τις απαντησεις...

 

Το τελευταιο του australis δουλεψε οπως προβλεπεται , τουλαχιστον με καποιες δοκιμες που εκανα.Ολα αυτα ειναι μερος ευρυτερου προτζεκτ για αυτο και δεν εχω τον χρονο να τα ψαξω μονος μου...

Δημοσ.

να κανω ακομα μια ερωτηση..

 

εστω οτι χρησιμοποιω το vb script μεσα σε ενα batch file που το καλω με cscript .

Αν στην συνεχεια θελω να χρησιμοποιησω μια μεταβλητη του vb script , π.χ. το NewFolder , στο batch file αυτο πως θα γινει?

Δημοσ.

Προσθεσε στο script τα παρακατω:

 

Set wshshell = CreateObject("WScript.Shell")
Dim WshSySEnv
Set WshSysEnv = wshshell.Environment("Volatile")
WshSysEnv("TEST_ENV_VAR") = NewFolder
Set WshSySEnv = Nothing

 

Αυτό θα δημιουργησει τη μεταβλητη περιβάλλοντος TEST_ENV_VAR και θα τις αποδώσει τη τιμη της newfolder

Μπορεις να γραψεις πολλες εντολες  WshSysEnv("...") = .... και να δημιουργήσεις παραπανω από μια μεταβλητες περιβαλλοντος

 

Φαντάζομαι ότι ξερεις διαχειριση και κανονες των environment variables

 

Σημ. Όταν κανεις log-off το συστημα η τιμη θα χαθει

 

 
 


To παραπανω χρησιμοποιησε το αν θελεις να περνας στο περιβαλλον κατι που υπολογιστηκε στο script πχ το newfolder

  

Aν κατι δεν υπολογίζεται στο script (πχ basicfolder) είναι προτιμοτερη άλλη διαχειριση (env.variable που θα περναει στο script)

Δημοσ.

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

 

το 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 και απλα προσπαθω να υλοποιησω το σκριπτακι αμεσα μιας και ειναι το μεσο του σκοπου μου :)

Δημοσ.

Στο τελευταίο σκριπτ  αφαίρεσε το

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%
  • Like 1
Δημοσ.

 

Στο τελευταίο σκριπτ  αφαίρεσε το

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 για τις απαντησεις σας :)

Δημοσ.

ενα ακομα θεματακι για να μην βαριομαστε :)

 

οπως ηδη ξερετε το σκριπτακι , δημιουργει φακελους με αυξανομενους αριθμους στην ονομασια και ελεγχοντας ποιο νουμερο λειπει κλπ

επειτα καλω αυτο το σκριπτ μεσα σε ενα αλλο σκριπτ (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 :)

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...