Remplacer des fichiers dans les dossier avec chemin relatif

Signaler
-
 LowSpec -
Bonjour,

Actuellement j'utilise ce code pour placer un fichier dans plusieurs dossiers portant des noms différents :

@echo off
set nom=Contrat.xml
for /F "delims=" %%a in (Liste.txt) do (
if exist "%%a" copy "%nom%" "%%a\%nom%"
else
echo %%a n'existe pas >> Rapport.txt
)

Cela fonctionne parfaitement (sauf la partie rapport qui m'affiche "n'existe pas" alors que le fichier est correctement copié).

J'aimerai faire évoluer ce code :

1) actuellement mon fichier liste.txt est composé de chemin en dur type D:\Contrat\Nom1\,
D:\Contrat\Nom2\ etc.
J'aimerai pouvoir utiliser ce batch avec des chemins relatif en le plaçant sur la racine "D:" ou idéalement dans "D:\batch\batch 01" par exemple. Comment l'écrire dans le liste.txt pour que le batch l’interprète correctement ?

2) Ensuite, j'aimerai qu'il écrase le fichier existant avec le même nom déjà présent dans le dossier sans demander confirmation. Actuellement il ne copie le fichier que si il n'existe pas dans le dossier de destination. Comment intégrer cette fonction dans le code plus haut ?

Merci d'avance de votre aide !


Configuration: Windows / Chrome 83.0.4103.116

1 réponse

Messages postés
12805
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
15 novembre 2020
3 778
Bonjour,

Petite remarque pour commencer : si tu utilises IF avec ELSE, tu dois utiliser les parenthèses pour délimiter les actions, sinon ça ne fonctionne pas.

if exist "%%a" (copy "%nom%" "%%a\%nom%"
) else (
echo %%a n'existe pas >> Rapport.txt)


1) tu peux utiliser CD comme ceci : cd /d "D:\batch\batch 01"
Ou bien pour te mettre à la racine : D:

Merci pour ta réponse, merci pour la remarque je vais modifier ça.

1) Dans l'exemple j'ai mis D: mais le but est de ne pas avoir à préciser la lettre grâce à un chemin relatif de façon à ce que mon bat traite les fichier en fonction du dossier où il est placé.

2) Comment faire pour qu'il écrase les fichiers existants sans demander confirmation ?
Messages postés
12805
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
15 novembre 2020
3 778 > LowSpec
Tu essaies d'expliquer ce que tu veux mais ça reste flou pour moi.

Où se trouve Contrat.xml ? Obligatoirement au même endroit que le script ?
Quels sont les critères à prendre en compte pour identifier les répertoires "cibles" ?

Est-ce que cette version correspond à tes besoins :
@echo off
set nom=Contrat.xml

for /f "delims=" %%a in ('dir /b /ad') do (
copy /y "%nom%" "%%~dpna"
)
>
Messages postés
12805
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
15 novembre 2020

Merci du temps que tu prends pour répondre.

L'arborescence se présente de cette manière : https://www.cjoint.com/c/JFDwWE3sLpy

- Le batch+liste.txt se trouve à la racine du dossier principal.
- Chaque contrat.xml se situe dans des dossiers situés à l'intérieur du dossier principal.
- Le batch doit remplacer le fichier contrat.xml dans les dossier contenu dans la liste "liste.txt".

Les répertoires cibles peuvent être de noms différents : seul les dossier du fichier liste.txt sont concernés.

Actuellement mon script fonctionne mais ne remplace pas les fichiers déjà existant, et mon fichier liste.txt doit forcement contenir les chemins complet.

Le but pour moi est de pouvoir déplacer le batch dans le dossier immédiatement supérieur et d'utiliser les chemins relatifs (type ./../../Tratanpion/contrat.xml) dans le fichier liste.txt. Ma question était donc de savoir comment faire fonctionner les chemins relatif en les utilisant dans ce fichier txt.

La variable /Y doit être celle qui permet d'écraser le fichier d'origine c'est donc la réponse à ma première question merci !