.BAT : Problème ave GOTO END > :END

Fermé
micromega Messages postés 131 Date d'inscription lundi 13 avril 2009 Statut Membre Dernière intervention 12 avril 2020 - 11 févr. 2015 à 01:50
dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 - 21 févr. 2015 à 09:57
Bonjour,

J'utilisais ce code sans me soucier de l'architecture du PC, mais aujourd'hui j'ai besoin de l'utiliser en prenant compte de celle-ci.

J'ai donc inséré une partie de code qui permet de faire une opération selon le processeur.

Cependant, je rencontre un problème dès lors que j'ai le :END, la commande call qui suit (Programme2.exe) n'est plus valide (chemin incorrect).

Bien entendu j'ai besoin de placer ce call après le :END.

Y a t'il moyen d'isoler le problème ou de le contourner ?


VOICI LE CODE :



@Echo off
set d=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
for %%a in (%d%) do (
for /F "tokens=1" %%k in ('fsutil fsinfo drivetype %%a: ^| findstr "CD-ROM"') do (
if exist "%%k\DOSSIER\DOSSIER A" (

IF EXIST "%PROCESSOR_ARCHITECTURE%"=="x86" (GOTO [32 Bits]) ELSE (GOTO [64 Bits])
:[32 Bits]
call "%%k\DOSSIER\DOSSIER A\Programme32.exe " >NUL 2>&1
GOTO END
:[64 Bits]
call "%%k\DOSSIER\DOSSIER A\Programme64.exe " >NUL 2>&1
GOTO END
:END

call "%%k\\DOSSIER\DOSSIER A\Programme2.exe" >NUL 2>&1
)
)
)



MERCI POUR VOS AIDES !

3 réponses

dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
12 févr. 2015 à 10:09
0
micromega Messages postés 131 Date d'inscription lundi 13 avril 2009 Statut Membre Dernière intervention 12 avril 2020 1
16 févr. 2015 à 15:01
Bonjour Dubcek,

Après différents tests : il s'agit d'un problème différent.
Après le :END, cela semble bloquer l'exécution du dernier call comme si la variable du début n'était plus respectée.

J'obtiens comme erreur à l'exécution de ce call: Le chemin d'accès spécifié est introuvable.

En revanche les "echo" ou les "pause" qui suivent fonctionnent.

Merci pour le retour.
0
dg_belmontet Messages postés 313 Date d'inscription mercredi 30 mars 2011 Statut Membre Dernière intervention 8 juin 2016 128 > micromega Messages postés 131 Date d'inscription lundi 13 avril 2009 Statut Membre Dernière intervention 12 avril 2020
Modifié par dg_belmontet le 16/02/2015 à 16:45
Bonjour,

En regardant le code du batch mis dans ce post, je pense qu'il y a au moins deux erreurs de syntaxe.

1 - IF EXIST "%PROCESSOR_ARCHITECTURE%"=="x86" (GOTO [32 Bits]) ELSE .....
On ne met pas "If exist ....." sur un test de variable mais de préférence:
If /I %processor_architecture%==x86 (GOTO.....

2- Dans la ligne suivante après l'étiquette :END
call "%%k\\DOSSIER\DOSSIER A\Programme2.exe" >NUL 2>&1
Il y a 2 \ après %%k et cela n'est pas un chemin valide.

Aussi, bien prendre ne compte la remarque de Dubcek au niveau des déclarations de variables dans une boucle (si cela ne fonctionne toujours pas).

Cordialement.
0
micromega Messages postés 131 Date d'inscription lundi 13 avril 2009 Statut Membre Dernière intervention 12 avril 2020 1
16 févr. 2015 à 21:55
Bonjour,

J'ai bien essayé en suivant les indications données mais sans résultat positif.
1) Cela bloque l'exécution du code qui agit en fonction de l'architecture du PC.
2) J'ai corrigé le / en trop, mais cela n'a rien changé au problème (ça aurait été trop simple ;)).

Je continue de chercher....si vous avez encore des pistes à explorer.
Merci en tout cas pour vos aides.
0
dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
17 févr. 2015 à 14:38
essaye de changer l'algorithme pour n'avoir ni call ni goto à l'intérieur des boucles for
0
micromega Messages postés 131 Date d'inscription lundi 13 avril 2009 Statut Membre Dernière intervention 12 avril 2020 1
18 févr. 2015 à 12:37
Le problème est bien les GoTo.

