web-dev-qa-db-fra.com

Comment écrire un script batch Windows pour copier le fichier le plus récent à partir d'un répertoire?

J'ai besoin de copier le fichier le plus récent d'un répertoire vers un nouvel emplacement. Jusqu'ici, j'ai trouvé des ressources sur la commande forfiles , une question liée à la date ici, et une autre question liée . J'ai juste un peu de mal à assembler les morceaux! Comment copier le fichier le plus récent de ce répertoire dans un nouvel emplacement?

67
Devrin

Windows Shell, une doublure:

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

La réponse acceptée donne un exemple d'utilisation du fichier le plus récent dans une commande, puis de la fermeture. Si vous avez besoin de le faire dans un fichier bat avec d'autres opérations complexes, vous pouvez utiliser ce qui suit pour stocker le nom du fichier le plus récent dans une variable:

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

Vous pouvez maintenant référencer% NewestFile% dans le reste de votre fichier bat.

Par exemple, voici ce que nous utilisons pour obtenir la dernière version d'un fichier .bak de base de données à partir d'un répertoire, le copier sur un serveur, puis restaurer la base de données:

: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"
127
Chris Magnuson

Pour que cela fonctionne avec les noms de fichiers utilisant des espaces, une version modifiée de la réponse acceptée est nécessaire:

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

@Chris Noe

Notez que l'espace devant le & fait partie de la commande précédente. Cela m’a mordu avec SET, qui ajoute heureusement des espaces vides dans la valeur.

Pour contourner l'espace de fin ajouté à une variable d'environnement, placez la commande set entre parenthèses.

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

3
Richard
@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

Ma tentative de copier le dernier fichier d'un dossier

il suffit de définir vos dossiers source et cible et cela devrait fonctionner

Celui-ci ignore les dossiers, ne concerne que les fichiers

Nous vous recommandons de choisir le type de fichier dans le chemin DIR en changeant *.* à *.Zip par exemple

TIMEOUT ne fonctionnera pas sous WinXP, je pense

2
DoTheEvo

Je sais que vous avez demandé Windows mais que vous pensiez ajouter cela de toute façon. Sous Unix/Linux, vous pouvez le faire:

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

Qui va lister tous les fichiers du répertoire courant triés par date de modification puis cp le plus récent dans/somedir /

2
Robert Swisher

Cela ouvrira une deuxième fenêtre cmd.exe. Si vous voulez qu'il s'en aille, remplacez le/K par/C.

Évidemment, remplacez new_file_loc par le nouvel emplacement de votre fichier.

@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
2
moswald