Comment écrire un script batch Windows pour copier le fichier le plus récent à partir d'un répertoire?
-
01-07-2019 - |
Question
Je dois copier le fichier le plus récent d'un répertoire dans un nouvel emplacement. Jusqu'à présent, j'ai trouvé des ressources dans la commande forfiles , une question relative à la date ici, et une autre question connexe . 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?
La solution
Windows shell, un liner:
FOR /F %%I IN ('DIR *.* /B /O:-D') DO COPY %%I <<NewDir>> & EXIT
Autres conseils
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 devez 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"
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
@Chris Noe
Notez que l'espace situé devant le & amp; fait partie de la commande précédente. Cela m’a mordu avec SET, qui ajoute heureusement des blancs dans la valeur.
Pour contourner l'espace de fin ajouté à une variable d'environnement, placez la commande set entre parenthèses.
E.g. FOR / F %% I IN ('DIR "*. *" / B / O: D') DO (SET NewestFile = %% I)
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 listera tous les fichiers du répertoire courant triés par date de modification, puis cp le plus récent dans / somedir /
Ceci 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
@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 fichier le plus récent d'un dossier
définissez simplement 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 d'accès DIR en remplaçant *. *
par *. zip
, par exemple
TIMEOUT ne fonctionnera pas sous WinXP, je pense
Bash:
find -type f -printf "%T@ %p \n" \
| sort \
| tail -n 1 \
| sed -r "s/^\S+\s//;s/\s*$//" \
| xargs -iSTR cp STR newestfile
où " plus récent fichier " deviendra le plus récent fichier
alternativement, vous pouvez faire newdir / STR ou juste newdir
Ventilation:
- liste tous les fichiers au format {heure} {fichier}.
- triez-les par heure
- obtenir le dernier
- couper le temps et les espaces du début / fin
- copier la valeur résultante
Important
Après avoir exécuté cette première fois, le fichier le plus récent sera celui que vous venez de copier: p (en supposant qu'ils appartiennent tous les deux au même champ de recherche). Vous devrez donc peut-être ajuster le numéro de fichier que vous copiez si vous voulez que cela fonctionne plus d'une fois.