Probleme de gestion de chaines de caracteres
Bonjour à tous
je me suis lancé dans le batch pensant que la chose serait "simple", mais ce n'est visiblement pas le cas.
Mon but :
dans le cadre professionnel nous avons un logiciel (CAO) qui nous génère x sous-répertoires, puis il place dans chacun de ces sous-répertoires y fichiers qui ont le même nom pour chaque sous-répertoire ... Impossible de rapatrier tous les fichiers au même endroit sans perdre des fichiers donc !
Note 1 : le nombre de sous-répertoire x est variable et leur nom n'a pas de format "standard"
Note 2 : le nombre de fichiers y ainsi que leur nom est variable en fonction des options choisies dans le logiciel de CAO
L'idée est donc de copier dans le répertoire racine les fichiers des sous-répertoires en les renommant " 'nom sous-répertoire'_'nom fichier d'origine' "
J'ai réalisé le code suivant, mais ma problématique est d'arriver à mettre dans la variable 'prefix' le nom du sous-répertoire.
Sinon le reste marche
J'ai essayé pas mal de chose avec les expansions retardées, avec les caractères d'échappement, mais là franchement, cela fait 2 jours que je sèche :(
Je pense que le loup est autour de set PREFIX=%PREFIX:%cd%\\=% mais .... où ?
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| cls
::@echo off
setlocal enabledelayedexpansion
for /d %%r in ("%cd%\*") do (
::ligne suivante pour debug
echo ### main ### %%r
call :listFic %%r
::ligne suivante supprimmer echo en fin de debug
echo rd /S /Q %%r
)
endlocal
echo.
pause
exit /b
::---------------------------- procedure qui boucle sur un repertoire ------------
:listFic
::ligne suivante pour debug
echo func0 %~1
for /r "%~1" %%f in ("*.*") do (
:: but : mettre dans prefix la chaine de carateres : %1 (chemin complet du fichier) dans laquelle la chaine %cd% a ete supprimee
set "PREFIX=%~1"
::ligne suivante pour debug
echo func1 %PREFIX%
set PREFIX=%PREFIX:%cd%\\=%
::ligne suivante pour debug
echo func2 %PREFIX%
::ligne suivante pour debug : a supprimer, actuellement pour test fonction copy
set prefix=dos1
::ligne suivante supprimmer echo en fin de debug
echo copy /Y %~1\%%~nf%%~xf %cd%\%prefix%_%%~nf%%~xf
)
goto :eof |
Merci d'avance pour votre aide
Maintenant si quelqu'un pense qu'en Powershell c'est plus simple (voire plus pérenne dans le temps ?) je suis preneur aussi, tous nos postes étant en win 7 ou win X. Mais de ce coté je ne connais rien !
Eric_MGN
Compris mais quelques précision svp
Bonjour ericlm128,
Bon je crois que j'ai tout compris avec l'aide des tutos du forum
Mais je pense que je n'aurais pas réussi à le sortir sans votre aide.
Pourtant je fais régulièrement du VBA Excel pour le boulot (et j'utilise pas mal les résultats de votre forum pour cela. Que tous ceux qui y participent en soient remercié ici.).
Mais la philosophie me semble différente de la programmation que l'on retrouve sur les langages "évolués"
J'aurais sûrement pu le faire depuis une macro Excel, mais cela me paraissait plus intuitif pour l'utilisateur via un batch
Il me reste cependant 2 questions sur le code fourni par ericlm128 :
- 1) Pourquoi la redirection vers nul >nul à la fin du move ?
- 2) Quand j'ai inséré mes commentaires (pour pouvoir dépanner plus tard si besoin) j'ai eu des erreurs en fonction de la position des commentaires. Avez-vous des explications ?
par exemple si je fais
Code:
1 2 3 4
| MOVE /Y "%dossier%%%~a\%%~b" "%dossier%%%~a%Separ%!NomFic!%%~xb" >nul
:: ajout du /y si on refait la manip plusieurs fois sans avoir supprime les fichiers, pourquoi la redirection de sortie du move vers nul
)
echo ------------------------------------------------------------------------ |
au lieu de
Code:
1 2 3 4
| MOVE /Y "%dossier%%%~a\%%~b" "%dossier%%%~a%Separ%!NomFic!%%~xb" >nul
)
:: ajout du /y si on refait la manip plusieurs fois sans avoir supprime les fichiers, pourquoi la redirection de sortie du move vers nul
echo ------------------------------------------------------------------------ |
j'ai un retour ") était inattendu." et le script se termine
Ci-dessous le code final qui semble convenir à mes collègues avec :
- les commentaires correspondant à ma compréhension du code
- la customisation annoncée
- la cosmétique pour l'utilisateur
Concernant ce dernier point, je note les pièges de compatibilité entre les commandes ECHO contenant des ! et l'option setlocal enabledelayedexpansion
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| @echo off
chcp 850
:: defini le type de page de caracteres utilisee, ici OEM850 ou CP-850
cls
::efface l affichage
color 4F
:: afiichage en blanc brillant sur rouge
::defini le separateur a mettre entre le nom de repertoire et le nom de fichier
set "Separ="
echo ^^
echo / \
echo / ! \ IMPORTANT
echo /_____\
echo.
echo Pour fonctionner correctement, ce fichier doit être placé et exécuté
echo depuis le répertoire où sont situés les fichiers SEE sources
echo.
echo ^^
echo /^^\
echo // \\
echo // ! \\ ATTENION
echo //_____\\
echo /---------\
echo.
echo Tous les fichiers dans les sous-répertoires seront supprimés,
echo ainsi que les sous-répertoires, y compris ceux sans rapport avec SEEBATCH
echo.
set /p "Traiter=Souhaitez-vous continuer [O/N] : "
color 07
::affichage en blanc sur noir (affichage standard)
if /i "%traiter%" NEQ "O" goto :nontrait
echo ========================================================================
echo === debut de traitement pour renommer les fichiers issus de SEEBATCH ===
echo ========================================================================
echo.
setlocal enabledelayedexpansion
:: permet l'expansion retardee des variable mais interdit l'utilisation des points d'exclamation dans les commandes echo
set dossier=%~dp0
:: renvoi la lettre "~d" et le chemin "~p" du parametre 0 du module en cours d execution (0 est le nom du script) equivalent a dossier=%cd%\
for /f "usebackq delims=" %%a in (`dir /ad /b "%dossier%*"`) do (
::balaye tous les sous repertoires dans le repertoire courant, le nom du sous repertoire est dans %%a
echo ========================================================================
echo === dossier en cours : %dossier%%%~a
echo === dossier en cours : %%~a
echo ------------------------------------------------------------------------
for /f "usebackq delims=" %%b in (`dir /a-d "%dossier%%%~a\*.xl*" /b`) do (
:: balaye tous les fichiers de type different de repertoire, ajout de \*.xl* apres %%~a permet de ne traiter que les excel
set NomFic=%%~nb
:: renvoi "~n" le nom du fichier sans l'extention
set Nomfic=!NomFic:~0,-5!
:: pour supprimer la partie "_0001" à la fin du nom de chaque fichier
echo --- Fichier %%~a\%%~b ---^> %%~a%Separ%!NomFic!%%~xb
:: renvoi "~x" l extention du fichier inclus le point
echo MOVE /Y "%dossier%%%~a\%%~b" "%dossier%%%~a%Separ%!NomFic!%%~xb" >nul
)
:: ajout du /y si on refait la manip plusieurs fois sans avoir supprime les fichiers, pourquoi la redirection de sortie du move vers nul
echo ------------------------------------------------------------------------
echo === suppression dossier "%%~a" en cours
echo RD "%dossier%%%~a" /Q /S
:: ajout du /S si d autres fichiers non traites sont dans le repertoire type thumbnail
echo ========================================================================
echo.
)
endlocal
echo ========================================================================
echo ==== fin de traitement pour renommer les fichiers issus de SEEBATCH ====
echo ========================================================================
echo.
goto :fin
:nontrait
echo.
echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
echo !!! traitement non effectué !!!
echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
echo.
:fin
pause
exit /b |
Encore :merci:
Eric_MGN
vers une évolution future
Bonjour ericlm128
monsieur est bien urbain :)
Je vais regarder cela pour vivre avec mon temps !
Merci
Eric_mgn