Come posso scrivere uno script batch di Windows per copiare il file più recente da una directory?
-
01-07-2019 - |
Domanda
Devo copiare il file più recente in una directory in una nuova posizione.Finora ho trovato risorse su forfiles comando, a domanda relativa alla data qui e un altro domanda correlata.Ho solo qualche difficoltà a mettere insieme i pezzi!Come copio il file più recente in quella directory in una nuova posizione?
Soluzione
Shell di Windows, una fodera:
FOR /F %%I IN ('DIR *.* /B /O:-D') DO COPY %%I <<NewDir>> & EXIT
Altri suggerimenti
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, è possibile utilizzare quanto segue per memorizzare il nome 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 usiamo per ottenere l'ultima versione di un file .bak di database da una directory, copiarlo 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 <username> -P <password> -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 il funzionamento con i 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" <<NewDir>> & GOTO :END
:END
@Chris Noe
Tieni presente che lo spazio davanti a & diventa parte del comando precedente.Questo mi ha colpito con SET, che inserisce felicemente gli spazi finali nel valore.
Per aggirare lo spazio finale aggiunto a una variabile d'ambiente, racchiudere il comando set tra parentesi.
Per 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 potresti 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 in /somedir/
Si aprirà una seconda finestra cmd.exe.Se vuoi che scompaia, sostituisci /K con /C.
Ovviamente, sostituisci new_file_loc con qualunque sarà la nuova posizione del 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 di destinazione e dovrebbe funzionare
Questo ignora le cartelle, si occupa solo dei file
Si consiglia di scegliere il tipo di file nel percorso DIR modificabile *.*
A *.zip
Per esempio
Penso che TIMEOUT non funzionerà su WinXP
Bash:
find -type f -printf "%T@ %p \n" \
| sort \
| tail -n 1 \
| sed -r "s/^\S+\s//;s/\s*$//" \
| xargs -iSTR cp STR newestfile
dove "filepiùnuovo" diventerà ilfilepiùnuovo
in alternativa, potresti fare newdir/STR o semplicemente newdir
Guasto:
- elenca tutti i file nel formato {time} {file}.
- ordinarli per tempo
- prendi l'ultimo
- tagliare il tempo e gli spazi bianchi dall'inizio/fine
- copiare il valore risultante
Importante
Dopo averlo eseguito una volta, il file più recente sarà quello che hai appena copiato :p (supponendo che siano entrambi nello stesso ambito di ricerca).Quindi potresti dover modificare il numero di file da copiare se vuoi che funzioni più di una volta.