.Bat : Commande de lancement spéciale (32bits + 64bits)

Résolu
Bonjour à tous,

J'aurais besoin qu'une commande .bat me lance un programme sur un disque amovible en fonction du processeur du PC.

J'ai les deux commandes qui fonctionnent une à une (lancer depuis un disque amovible + lancer un fichier en fonction du processeur).

MAIS, lorsque je regroupe les deux cela ne fonctionne plus.

Par déduction simple, le placement que j'ai fait n'est pas bon.

Comment puis-je donc intégrer la commande de lancement de fichier en fonction du type de processeur ?

Voici ce que j'avais essayé :

@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\CHEMIN FICHIER A LANCER" (

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

:X86
call "%%k\CHEMIN FICHIER A LANCER" >NUL 2>&1
GOTO END
:X64
call "%%k\CHEMIN FICHIER A LANCER" >NUL 2>&1
:End

)
)
)

Merci

17 réponses

  1. Rien. Ca s'ouvre, se ferme. Rien de plus.

    Je redécompose :

    @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\CHEMIN FICHIER A LANCER" (

    call "%%k\CHEMIN FICHIER A LANCER" >NUL 2>&1

    )
    )
    )


    = ça fonctionne

    Si je fais :

    @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
    call "%%k\CHEMIN FICHIER A LANCER" >NUL 2>&1

    GOTO END

    :X64
    call "%%k\CHEMIN FICHIER A LANCER" >NUL 2>&1

    :End


    = ça fonctionne.

    C'est le fait de placer le seconde commande dans la première qui pose problème.
    Soit elle est mal placé (mais j'ai fait des tests de toutes sortes), soit il manque une partie de code (que je ne connais pas)...
    1
    1. Personne n'a d'idée sur ce problème ?

      Merci
      0
      1. J'ai fait un autre test mais pas de résultats... je stagne...
        0
        1. Contributeur
          hello
          essayer avec ! à la place de % dans une boucle FOR
          @Echo off
          setlocal enabledelayedexpansion
          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\CHEMIN FICHIER A LANCER" (

          Set RegQry=HKLM\Hardware\Description\System\CentralProcessor\0
          REG.exe Query !RegQry! | Find /i "x86"
          If !ERRORLEVEL! == 0 (
          GOTO X86
          ) ELSE (
          GOTO X64
          )
          ......
          0
          1. Bonjour Dubcek,

            Merci d'avoir répondu.

            J'ai essayé en remplaçant les " % " par des " ! ", mais toujours pas résultat.

            La commande s'ouvre et se ferme aussitôt en cliquant dessus.
            Si je l'ouvre avec l'Invite de commande, ça me dit que "La syntaxe de la commande est incorrecte".

            Le souci viens de la commande de recherche du type de processeur. A elle seule, cela fonctionne, mais incorporée à l'autre commande cela bloque.

            Merci
            0
            1. Contributeur
              enlever le :End
              j'ignore pourquoi

              edit: ou ajouter une commande après:
              :end
              echo bidon>NUL
              0
              1. Bon... alors :

                Si je remets des "%" à la place des "!", j'obtiens un résultat différent en ayant enlevé le ":end" :

                Avec l'invite de commande, j'obtiens ce message :

                Erreur : nombre insuffisant de paramètres de ligne de commande
                Le système ne peut pas trouver le nom de fichier de commandes - END

                Si je lance en cliquant dessus, ça s'ouvre...puis un peu après ça se referme tout seul

                Je ne peux pas ajouter de commande après ":end" car les "call" selon le processeur doivent s'effectuer avant.

                Par contre si je supprime "GOTO END" + ":end" j'obtiens :

                Erreur : nombre insuffisant de paramètres de ligne de commande

                ça change...
                0
                1. Contributeur
                  nombre insuffisant de paramètres de ligne de commande
                  cette erreur est générée par le call, je ne connais pas le script

                  ajouter une commande "bidon" après le :end ne change rien au code
                  0
                  1. Bonjour,

                    Si j'ajoute un une commande après le ":end", j'obtiens le même résultat :

                    fenêtre qui s'ouvre et se ferme automatiquement...
                    0
                    1. Contributeur
                      mettre une commande pause pour voir ce qu'il fait
                      0
                      1. Contributeur
                        C'est le fait de placer le seconde commande dans la première qui pose problème.
                        je suis pas sûr de comprendre
                        faire ca ?
                        If %ERRORLEVEL% == 0 ( 
                        call "%%k\CHEMIN FICHIER A LANCER" >NUL 2>&1
                        ) ELSE (
                        call "%%k\CHEMIN FICHIER A LANCER" >NUL 2>&1
                        )
                        0
                        1. Bonjour Dubcek,

                          Il y a eu une évolution.

                          Maintenant le commande se lance correctement (elle ne se ferme pas toute seule), mais j'obtiens le message d'erreur suivant :

                          ERREUR : syntaxe incorrecte.
                          Entrez "REG QUERY /?" pour afficher la syntaxe.

                          Pour "C'est le fait de placer le seconde commande dans la première qui pose problème", je voulais dire de placer le code qui lance un fichier selon le processeur dans l'autre code (voir précédent poste, j'ai séparé les 2 codes car l'un ou l'autre fonctionne tout seul, mais pas ensemble).

                          Merci
                          0
                          1. Contributeur
                            dans REG.exe Query %RegQry%

                            %RegQry% est vide ? ou contient un espace ?
                            0
                            1. Contributeur
                              c'est ça que tu veux faire ?
                              setlocal enabledelayedexpansion
                              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\CHEMIN FICHIER A LANCER" (
                              Set RegQry=HKLM\Hardware\Description\System\CentralProcessor\0
                              REG.exe Query !RegQry! | Find /i "x86"
                              If !ERRORLEVEL! == 0 (
                              call "%%k\CHEMIN FICHIER A LANCER" >NUL 2>&1
                              ) ELSE (
                              call "%%k\CHEMIN FICHIER A LANCER" >NUL 2>&1
                              )
                              goto fin
                              )
                              )
                              )
                              :fin
                              pause
                              0
                              1. Bonjour Dubcek,

                                Bon bah encore une fois merci : ça semble fonctionner ainsi.

                                Juste deux questions liées à mes erreurs :

                                1) Quel est la différence entre "!RegQry!" et "%RegQry%", puis entre "!ERRORLEVEL!" et "%ERRORLEVEL%" ?

                                2) Dans le script que tu m'as donné tu place un ")ELSE(" entre le ":X86" et le ":X64" --> selon le processeur il va sur la bonne ligne à exécuter ou alors il teste les deux lignes succéssivement?

                                Merci à toi
                                0
                                1. Contributeur
                                  setlocal enabledelayedexpansion et !variable! est nécessaire pour les variables modifiées à l'intérieur d'une boucle for
                                  If !ERRORLEVEL! == 0 (
                                  call "%%k\CHEMIN FICHIER A LANCER" >NUL 2>&1
                                  ) ELSE (
                                  call "%%k\CHEMIN FICHIER A LANCER" >NUL 2>&1
                                  )

                                  si find trouve x86 errorlevel==0, donc il exécute le 1er sinon le 2ème
                                  0
                                  1. OK C'est parfait.

                                    Merci à toi encore une fois !
                                    0