Jump to content



Batch για εύρεση διπλότυπων και μετακίνηση τους


denz

Recommended Posts

Γεια σας,

Έχω κάποια αρχεία σε έναν τοπικό φάκελο τα οποία θέλω να τσεκάρω με ένα .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 κτλπ. Νομίζω ότι δεν γίνεται έτσι κιόλας αν δεν κάνω λάθος.

 

Οποιαδήποτε βοήθεια ευπρόσδεκτη!

Έγινε επεξεργασία από denz
Link to comment
Share on other sites

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

  • 5 years later...
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 για να δει πως εμφανίζεται αρχικά ολόκληρη η ημερομηνία και ας απομονώσει οτι θέλει

Έγινε επεξεργασία από Rebel Streamers
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Δημιουργία...

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.