Batch Index du Forum
S’enregistrerRechercherFAQMembresGroupesConnexion
Répondre au sujet Page 1 sur 1
[R] For imbriqué dans un for
Auteur Message
Répondre en citant
Message [R] For imbriqué dans un for 
Bonjour,

Je suis en train de créer un script dont le but est de convertir des images jpeg en document pdf.

Les images proviennent d'une GED (gestion électronique de documents) et sont classés dans une arborescence avec plusieurs niveaux de sous-dossiers.

Plus d'informations ici : http://www.commentcamarche.net/forum/affich-34183596-script-plusieurs-documents-en-un-seul-pdf-arborescence

Voilà le code que j'ai testé et qui fonctionne :

Code:
@echo off


:: on teste si nconvert.exe est présent

if not exist %windir%\system32\nconvert.exe goto :eof


:: répertoire source contenant les documents numérisés

set rep_source=D:\RECUP_GED\3000057\Administratif


:: on teste si le répertoire source existe bien

cd %rep_source%
if not %errorlevel%==0 goto :eof

if not exist "%rep_source%\Documents_PDF" mkdir "%rep_source%\Documents_PDF"


:: on définit un répertoire temporaire

set dir_temp=D:\TMP_jpg_to_pdf


:: on regroupe toutes les pages de chaque document

for /f "tokens=1,2,3 delims=_." %%a in ('dir /b /a-d-s-l "*.jpg"') do (

if not exist %dir_temp%\%%a mkdir %dir_temp%\%%a

copy %%a_%%b.%%c %dir_temp%\%%a\ > nul

)

echo.


:: on traite les documents un par un

cd %dir_temp%

for /f "tokens=*" %%a In ('dir /b /ad "*.*"') do (

set fichier=%%a

cd %dir_temp%\%%a

set /a compteur=0

Setlocal enableextensions enabledelayedexpansion

For /r %%i In (*.jpg) Do (set /a compteur+=1)

if !compteur! GTR 1 (nconvert -in jpeg -out pdf -multi -o res_!fichier!.pdf *.jpg) else (nconvert -in jpeg -out pdf -o res_!fichier!.pdf *.jpg)

echo.

move /y "res_!fichier!.pdf" "!rep_source!\Documents_PDF" > nul

)

Endlocal

cd %USERPROFILE%

rmdir /s /q "%dir_temp%"

explorer /select,"%rep_source%\Documents_PDF"

:eof


Le code ci-dessus fonctionne bien avec un dossier, mais j'ai des sous-dossiers à parcourir donc j'ai voulu imbriquer tout ça dans une autre boucle for mais j'obtiens le message suivant : "la syntaxe n'est pas correcte"

Je pense à un problème d'expansion de variable retardée, mais j'ai beau avoir essayé de comprendre ce concept, ça reste un mystère pour moi.

Merci d'avance pour votre aide.



Dernière édition par barnabe0057 le Dim 19 Fév 2017 - 19:53; édité 1 fois
Message Publicité 
PublicitéSupprimer les publicités ?


Répondre en citant
Message For imbriqué dans un for 
Pour résumer simplement, pourquoi ce code ne marche pas :

Code:
@echo off

cd %USERPROFILE%\RECUP_GED\203905

for /f "tokens=*" %%e In ('dir /b /ad "*.*"') do (

cd %%e


for /f "tokens=1,2,3 delims=_." %%a in ('dir /b /a-d-s-l "*.jpg"') do (

copy %%a_%%b.%%c %USERPROFILE%\TEMP\%%a\ > nul

)

echo.

)

:eof


Les deux boucles for fonctionnent lorsqu'elles sont séparées, mais ne fonctionnent pas lorsqu'elles sont imbriquées.



Répondre en citant
Message [R] For imbriqué dans un for 
Tiens dis moi si ça fonctionne Okay
En prime, un petit système de détection d'erreurs Laughing

Code:

@echo off
setlocal ENABLEDELAYEDEXPANSION
pushd "%USERPROFILE%\RECUP_GED\203905"
for /f "tokens=*" %%A In ('dir /b /A:D') do (
    for %%B in (%%~A\*.jpg) do copy "%%~dpnxB" "%USERPROFILE%\TEMP\%%~nxB"||(
   echo;An error has occured with the file : %%~B
   )>CON)> nul
echo.
popd
goto :eof


Okay




______________________________________________________
Coucou, tu veux voir mon Site Web ?? Mort de Rire
Visiter le site web du posteur Skype
Répondre en citant
Message [R] For imbriqué dans un for 
D'abord merci pour ton aide.

En exécutant ton code, je constate qu'il parcourt un dossier et copie les fichiers jpg tels quels dans le dossier TEMP, c'est intéressant mais ce n'est pas exactement le fonctionnement attendu.

En fait je cherche à regrouper les jpg qui font parti d'un même document (recto-verso par exemple) dans un dossier dont le nom est la racine du nom des fichiers jpg (par exemple les fichiers s'appellent 00308_001.jpg, 00308_002.jpg, le nom du dossier devra être 00308)



Répondre en citant
Message [R] For imbriqué dans un for 
D'accord, pas de soucis Okay :

Code:

