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

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

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

Était-ce utile?

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:

  1. liste tous les fichiers au format {heure} {fichier}.
  2. triez-les par heure
  3. obtenir le dernier
  4. couper le temps et les espaces du début / fin
  5. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top