2010-06-17 9 views
0

J'essaye de coder un fichier séquentiel pour ne copier que le dernier fichier daté dans un dossier donné vers un autre répertoire sur la machine locale, et de le renommer comme il le fait.Comment coder un fichier batch pour copier et renommer le fichier le plus récent?

J'ai trouvé une question similaire ici

How do I write a Windows batch script to copy the newest file from a directory?

et ont réussi à bricoler le code ci-dessous d'autres forums aussi, mais ont frappé un mur de briques comme il en résulte que dans le fichier batch lui-même étant copié dans le dossier de destination. Peu m'importe où le fichier de commandes se trouve pour que cela fonctionne.

Le dossier source est C:! BATCH et le dossier de destination est C: \ DROP

Le code est ci-dessous, excuses si c'est une réponse évidente, mais c'est littéralement la première incursion dans le codage des fichiers batch pour moi ... Merci!

@echo off 

setLocal EnableDelayedExpansion 

pushd C:\! BATCH 

for /f "tokens=* delims= " %%G in ('dir/b/od') do (set newest=%%G) 

copy "!newest!" C:\DROP\ 

PAUSE 

Répondre

0

Essayez de déplacer la commande pushd au-dessus de la commande setLocal.

Ma conjecture est que le "!" Le caractère a une signification particulière pour l'expansion retardée. Il se peut donc que vous ne puissiez pas l'utiliser comme partie d'un nom de chemin après avoir activé l'expansion différée.

Vous pouvez également supprimer le point d'exclamation de votre chemin si vous n'en avez pas vraiment besoin, cela peut être plus facile.

+0

Thankyou tellement, ça marche! Bien que la seule chose est qu'il ne renomme pas le fichier quand il se déplace. Malheureusement, pour des raisons qui sont trop longues pour entrer ici, le répertoire source devra garder le '!' dans son nom. Toutes les autres idées sur la façon d'avoir le script renommer simultanément le fichier seraient très appréciées! –

+0

L'autre réponse récemment publiée a un bon moyen de renommer le fichier avec la commande de copie. belisarius a aussi un bon point que vous devriez explicitement désactiver l'expansion retardée avant d'appeler pushd, juste au cas où votre script est appelé avec une extension retardée déjà activée. – WildCrustacean

0

Je pense que ce petit mods permettent à votre script pour faire ce que vous voulez

@echo on 
setLocal DisableDelayedExpansion 
pushd "C:\! BATCH" 
setLocal EnableDelayedExpansion 

for /f "tokens=* delims= " %%G in ('dir/b/od') do (set newest=%%G) 

copy %newest% C:\DROP\newname.txt 

PAUSE 
POPD 

newname.txt ... est le nouveau nom :)

+0

C'est génial, ça marche parfaitement! Un grand merci à vous deux! –

+0

Chaque 'setlocal' pousse un nouveau cadre sur la pile d'environnement, et devrait être suivi d'un' endlocal' correspondant pour nettoyer cette pile. La plupart des gens ne s'inquiètent pas et laissent juste la fuite du cadre à la fin du script, mais c'est quelque chose dont il faut être conscient. –

Questions connexes