Coller sur des noms de dossiers avec batch

Fermé
sato - 24 mai 2022 à 13:53
 sato - 25 mai 2022 à 13:58
Bonjour,
je doit réaliser un script copient un fichier "texte.txt" sur plein de dossiers qui commence par "analyse", mais ne pas remplacer s'y les fichier existe déjà.
Le problème est que je n'y arrive pas.
voici le scipt

@echo off
cd c:\Users\BMFD_SUR\Documents\a\
echo . > texte.txt
copy /-y c:\Users\BMFD_SUR\Documents\a\text.txt c:\Users\BMFD_SUR\Documents\a\analyse;
del c:\Users\BMFD_SUR\Documents\a\texte.txt
cd..



Configuration: Windows / Chrome 101.0.4951.67

4 réponses

brucine Messages postés 14320 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 26 avril 2024 1 815
24 mai 2022 à 15:44
Bonjour,

Sur la syntaxe, tu as écrit "text" au lieu de "texte" dans la source de COPY et utilisé comme caractère joker dans la destination ";" au lieu de "*".
Au lieu de spécifier temporairement le path par CD, le spécifier par CD /D, ce qui offre l'avantage de ne pas devoir le ressaisir par la suite.
La fin en CD .. ne sert pas davantage si le batch est fini.

Sur le fond, il y a une ambiguïté quant à savoir si la destination est un fichier ou un dossier, et -Y ne sert à rien (ne fera qu'avertir, et l'astuce consistant à s'en servir pour copie sélective ne fonctionne que pour un fichier).
A tout hasard, on va remplacer COPY par XCOPY /I, mais je ne suis pas persuadé du résultat:


@echo off
cd /D c:\Users\BMFD_SUR\Documents\a\
echo . > texte.txt
IF NOT EXIST "c:\Users\BMFD_SUR\Documents\a\analyse*\texte.txt (
xcopy /I "c:\Users\BMFD_SUR\Documents\a\texte.txt "c:\Users\BMFD_SUR\Documents\a\analyse*"
)
del c:\Users\BMFD_SUR\Documents\a\texte.txt

:EOF


On peut d'ailleurs ne pas spécifier le chemin dans source et destination, puisqu'il a été spécifié par CD /D.
C'est ce qu'on fait dans cette deuxième solution, qui teste et traite la destination en boucle:


@echo off
cd /D c:\Users\BMFD_SUR\Documents\a\
echo . > texte.txt

DIR analyse* /b /a-d > tmp.txt

SETLOCAL ENABLEDELAYEDEXPANSION

FOR /F "delims=" %%a IN ('type "tmp.txt"') DO SET FOLDNAME=%%a & CALL :PROCESS
DEL tmp.txt
GOTO :EOF

:PROCESS
IF NOT EXIST \!FOLDNAME!\texte.txt (
xcopy /I \texte.txt \!FOLDNAME!\
)

:EOF
del texte.txt


Noter que j'ai assumé que tous les dossiers s'appellent analyse(xxx) et sont en premier rang d'arborescence sous \a; si un dossier s'appelle "analyse" tout court, il faut bien sûr changer le joker en analys* et malgré les précautions, il faudra peut-être en prendre d'autres s'il existe au même emplacement des fichiers analyse*.
0
re bonjour,
tout d'abord merci pour le temps passé sur ma question.
j'ai essayé de faire fonction le script, mais comme celui du départ, il ne trouve pas le fichier à cause de l'argument "*" le script pense que sa fait partit du nom dossier.

pour CD.. il était la pour lancer le script depuis le dossier d'exécution quand je faisait des test en boucle, c'était pour rester dans le même dossier sur la console.
0
brucine Messages postés 14320 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 26 avril 2024 1 815
24 mai 2022 à 18:48
C'est bien ce que je craignais dans ma première proposition, mais la seconde, DIR analyse* fonctionne, j'ai testé.

Je n'ai pas testé le batch lui-même et les boucles avec expansion des variables peuvent réclamer des ajustements, mais on n'a plus le problème puisque DIR met tous les noms de dossiers analyse* dans un fichier tmp, que FOR va les traiter un par un pour les envoyer à :PROCESS et qu'ils ne sont plus alors définis que par leur nom successif !FOLDNAME!.
0
dans la première solution il y a eu une erreur de syntaxe que je n'est pas su déceler à
"echo . > texte.txt"

dans la deuxième l'erreur venait du paramètre "dire (...) /a-d" j'ai simplement enlever le paramètres et l'erreur était partit. Mais il reste encore une erreur sur la ligne "FOR /F "delims=" %%a IN ('type "tmp.txt"') DO SET FOLDNAME=%%a & CALL :PROCESS"
nombre de paramètres non valide
0
brucine Messages postés 14320 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 26 avril 2024 1 815
25 mai 2022 à 13:25
Bonjour,

La commande echo, c'est toi le coupable, il ne doit pas y avoir d'espace entre echo et le point (et on doit privilégier : à . si un fichier est susceptible de s'appeler echo).

En effet, j'ai oublié de virer /a-d mais la question n'est pas là, elle est que pour une raison qui m'échappe la commande DIR génère un espace après le nom de dossier qui rend la commande XCOPY invalide et qu'il faut donc ratiboiser.

Cette fois-ci testé, j'ai spécifié des noms de chemin et de dossiers qui me sont propres, tu corriges évidemment en conséquence le nom de dossier à chercher ma* par analyse* et le chemin G:\ par c:\Users\BMFD_SUR\Documents\a\


@echo off
cd /D G:\
ECHO. > texte.txt

DIR /b \ma*>>tmp.txt

FOR /F "tokens=1 delims=" %%a IN (G:\tmp.txt) DO SET FOLDNAME=%%a & CALL :PROCESS
DEL texte.txt
DEL tmp.txt
GOTO :EOF

:PROCESS
SET FOLDNAME=%FOLDNAME:~0,-1%
IF NOT EXIST G:\%FOLDNAME%\texte.txt (
XCOPY /I G:\texte.txt G:\%FOLDNAME%\
)

:EOF
0
en effet sa marche merci pour le coup de mains
0