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

StackOverflow https://stackoverflow.com/questions/97371

  •  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?

È stato utile?

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:

  1. elenca tutti i file nel formato {time} {file}.
  2. ordinarli per tempo
  3. prendi l'ultimo
  4. tagliare il tempo e gli spazi bianchi dall'inizio/fine
  5. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top