@echo off
setlocal ENABLEDELAYEDEXPANSION
pushd "%USERPROFILE%\RECUP_GED\203905"
for /f "tokens=*" %%A In ('dir /b /A:D') do (
    for %%B in (%%~A\*.jpg) do for "tokens=1,* delims=_" %%C in ("%%~B") do (
      copy "%%~dpnxB" "%USERPROFILE%\TEMP\%%~C\%%~nxB"||(
   echo;An error has occured with the file : %%~B
   )>CON)> nul
echo.
popd
goto :eof


C'est bon ? Okay




______________________________________________________
Coucou, tu veux voir mon Site Web ?? Mort de Rire
Visiter le site web du posteur Skype
Répondre en citant
Message [R] For imbriqué dans un for 
Il m'indique une erreur ("tokens=1,* delims=_" était inattendu) et se ferme.

J'ai l'impression qu'il y a une parenthèse qui n'est pas fermée, mais je ne trouve pas laquelle.



Répondre en citant
Message [R] For imbriqué dans un for 
À ce que je vois, il manque une parenthèse là
)>CON)> nul
Remplace donc ça par

Code:
   )>CON))> nul

(j'ai pas testé, j'ai juste vu un manque de parenthèses)




______________________________________________________
Cordialement,
Hugo, qui adore programmer, jouer à Minecraft, ZT2 et FSX.
Boutons-liens :
Visiter le site web du posteur Skype
Répondre en citant
Message [R] For imbriqué dans un for 
Toujours le même message.



Répondre en citant
Message [R] For imbriqué dans un for 
Voilà la correction :

Code:

 
@echo off
setlocal ENABLEDELAYEDEXPANSION
pushd "%USERPROFILE%\RECUP_GED\203905"
for /f "tokens=*" %%A In ('dir /b /A:D') do (
    for %%B in (%%~A\*.jpg) do for /f "tokens=1,* delims=_" %%C in ("%%~B") do (
      copy "%%~dpnxB" "%USERPROFILE%\TEMP\%%~C\%%~nxB"||(
   echo;An error has occured with the file : %%~B
   )>CON))> nul
echo.
popd
goto :eof


Okay




______________________________________________________
Coucou, tu veux voir mon Site Web ?? Mort de Rire
Visiter le site web du posteur Skype
Répondre en citant
Message [R] For imbriqué dans un for 
Décidément ça me donne encore des erreurs, ça me marque "le chemin d'accès spécifié est introuvable" pour chaque fichier jpeg.

Pourtant quand je regarde ton code les chemins sont corrects.



Répondre en citant
Message [R] For imbriqué dans un for 
Tu m'as inspiré, j'ai finalement réussi à m'en sortir tout seul.

Un grand merci pour ton aide.

Voilà le code pour ceux que ça pourrait intéresser :

Code:
@echo off

if not exist %windir%\system32\nconvert.exe goto :eof

cd %USERPROFILE%\RECUP_GED

if not %errorlevel%==0 goto :eof

for /f "tokens=*" %%K In ('dir /b /ad "*.*"') do (

for /f "tokens=*" %%E In ('dir /b /ad "%%~dpnK\*.*"') do (

if not exist "%%~dpnK\%%E\Documents_PDF" mkdir "%%~dpnK\%%E\Documents_PDF"

if not exist "%%~dpnK\%%E\TMP_jpg_to_pdf" mkdir "%%~dpnK\%%E\TMP_jpg_to_pdf"

for /f "tokens=1,2,3 delims=_." %%A in ('dir /b /a-d-s-l "%%~dpnK\%%E\*.jpg"') do (

if not exist "%%~dpnK\%%E\TMP_jpg_to_pdf\%%A" mkdir "%%~dpnK\%%E\TMP_jpg_to_pdf\%%A"

copy %%~dpnK\%%E\%%A_%%B.%%C %%~dpnK\%%E\TMP_jpg_to_pdf\%%A > nul

)

for /f "tokens=*" %%R In ('dir /b /ad "%%~dpnK\%%E\TMP_jpg_to_pdf\*.*"') do (

set fichier=%%R

set /a compteur=0

Setlocal enableextensions enabledelayedexpansion

For /r %%I In (*.jpg) Do (set /a compteur+=1)

if !compteur! GTR 1 (nconvert -in jpeg -out pdf -multi -c 5 -o res_!fichier!.pdf %%~dpnK\%%E\TMP_jpg_to_pdf\%%R\*.jpg) else (nconvert -in jpeg -out pdf -c 5 -o res_!fichier!.pdf %%~dpnK\%%E\TMP_jpg_to_pdf\%%R\*.jpg)

echo.

move /y "res_!fichier!.pdf" "%%~dpnK\%%E\Documents_PDF" > nul

Endlocal

)

rmdir /s /q "%%~dpnK\%%E\TMP_jpg_to_pdf"

)

)

explorer /select,"%CD%"

:eof


Je rappelle le but du code c'est-à-dire trier et convertir des images jpeg en document pdf, au préalable il faut télécharger l'outil Nconvert disponible ici :

http://www.xnview.com/fr/nconvert/

Il faut récupérer le fichier nconvert.exe et le copier dans C:\Windows\System32

Bonne nuit, à bientôt peut-être.



Répondre en citant
Message [R] For imbriqué dans un for 
[désolé pour le déterrage]
Si le code fonctionne ,alors mets ton sujet en [R] Wink
cela permettra de faire un gros gagne-temps pour les personnes voulant aider Smile




______________________________________________________


cliquer sur un des liens n'est pas dangereux
Ancien site,Nouveau site
Mon site de scan
Vous êtes le
visiteur
Chaine Youtube:
Visiter le site web du posteur Skype
Message [R] For imbriqué dans un for 


Montrer les messages depuis:
Répondre au sujet Page 1 sur 1
  



Index | créer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Copyright 2008 - 2016 // Batch