WinTricks Forum

WinTricks Forum (http://forum.wintricks.it/index.php)
-   Programmazione (http://forum.wintricks.it/forumdisplay.php?f=21)
-   -   batch copia file da a.... (http://forum.wintricks.it/showthread.php?t=165706)

salim 05-02-2017 20.29.28

batch copia file da a....
 
Avrei bisogno di un BATCH che mi faccia una copia di un file txt:

da \\myserver\mydir\miofile.txt a c:\miadir\miofile_06022017.txt

Dove la data nel file destinazione (06022017) è la data dell'ultima modifica del file sorgente

grazie per l'aiuto.

Bentrovati!

LoryOne 09-02-2017 12.22.33

Rif: batch copia file da a....
 
Dalla shell di windows, copia ed incolla, poi premi invio.
Che risultato ti da ?
Codice:

for /f %a in ('"dir \windows\*.ini /TW|findstr "^^[0-9]""') do @echo %a
Posta il risultato cortesemente, poi ti dico cos'è successo.

LoryOne 14-02-2017 12.18.42

Rif: batch copia file da a....
 
Il risultato potrebbe essere una cosa del genere:
06/04/2011
03/02/2017
18/10/2016
09/02/2017
02/09/2004
02/09/2004
05/03/2007
13/09/2016
11/08/2008
Cosa è successo ?
Succede che appare a video una lista di date che equivalgono ognuna alla data di ultima scrittura (opzione /TF) di un gruppo di files (\windows\*.ini) dati in pasto all'utility dir (dir /?).
Infatti, digitando:
C:\>dir \windows\*.ini /TF
a video risulta la lista di cui sopra, ma molto più dettagliata.
Supponendo, però, di scomporre l'output in stringhe di testo separate da spazi, si potrebbe identificare ogni stringa (token) come valore di una o più variabili in numero pari a quello delle stringhe stesse: Cio sarebbe utile per identificare una sola variabile il cui valore è esattamente cio di cui si necessita.
Infatti, \miofile.txt sorgente e miofile_06022017.txt destinazione, differiscono nel nome proprio in base alla data.
Come si fa in un batch ad assegnare un valore ad una variabile che cambia in funzione dell'output prodotto da un'utility che scrive a video ?
Di solito, viene utilizzata la direttiva For (For /?) che esegue in modo ricorsivo cio che viene specificato di seguito.
Infatti, digitando:
for /f %a in ... do
si fa in modo che la variabile %a acquisisca valori sempre diversi in base alle condizioni specificate tra in e do; La variabile %a, può subire ulteriori affinamenti derivanti dalla specifica di una condizione più restrittiva, quale può essere ('"dir \windows\*.ini /TW|findstr "^^[0-9]""').
Il carattere "|" (pipe), viene tradotto come "cio che è in output dal risultato di cio che mi precede lo passo come input a cio che mi succede", pertanto ogni singola riga prodotta in output dal comando dir, verrà processata in input da findstr (findstr /?).
La condizione specificata in findstr, è un espressione regolare che impone di estrarre ad ogni inizio riga la prima stringa di testo che contiene uno o più caratteri inclusi nel range [0-9], di fatto la nostra data.
Siccome nessuna delle righe precedenti l'indicazione del file *.ini contiene i caratteri specificati nel range indicato, alla variabile %a sarà associato un valore pari alla stringa estratta da findstr per ogni file in lista visualizzato da dir.
A conclusione del ciclo for ...in ... do, %a conterrà il valore della data relativa all'ultimo file .ini.
Poichè serve una sola data relativa ad un nome file specifico, basta indicare il nome in dir, cioè:
for /f %a in ('"dir \windows\desktop.ini /TW|findstr "^^[0-9]""') do @echo %a
Sembra fin troppo semplice, ma non è proprio così.
Quando si ha a che fare con percorsi di rete, il comando dir \\[percorso] non funziona. (Vedasi UNC path name)
Affinchè esso produca identico risultato che ci si aspetterebbe agendo sui percorsi in locale, basta mappare il percorso di rete su un identificativo di drive, specificando la lettera attraverso il comando net use, es:
net use y: \\myserver\mydir
for /f %a in ('"dir y:\miofile.txt /TW|findstr "^^[0-9]""') do @echo %a
A questo punto, superato il principale scoglio, la stesura del batch dovrebbe scorrere velocemente e con minimo impegno.
Ultimo appunto:
La variabile %a può contenere valori di data con separatore '/', ma nel nome del file destinazione questi non devono figurare, pertanto supponendo che la varabile %a contenesse una stringa pari a 06/12/2016, il seguente comando:
echo %a:~0,2%%a:~3,2%%a:~6,4%
produrrebbe come risultato
06122016


Orario GMT +2. Ora sono le: 15.03.35.

vBulletin 3.8.6 - Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.