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

micromega Messages postés 131 Date d'inscription   Statut Membre Dernière intervention   -  
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   -
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 !
A voir également:

3 réponses

dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
0
micromega Messages postés 131 Date d'inscription   Statut Membre Dernière intervention   1
 
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 320 Date d'inscription   Statut Membre Dernière intervention   128 > micromega Messages postés 131 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   1
 
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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   Statut Membre Dernière intervention   1
 
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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   Statut Membre Dernière intervention   1
 
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
si le chemin %%k\\DOSSIER\DOSSIER A\DOSSIER B\Programme2.exe existe ca doit fonctionner
0
micromega Messages postés 131 Date d'inscription   Statut Membre Dernière intervention   1
 
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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