Problème programmation .BAT

Une difficulté, une précision posez vos questions

Modérateur : WIN32-[GG]

Avatar du membre
-- batchman --
Batcheur débutant
Messages : 22
Enregistré le : 29 oct. 2014 11:37

Re: Problème programmation .BAT

Message 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 :shock: ) : par exemple, tester si dans "nimportequelnom1-1526.ext" on repère qu'il y a "nimportequelnom1". :idea:

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. :mrgreen:
Je continue dès que possible, promis ! ;)
-- batchman --
linkin774
Batcheur débutant
Messages : 10
Enregistré le : 19 déc. 2014 12:12

Re: Problème programmation .BAT

Message 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 ...
Avatar du membre
-- batchman --
Batcheur débutant
Messages : 22
Enregistré le : 29 oct. 2014 11:37

Re: Problème programmation .BAT

Message 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 ! ;)
-- batchman --
linkin774
Batcheur débutant
Messages : 10
Enregistré le : 19 déc. 2014 12:12

Re: Problème programmation .BAT

Message 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 !
Avatar du membre
-- batchman --
Batcheur débutant
Messages : 22
Enregistré le : 29 oct. 2014 11:37

Re: Problème programmation .BAT

Message par -- batchman -- »

Salut !
Voilà mon code final, il répond à toutes tes attentes je crois ! :D

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.
-- batchman --
linkin774
Batcheur débutant
Messages : 10
Enregistré le : 19 déc. 2014 12:12

Re: Problème programmation .BAT

Message par linkin774 »

Super merci, c'est exactement ce que je recherchais !
Avatar du membre
-- batchman --
Batcheur débutant
Messages : 22
Enregistré le : 29 oct. 2014 11:37

Re: Problème programmation .BAT

Message par -- batchman -- »

Génial ! Content d'avoir réussi ensemble :D
@ + sur le forum !
-- batchman --
Avatar du membre
-- batchman --
Batcheur débutant
Messages : 22
Enregistré le : 29 oct. 2014 11:37

Re: Problème programmation .BAT

Message par -- batchman -- »

Hey ! :D

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 ! :D
-- batchman --
Répondre