.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 -
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 !
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:
- Bat goto
- Fichier bat - Guide
- Bat to exe converter - Télécharger - Édition & Programmation
- .Txt to .bat ✓ - Forum Logiciels
- Txt to bat ✓ - Forum Autoit / batch
- Bouchou ka bat traduction ✓ - Forum traduction
3 réponses
n'est-ce pas le même problème que là https://forums.commentcamarche.net/forum/affich-30876685-bat-commande-de-lancement-speciale-32bits-64bits#5
essaye de changer l'algorithme pour n'avoir ni call ni goto à l'intérieur des boucles for
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) :
et
Le premier semble plus simple et moins lourd.
Qu'en pensez-vous ?
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 ?
je trouve les goto inutiles
comme disait db_belmontet, le IF EXIST est faux
et comme ca
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
)
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 :
Cela fonctionne.
Si je fais :
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 :
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" (
si le chemin %%k\\DOSSIER\DOSSIER A\DOSSIER B\Programme2.exe existe ca doit fonctionner
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 !
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 !
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
exemple là https://stackoverflow.com/questions/11177419/batch-file-goto-in-for-loop
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.
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.
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.