J'ai retourné le problème dans tout les sens et à moins de prendre un chemin de traverse (exécuter l'opération en appelant un autre bat), je ne vois pas de meilleure solution.

Cependant, y a t'il (dans l'exécution) une différence entre ces deux types de codes (action en fonction de l'architecture) :


@ Echo off
IF EXIST "%PROCESSOR_ARCHITECTURE%"=="x86" (GOTO [32 Bits]) ELSE (GOTO [64 Bits])
:[32 Bits]
call "%%k\DOSSIER\DOSSIER A\Programme32.exe " >NUL 2>&1
GOTO END
:[64 Bits]
call "%%k\DOSSIER\DOSSIER A\Programme64.exe " >NUL 2>&1
GOTO END
:END



et


@Echo off
Set RegQry=HKLM\Hardware\Description\System\CentralProcessor\0
REG.exe Query %RegQry% | Find /i "x86"
If %ERRORLEVEL% == 0 (
GOTO X86
) ELSE (
GOTO X64
)

:X86
Copy "Chemin Fichier Source.exe" "Chemin Dossier Destination" >NUL 2>&1
GOTO END
:X64
Copy "Chemin Fichier Source.exe" "Chemin Dossier Destination" >NUL 2>&1
:End



Le premier semble plus simple et moins lourd.
Qu'en pensez-vous ?
0
dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
18 févr. 2015 à 14:40
je trouve les goto inutiles
comme disait db_belmontet, le IF EXIST est faux
et comme ca
@echo  off
set d=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
for %%a in (%d%) do (
for /F "tokens=1" %%k in ('fsutil fsinfo drivetype %%a: ^| findstr "CD-ROM"') do (
if exist "%%k\DOSSIER\DOSSIER A" set L=%%k
)
)
IF "%PROCESSOR_ARCHITECTURE%"=="x86" (
call "%L%\DOSSIER\DOSSIER A\Programme32.exe " >NUL 2>&1
) else (
call "%L%\DOSSIER\DOSSIER A\Programme64.exe " >NUL 2>&1
)
0
micromega Messages postés 131 Date d'inscription lundi 13 avril 2009 Statut Membre Dernière intervention 12 avril 2020 1
19 févr. 2015 à 17:56
Le dernier code ne change pas le problème.
J'ai rectifié le IF EXIST comme l'avait suggéré db_belmontet.

En revanche je viens de faire une découverte lié à ce problème :

Si je fais :
call "%%k\\DOSSIER\DOSSIER A\Programme2.exe"


Cela fonctionne.

Si je fais :
call "%%k\\DOSSIER\DOSSIER A\DOSSIER B\Programme2.exe"


Le fait de mettre "Programme2.exe" dans un autre dossier (contenu dans DOSSIER A) bloque l'exécution de la commande.

Cela peut-il venir de :

@Echo off 
set d=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
for %%a in (%d%) do (
for /F "tokens=1" %%k in ('fsutil fsinfo drivetype %%a: ^| findstr "CD-ROM"') do (
if exist "%%k\DOSSIER\DOSSIER A" (
0
dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
20 févr. 2015 à 15:45
si le chemin %%k\\DOSSIER\DOSSIER A\DOSSIER B\Programme2.exe existe ca doit fonctionner
0
micromega Messages postés 131 Date d'inscription lundi 13 avril 2009 Statut Membre Dernière intervention 12 avril 2020 1
20 févr. 2015 à 23:40
Exact !

En fait je n'avais pas pris en compte un point : un ".bat" qui lance un autre ".bat" s'exécute dans la même fenêtre.
Donc :
LORSQU'UN fichier bat est lancé par un autre, l'enchainement d'exécution peut ne pas fonctionner du fait que le premier bat va exécuter les opérations dans la même fenêtre.
Ainsi il faut redétailler les chemin des commandes du second bat appelé à partir de là où se trouve le premier.

Je ne sais pas si c'est clair, mais pour moi ça l'est un peu plus.

Bon dans tous les cas j'ai pas résolu le problème avec les Goto + End malgré vos interventions.
A défaut donc, j'ai pris le chemin de traverse en exécutant la commande en fonction de l'architecture en externe : un bat en appelant un autre.

Et là tout roule...

Merci !
0
dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
21 févr. 2015 à 09:57
goto dans une boucle for ne fonctionne pas ,il faut passer par un call, et dans le call le goto fonctionne, même si le call est dans la boucle
exemple là https://stackoverflow.com/questions/11177419/batch-file-goto-in-for-loop
0