Come posso scrivere uno script batch di Windows per copiare il file più nuovo da una directory?

Ho bisogno di copiare il nuovo file in una directory in una nuova posizione. Finora ho trovato risorse sul comando forfiles , una domanda relativa alla data qui e un’altra domanda correlata . Sto solo avendo un po ‘di problemi a mettere insieme i pezzi! Come faccio a copiare il nuovo file in quella directory in un nuovo posto?

Shell di Windows, una fodera:

FOR /F %%I IN ('DIR *.* /B /O:-D') DO COPY %%I <> & EXIT 

La risposta accettata fornisce un esempio di utilizzo del file più recente in un comando e quindi di uscita. Se è necessario eseguire questa operazione in un file bat con altre operazioni complesse, è ansible utilizzare quanto segue per memorizzare il nome file del file più recente in una variabile:

 FOR /F "delims=|" %%I IN ('DIR "*.*" /B /O:D') DO SET NewestFile=%%I 

Ora puoi fare riferimento a% NewestFile% nel resto del tuo file bat.

Ad esempio, ecco cosa utilizziamo per ottenere l’ultima versione di un file .bak del database da una directory, copiarla su un server e quindi ripristinare il db:

 :Variables SET DatabaseBackupPath=\\virtualserver1\Database Backups echo. echo Restore WebServer Database FOR /F "delims=|" %%I IN ('DIR "%DatabaseBackupPath%\WebServer\*.bak" /B /O:D') DO SET NewestFile=%%I copy "%DatabaseBackupPath%\WebServer\%NewestFile%" "D:\" sqlcmd -U  -P  -d master -Q ^ "RESTORE DATABASE [ExampleDatabaseName] ^ FROM DISK = N'D:\%NewestFile%' ^ WITH FILE = 1, ^ MOVE N'Example_CS' TO N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Example.mdf', ^ MOVE N'Example_CS_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Example_1.LDF', ^ NOUNLOAD, STATS = 10" 

Per consentire a questo di lavorare con nomi di file che utilizzano spazi, è necessaria una versione modificata della risposta accettata:

 FOR /F "delims=" %%I IN ('DIR . /B /O:-D') DO COPY "%%I" <> & GOTO :END :END 

@ Chris Noe

Nota che lo spazio davanti al & diventa parte del comando precedente. Questo mi ha morso con SET, che mette felicemente gli spazi finali nel valore.

Per aggirare lo spazio finale che viene aggiunto a una variabile di ambiente, avvolgere il comando set in paren.

Ad esempio FOR /F %%I IN ('DIR "*.*" /B /O:D') DO (SET NewestFile=%%I)

So che hai chiesto Windows ma ho pensato di aggiungerlo comunque, in Unix / Linux puoi fare:

 cp `ls -t1 | head -1` /somedir/ 

Che elencherà tutti i file nella directory corrente ordinati per ora di modifica e quindi cp il più recente a / somedir /

Si aprirà una seconda finestra di cmd.exe. Se vuoi che vada via, sostituisci / K con / C.

Ovviamente, sostituisci new_file_loc con qualunque sia il tuo nuovo percorso di file.

 @echo off for /F %%i in ('dir /B /O:-D *.txt') do ( call :open "%%i" exit /B 0 ) :open start "window title" "cmd /K copy %~1 new_file_loc" exit /B 0 
 @echo off set source="C:\test case" set target="C:\Users\Alexander\Desktop\random folder" FOR /F "delims=" %%I IN ('DIR %source%\*.* /A:-D /O:-D /B') DO COPY %source%\"%%I" %target% & echo %%I & GOTO :END :END TIMEOUT 4 

Il mio tentativo di copiare il file più recente da una cartella

basta impostare le cartelle di origine e destinazione e dovrebbe funzionare

Questo ignora le cartelle, si preoccupa solo dei file

Consigliamo di scegliere il tipo di file nel percorso DIR cambiando *.* *.zip per esempio

TIMEOUT non funzionerà su winXP, penso

bash:

  find -type f -printf "%[email protected] %p \n" \ | sort \ | tail -n 1 \ | sed -r "s/^\S+\s//;s/\s*$//" \ | xargs -iSTR cp STR newestfile 

dove “newestfile” diventerà il file più nuovo

in alternativa, potresti fare newdir / STR o solo newdir

Abbattersi:

  1. elenca tutti i file nel formato {time} {file}.
  2. ordinali per tempo
  3. prendi l’ultimo
  4. tagliare il tempo e gli spazi bianchi dall’inizio / fine
  5. copia il valore risultante

Importante

Dopo aver eseguito questa volta, il file più recente sarà quello che hai appena copiato: p (supponendo che siano entrambi nello stesso ambito di ricerca). Quindi potresti dover aggiustare il filenumber che copi se vuoi che funzioni più di una volta.