denz Δημοσιεύτηκε Σεπτέμβριος 1, 2018 #1 Κοινοποίηση Δημοσιεύτηκε Σεπτέμβριος 1, 2018 (edited) Γεια σας, Έχω κάποια αρχεία σε έναν τοπικό φάκελο τα οποία θέλω να τσεκάρω με ένα .bat αν υπάρχουν σε ένα dir με πολλά subdirs στον datacenter μου και αν ναι να μετακινήσω τα αρχεία αυτά απο τόν τοπικό φάκελο 1 σε έναν άλλο τοπικό φάκελο 2. Ο κώδικας που έχω χτίσει και λειτουργεί είναι ο εξής @echo off pushD \\server\pdf for /r %%i in ( *.pdf ) do ( if exist "%userprofile%\desktop\F1\%%~nxi" ( move /y "%userprofile%\desktop\F1\%%~nxi" %userprofile%\desktop\F2 ) else echo File %%~nxi is not a duplicate ) popD pause Όπως βλέπετε ορίζω το dir του datacenter server και μετά με την for /r ψάχνω όλα τα .pdf αρχεία που υπάρχουν στα subdirs. Το πρόβλημα μου είναι ότι τα αρχεία που υπάρχουν μέσα στα subdirs του datacenter είναι πραγματικά πολλά οπότε το operation αργεί πολύ να τελειώσει. Θέλω με κάποιον τρόπο να θέσω μια παράμετρο να ψάχνει μόνο όσα έχουν modified date την εκάστοτε σημερινή. Σκέφτηκα να αντικαταστήσω την for /r με forfiles /s /m *.pdf /d +0 /c όπου με την παράμετρο /d +0 φιλτράρει τα pdf αρχεία που με βολεύουν (με σημερινή ημερομηνία) αλλά δεν ξέρω πως να την συνδέσω με την if exist και έπειτα με Move κτλπ. Νομίζω ότι δεν γίνεται έτσι κιόλας αν δεν κάνω λάθος. Οποιαδήποτε βοήθεια ευπρόσδεκτη! Έγινε επεξεργασία Σεπτέμβριος 1, 2018 από denz Link to comment Share on other sites More sharing options...
defiant Σεπτέμβριος 2, 2018 #2 Κοινοποίηση Σεπτέμβριος 2, 2018 Με forfiles θα βγαλει μονο τα αρχεια που εχεις ορισει(pdf με σημερινο modified date), οποτε δεν χρειαζεσαι το if exists, αν καταλαβα σωστα. Με το @file περνεις το ονομα του αρχειου και με το @path περνεις το full path name του αρχειου. Δεν εχω windows για να δοκιμασω τωρα αλλα δοκιμασε forfiles /s /m *.pdf /d +0 /c move /y @file %userprofile%\desktop\F2 Για περισσοτερες πληροφοριες https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/forfiles Link to comment Share on other sites More sharing options...
Rebel Streamers Μάϊος 20 #3 Κοινοποίηση Μάϊος 20 (edited) On 9/2/2018 at 2:28 AM, denz said: Γεια σας, Έχω κάποια αρχεία σε έναν τοπικό φάκελο τα οποία θέλω να τσεκάρω με ένα .bat αν υπάρχουν σε ένα dir με πολλά subdirs στον datacenter μου και αν ναι να μετακινήσω τα αρχεία αυτά απο τόν τοπικό φάκελο 1 σε έναν άλλο τοπικό φάκελο 2. Ο κώδικας που έχω χτίσει και λειτουργεί είναι ο εξής @echo off pushD \\server\pdf for /r %%i in ( *.pdf ) do ( if exist "%userprofile%\desktop\F1\%%~nxi" ( move /y "%userprofile%\desktop\F1\%%~nxi" %userprofile%\desktop\F2 ) else echo File %%~nxi is not a duplicate ) popD pause Όπως βλέπετε ορίζω το dir του datacenter server και μετά με την for /r ψάχνω όλα τα .pdf αρχεία που υπάρχουν στα subdirs. Το πρόβλημα μου είναι ότι τα αρχεία που υπάρχουν μέσα στα subdirs του datacenter είναι πραγματικά πολλά οπότε το operation αργεί πολύ να τελειώσει. Θέλω με κάποιον τρόπο να θέσω μια παράμετρο να ψάχνει μόνο όσα έχουν modified date την εκάστοτε σημερινή. Σκέφτηκα να αντικαταστήσω την for /r με forfiles /s /m *.pdf /d +0 /c όπου με την παράμετρο /d +0 φιλτράρει τα pdf αρχεία που με βολεύουν (με σημερινή ημερομηνία) αλλά δεν ξέρω πως να την συνδέσω με την if exist και έπειτα με Move κτλπ. Νομίζω ότι δεν γίνεται έτσι κιόλας αν δεν κάνω λάθος. Οποιαδήποτε βοήθεια ευπρόσδεκτη! καταρχήν θα ήθελα να αναφέρω γενικότερα με την pushd σε UNC Path γιατι σύμφωνα με την microsoft αν γράψεις pushd /? Quote If Command Extensions are enabled the PUSHD command accepts network paths in addition to the normal drive letter and path. If a network path is specified, PUSHD will create a temporary drive letter that points to that specified network resource and then change the current drive and directory, using the newly defined drive letter. Temporary drive letters are allocated from Z: on down, using the first unused drive letter found. με λίγα λόγια είναι καλύτερα να μην δουλεύετε σε \\ αλλά να τα κάνετε assign σε γράμματα γιατί αυτό το κάνει στο παρασκήνιο που αν κάτι στραβώσει δεν θα καταλάβετε γιατί στράβωσε (να χάνει περιοδικά την επικοινωνία και να κάνει assign άλλο γραμμα!) Τωρα... στο ερωτημα πως να τα κατηγοριοποιήσεις σύμφωνα με την ημερομηνία και να κάνεις copy μετα απο μια ημερομηνία η απάντηση έρχεται από την for αν γράψετε πάλι for /? καπου προς το τελος της βοηθειας λεει τα πιο σημαντικά πραγματα για τις μεταβλητες: Quote You can now use the following optional syntax: %~I - expands %I removing any surrounding quotes (") %~fI - expands %I to a fully qualified path name %~dI - expands %I to a drive letter only %~pI - expands %I to a path only %~nI - expands %I to a file name only %~xI - expands %I to a file extension only %~sI - expanded path contains short names only %~aI - expands %I to file attributes of file %~tI - expands %I to date/time of file %~zI - expands %I to size of file η μεταβλητη που θες ειναι η %~tI και στο επόμενο script που δεν θα χρησιμοποιήσω την pushd / popd γιατί ειναι σε UNC path και δεν θέλω να το βάλω στον κώδικα μου, θα δεις πως μπορώ να βρω ολα τα txt αρχεία μετά απο ένα μήνα (τον δέκατο , δηλαδή τον Οκτώβριο) . @echo off rem βαλε utf-8 font για να μην σκασει το batch . τα windows 10+ ειναι chcp 65001>NUL setlocal && cd /D "%~dp0" setlocal enabledelayedexpansion for /r %%i in ( *.txt ) do ( rem φορματ της ημερομηνιας απο for /? rem echo %%~ti set filez="%%~ti" rem φερνει τους μηνες με τα // set cleanFilez=!filez:~3,4! rem φερνει μονο τους μηνες τωρα rem echo !cleanFilez! set finalDateFile=!cleanFilez:~1,2! rem μετα τον Οκτωβριο rem echo !finalDateFile! if !finalDateFile! geq 10 ( echo οι εντολες move μπαινουν εδω, ο μήνας ειναι !finalDateFile! rem δεν εχει else. θα παει στο επομενο αν δεν βρει μηνα μεγαλύτερο ή ισο απο 10 ) ) to script εξετάζει τα αρχεία text του καταλόγου που θα βάλετε το script () τώρα επιπλέον πληροφορίες που θέλει κάποιος να πάρει ας βγάλει τα comment για να δει πως εμφανίζεται αρχικά ολόκληρη η ημερομηνία και ας απομονώσει οτι θέλει Έγινε επεξεργασία Μάϊος 20 από Rebel Streamers Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now