Page 2 sur 2
Re: Problème programmation .BAT
Posté : 24 déc. 2014 04:22
par -- batchman --
En fait ma dernière réponse n'est valable que si tu as une suite genre "fichier1*", "fichier2*",etc.
Et apparemment tes fichiers ont tous des noms différents mais certains ont les mêmes...
Il faudrait donc établir une liste de fichiers de même nom ( et c'est là qu'il faudrait savoir où est la limite de la comparaison des chaines
) : par exemple, tester si dans "nimportequelnom1-1526.ext" on repère qu'il y a "nimportequelnom1".
Code : Tout sélectionner
@echo off
setlocal enabledelayedexpansion
for %%a in (*) do (
if defined tous (
set tous=!tous!;%%a
) else (
set tous=%%a
)
)
:reconnaissance
set nom=
set /a token=token+1
for /f "tokens=%token% delims=;" %%b in ("%tous%") do (set fichier0=%%b)
set fichier=%fichier0%
:extraction
set extrait=%fichier:~0,1%
set fichier=%fichier:~1%
set nom=%nom%%extrait%
set x=-1
:x
set /a x=x+1
if %extrait%==%x% call :verif
if %x% neq 9 goto x
if not %nom%==%fichier0% goto extraction
goto reconnaissance
:verif
if not defined reference goto sver
set /a token2=token2+1
for /f "tokens=%token2% delims=;" %%c in ("%reference%") do (set ref=%%c)
if %ref%==%nom% move "%fichier0%" "Dos%nom%"
goto :eof
:sver
if not exist Dos%nom% md Dos%nom%
if defined reference (set reference=%reference%;%nom%) else (set reference=%nom%)
goto :eof
Comme vous le constatez, je l'affinerai un peu, d'autant plus qu'il ne fonctionne pas encore comme je le souhaite, manque de temps.
Je continue dès que possible, promis !
Re: Problème programmation .BAT
Posté : 24 déc. 2014 10:53
par linkin774
Hum malheureusement la reconnaissance ne fonctionne pas très bien ...
Sinon je pensai à une possibilité mais je ne sais pas si ça serai plus simple ..
En gros j'ai des fichiers qui terminent soit par n'importe quoi soit par "-A" (et forcement "-A" ya pas plus de lettre ou de possibilité, c'est soit "nimportequoi-A" soit "nimportequoi")
Est ce que l'on peut faire un truc pour qu'il prenne tout les fichier en "-A", qu'il les range dans un dossier portant son nom MAIS sans l'extension "-A"
Et ensuite dans un deuxième temps, reprendre le code de LNOW pour ranger les autres fichiers dans des dossier portant également leur propre nom.
De ce fait ensuite les dossier portant les mêmes noms seraient fusionnés ...
Re: Problème programmation .BAT
Posté : 25 déc. 2014 07:08
par -- batchman --
Voilà mon code, maintenant il fonctionne : il y a juste quelques soucis avec une boucle for, qui ne peut contenir un nombre limité de "tokens", dont j'ai trouvé une solution en relançant le batch jusqu'à ce que toute l'opération soit terminée.
Code : Tout sélectionner
@echo off
setlocal enabledelayedexpansion
:restart
for %%a in (*) do (
if defined tous (
set tous=!tous!;%%a
) else (
set tous=%%a
)
)
:reconnaissance
if "%token%"=="40" goto restart
set nom=
set /a token=token+1
for /f "tokens=%token% delims=;" %%b in ("%tous%") do (set fichier0=%%b)
set fichier=%fichier0%
:extraction
set extrait=%fichier:~0,1%
set fichier=%fichier:~1%
set nom=%nom%%extrait%
set x=-1
:x
set /a x=x+1
if "%extrait%"=="%x%" (
if not "%debut%"=="ok" (set debut=ok)
set presence=1
)
if %x% neq 9 goto x
if "%nom%"=="%fichier0%" if "%debut%"=="ok" (call :verif)
if "%debut%"=="ok" if "%presence%"=="0" (
set nom=%nom:~,-1%
call :verif
)
if "%presence%"=="1" set presence=0
if not "%nom%"=="%fichier0%" goto extraction
set debut=non
goto reconnaissance
:verif
if not defined reference goto sver
set /a token2=%token2%+1
if %token2% neq 1 set /a token3=%token2%-1
if %token2% neq 1 (set ftoken=%token3%,%token2%) else (set ftoken=%token2%)
for /f "tokens=%ftoken% delims=;" %%c in ("%reference%") do (
set preref=%%c
set ref=%%d
)
if "%ref%"=="" goto sver
if %token2%==1 set ref=%preref%
if "%ref%"=="%nom%" (
move "%fichier0%" "Dos%nom%"
echo %fichier0% est maintenant dans Dos%nom%.
set token2=
set nom=%fichier0%
goto :eof
) else (goto verif)
:sver
if not exist Dos%nom% md Dos%nom%
if defined reference (set reference=%reference%;%nom%) else (set reference=%nom%)
echo Dossier Dos%nom% cree et nouvelle reference %nom% acquise.
move "%fichier0%" "Dos%nom%"
echo %fichier0% est maintenant dans Dos%nom%.
set token2=
set nom=%fichier0%
goto :eof
Voilà il ne reste plus qu'à renommer les dossiers et c'est bon !
Re: Problème programmation .BAT
Posté : 29 déc. 2014 11:59
par linkin774
Bonjour,
Le programme fonctionne très bien, cependant .. est-il possible qu'à la fin les dossiers crées soient renommés automatiquement de manière à supprimer le "Dos" qui s'applique devant tous les dossiers ?
Dernier petit point pour que ce soit parfait, j'aimerai que le script ne soit pas déplacé dans un dossier si possible ..
En tout cas merci pour votre aide !
Re: Problème programmation .BAT
Posté : 31 déc. 2014 14:04
par -- batchman --
Salut !
Voilà mon code final, il répond à toutes tes attentes je crois !
Code : Tout sélectionner
@echo off
title Etat actuel : copie des fichiers
setlocal enabledelayedexpansion
:restart
set token=
set token2=
set tous=
for %%a in (*) do (
if defined tous (
set tous=!tous!;%%a
) else (
set tous=%%a
)
)
if "%tous%"=="%ignorer%" goto rename
set ignorer=
:reconnaissance
set debut=non
set fichier0=reboot
set nom=
set /a token=token+1
for /f "tokens=%token% delims=;" %%b in ("%tous%") do (set fichier0=%%b)
if "%fichier0%"=="reboot" goto restart
if "%fichier0%"=="batcher.fr.bat" (set nom=batcher.fr.bat) & goto :ignorer
set fichier=%fichier0%
:extraction
set extrait=%fichier:~0,1%
set fichier=%fichier:~1%
set nom=%nom%%extrait%
set x=-1
:x
set /a x=x+1
if "%extrait%"=="%x%" (
if not "%debut%"=="ok" (set debut=ok)
set presence=1
)
if %x% neq 9 goto x
if "%nom%"=="%fichier0%" if "%debut%"=="ok" (call :verif)
if "%debut%"=="ok" if "%presence%"=="0" (
set nom=%nom:~,-1%
call :verif
)
if "%presence%"=="1" set presence=0
if not "%nom%"=="%fichier0%" goto extraction
:ignorer
if defined ignorer (set ignorer=%ignorer%;%nom%) else (set ignorer=%nom%)
goto reconnaissance
:verif
if not defined reference goto sver
set /a token2=%token2%+1
if %token2% neq 1 set /a token3=%token2%-1
if %token2% neq 1 (set ftoken=%token3%,%token2%) else (set ftoken=%token2%)
for /f "tokens=%ftoken% delims=;" %%c in ("%reference%") do (
set preref=%%c
set ref=%%d
)
if "%ref%"=="" goto sver
if %token2%==1 set ref=%preref%
if "%ref%"=="%nom%" (
move "%fichier0%" "Dos%nom%"
echo %fichier0% est maintenant dans Dos%nom%.
set token2=
rem set nom=%fichier0%
goto :reconnaissance
) else (goto verif)
:sver
if not exist Dos%nom% md Dos%nom%
if defined reference (set reference=%reference%;%nom%) else (set reference=%nom%)
echo Dossier Dos%nom% cree et nouvelle reference %nom% acquise.
move "%fichier0%" "Dos%nom%"
echo %fichier0% est maintenant dans Dos%nom%.
set token2=
rem set nom=%fichier0%
goto :reconnaissance
:rename
title Etat actuel : renommer les dossiers
for /f "tokens=1 delims=" %%a in ('dir Dos* /a:d /b') do (
set dossier=%%a
set dossier2=!dossier:~3!
ren "!dossier!" "!dossier2!"
)
echo.
echo.
echo.
echo FIN
echo.
echo.
pause
exit
J'espère que ça te conviens
PS : met le nom de ton programme ici :
if "%fichier0%"=="
nomdubatch.bat" (set nom=
nomdubatch.bat) & goto :ignorer
Moi il s'appelle "batcher.fr"(.bat), dans le code en haut.
Re: Problème programmation .BAT
Posté : 19 janv. 2015 17:05
par linkin774
Super merci, c'est exactement ce que je recherchais !
Re: Problème programmation .BAT
Posté : 24 janv. 2015 01:05
par -- batchman --
Génial ! Content d'avoir réussi ensemble
@ + sur le forum !
Re: Problème programmation .BAT
Posté : 06 mai 2015 21:19
par -- batchman --
Hey !
J'en profite pour faire une petite correction au niveau du code ; si certains l'on expérimenté, il ne pouvait exister que 46 références maximales car la boucle for ne peut chercher au delà, et si vous vous souvenez j'avais fait une tentative pour rebooter le programme à partir de 46, et ainsi garantir un cycle pour une infinité de références, et tout cela en lançant une seule fois le programme
Code : Tout sélectionner
@echo off
title Etat actuel : copie des fichiers
setlocal enabledelayedexpansion
:restart
set token=
set token2=
set tous=
for %%a in (*) do (
if defined tous (
set tous=!tous!;%%a
) else (
set tous=%%a
)
)
if "%tous%"=="%ignorer%" goto rename
set ignorer=
:reconnaissance
set debut=non
set fichier0=reboot
set nom=
set /a token=token+1
for /f "tokens=%token% delims=;" %%b in ("%tous%") do (set fichier0=%%b)
if "%fichier0%"=="reboot" goto restart
set fichier=%fichier0%
:extraction
set extrait=%fichier:~0,1%
set fichier=%fichier:~1%
set nom=%nom%%extrait%
set x=-1
:x
set /a x=x+1
if "%extrait%"=="%x%" (
if not "%debut%"=="ok" (set debut=ok)
set presence=1
)
if %x% neq 9 goto x
if "%nom%"=="%fichier0%" if "%debut%"=="ok" (call :verif)
if "%debut%"=="ok" if "%presence%"=="0" (
set nom=%nom:~,-1%
call :verif
)
if "%presence%"=="1" set presence=0
if not "%nom%"=="%fichier0%" goto extraction
:ignorer
if defined ignorer (set ignorer=%ignorer%;%nom%) else (set ignorer=%nom%)
goto reconnaissance
:verif
if not defined reference goto sver
set /a token2=%token2%+1
if %token2% neq 1 set /a token3=%token2%-1
if %token2% neq 1 (set ftoken=%token3%,%token2%) else (set ftoken=%token2%)
for /f "tokens=%ftoken% delims=;" %%c in ("%reference%") do (
set preref=%%c
set ref=%%d
)
if "%ref%"=="" goto sver
if "%ref%"=="%%d" goto sver
if %token2%==1 set ref=%preref%
if "%ref%"=="%nom%" (
move "%fichier0%" "Dos%nom%"
echo %fichier0% est maintenant dans Dos%nom%.
set token2=
goto :reconnaissance
) else (goto verif)
:sver
if not exist Dos%nom% md Dos%nom%
if defined reference (set reference=%reference%;%nom%) else (set reference=%nom%)
echo Dossier Dos%nom% cree et nouvelle reference %nom% acquise.
move "%fichier0%" "Dos%nom%"
echo %fichier0% est maintenant dans Dos%nom%.
set token2=
goto :reconnaissance
:rename
title Etat actuel : renommer les dossiers
for /f "tokens=1 delims=" %%a in ('dir Dos* /a:d /b') do (
set dossier=%%a
set dossier2=!dossier:~3!
ren "!dossier!" "!dossier2!"
)
echo.
echo.
echo.
echo FIN
echo.
echo.
pause
exit
Et voilà, c'est cool et ça fonctionne !