Batch résultat d'une commande -> variable

Bonjour à tous,
J'ai un programme qui renvoie une valeur lorsque qu'il est terminé. J'aimerais bien l'utiliser par la suite mais je n'y arrive pas :

@echo off
set /a drive="D:\Monprogramme.exe"
"D:\Monprogramme2.exe" %drive%
exit

sa ne fonctionne pas. Que faire?
Configuration: Windows 7
Firefox 3.5.6

16 réponses

Résumé de la discussion

Pour récupérer la valeur renvoyée par le premier programme dans un script batch Windows et la transmettre au second, l'approche consiste à capturer la sortie plutôt que d'utiliser set /a sur une chaîne. La solution proposée consiste à utiliser for /f pour lire %%a dans la sortie du premier programme et à activer le DelayedExpansion afin de passer la valeur à D:\Monprogramme2.exe. Exemple pratique : for /f %%a in ('D:\Monprogramme.exe') do ( set drive=%%a & D:\Monprogramme2.exe !drive! ) avec setlocal enableDelayedExpansion. Cette approche gère correctement les espaces dans les chemins et évite les erreurs liées à l'interprétation des sorties, et peut être étendue pour prendre en compte d'autres commandes enchaînées.

Bobot (l’IA à votre service)
  1. Contributeur
    hello
    @echo off
    for /f %%a in ('D:\Monprogramme.exe') do "D:\Monprogramme2.exe" %%a
    1. Merci mais comment je peux utiliser le résultat encore après? Je m'explique :

      J'essaye de créer un nouveau lecteur virtuel et monter un fichier dessus et après de le démonter et supprimer le lecteur virtuel :

      @echo off
      "D:\Program Files (x86)\DAEMON Tools Lite\DTLite.exe" -add
      "D:\Program Files (x86)\DAEMON Tools Lite\DTLite.exe" -mount 0,"D:\OS\Ubuntu9.10.iso"
      pause
      "D:\Program Files (x86)\DAEMON Tools Lite\DTLite.exe" -unmount 0
      "D:\Program Files (x86)\DAEMON Tools Lite\DTLite.exe" -remove

      Mais j'aimerais bien le passer en moins "dur". Je sais que la commande

      "D:\Program Files (x86)\DAEMON Tools Lite\DTLite.exe" -add

      renvoie le numéro du lecteur crée (ici 0 en "dur") et j'aimerais bien pouvoir utiliser cette possibilité pour pouvoir lancer l'image sur un autre lecteur que le lecteur 0. Donc mémoriser la valeur de retour de

      "D:\Program Files (x86)\DAEMON Tools Lite\DTLite.exe" -add

      dans une variable nommé "drive" pour la réutiliser dans les lignes suivantes :

      "D:\Program Files (x86)\DAEMON Tools Lite\DTLite.exe" -mount %drive%,"D:\OS\Ubuntu9.10.iso"
      "D:\Program Files (x86)\DAEMON Tools Lite\DTLite.exe" -unmount %drive%

      Est-ce que ta solution enregistre le retour dans une variable?
  2. Contributeur
    la variable !drive! est correcte ?
    tu mets
    echo on
    avant
    echo Ajout du disque virtuel !drive!
    pour qu'il affiche ce qu'il fait
    1. C'est même pas sa le problème, c'est que je voit même pas le
      echo Ajout du disque virtuel !drive!
      il passe à la pause après avoir monté le lecteur, comme si il faisait rien (ou juste la première commande) de ce qu'il y a dans les parenthèses...

      @echo off
      setlocal enableDelayedExpansion

      set daemon=D:\Program Files (x86)\DAEMON Tools Lite\DTLite.exe
      echo daemon : %daemon%

      set ubuntu=D:\OS\Ubuntu9.10.iso
      echo ubuntu : %ubuntu%

      for /f %%a in ('"%daemon%" -add') do (

      set /a drive="%%a"
      "%daemon%" -mount !drive!,"%ubuntu%"

      echo Ajout du disque virtuel !drive!..............................................[DONE]
      echo Montage de l'image CD dans le disque !drive!.................................[DONE]
      pause
      "%daemon%" -unmount !drive!
      echo Demontage de l'image CD................................................[DONE]
      "%daemon%" -remove
      echo Suppression du disque virtuel !drive!.......................................[DONE]
      )

      pause
      exit
  3. Contributeur
    la variable %%a contient le résultat de la commande.
    ou tu peux faire

    @echo off
    setlocal enableDelayedExpansion
    for /f %%a in ('D:\Monprogramme.exe') do (
    set drive=%%a
    "D:\Monprogramme2.exe" !drive!
    )
    1. J'arrive à rien, mon programme ressemble à sa maintenant :

      @echo off
      setlocal enableDelayedExpansion

      set daemon=D:\Program Files (x86)\DAEMON Tools Lite\DTLite.exe
      echo daemon : %daemon%

      set ubuntu=D:\OS\Ubuntu9.10.iso
      echo ubuntu : %ubuntu%

      for /f %%a in ('"%daemon%" -add') do ('set /a drive="%%a"')
      echo Ajout du disque virtuel !drive!
      "%daemon%" -mount !drive!,"%ubuntu%"
      echo Montage de l'image CD dans le disque !drive!
      pause
      "%daemon%" -unmount !drive!
      echo Demontage de l'image CD
      "%daemon%" -remove
      echo Suppression du disque virtuel !drive!

      pause
      exit

      sa ne fonctionne pas, que je mettre "!drive!", "%drive%" ou %%a
  4. Contributeur
    il faut que les commandes soient à l'intérieur des () et pas de ' avec le set

    for /f %%a in ('"%daemon%" -add') do (set /a drive="%%a"
    echo Ajout du disque virtuel !drive!
    ...
    echo Suppression du disque virtuel !drive!
    )

    pause
    exit
    1. J'ai l'impression qu'il sort des parenthèses après avoir créer le nouveau lecteur virtuel... Ya pas l'image d'Ubuntu de monté, juste les 2 echo du début puis le pause...
  5. Contributeur
    c'est peut-être à cause des () dans set daemon=D:\Program Files (x86)\DAEMON Tools Lite\DTLite.exe
    renomme le dossier sans ()
    1. Normalement avec les parenthèses sa devrait ne pas poser de problèmes vu que c'est entre gillemets "%daemon%". C'est surtout que mes OS sont en 64 bits, donc sa installe dans "Program Files (x86)" ...
  6. Contributeur
    enlève le echo off et regarde chaque commande qui s'affiche à l'exécution
    1. Contributeur
      vérifier que la boucle retourne quelque chose

      for /f %%a in ('"%daemon%" -add') do (
      echo +++++%%a++++++
      1. Voila le résultat :

        http://bnwarriors.free.fr/images/cmd.jpg
    2. Contributeur
      "%daemon%" -add' ne s'exécute pas ou ne produit aucun résultat, ou plusieurs ? auquel cas ce n'est pas %%a qu'il faut afficher. Affiche l'exécution de

      set daemon=D:\Program Files (x86)\DAEMON Tools Lite\DTLite.exe
      "%daemon%" -add
      1. Non le lecteur virtuel est bien crée à chaque fois...
    3. Contributeur
      le for s'en fiche, qu'affiche la commande ?
      1. laquelle?

        Un doute me prends, est-ce la même commande avec windows 7?
    4. Contributeur
      celle là
      set daemon=D:\Program Files (x86)\DAEMON Tools Lite\DTLite.exe
      "%daemon%" -add
      si elle affiche plusieurs mots comme réponse, %%a du for ne va prendre que le premier
      1. http://bnwarriors.free.fr/images/cmd0.jpg
        Aucune réponse, juste le lecteur virtuel de crée...
    5. Contributeur
      donc si il n'y a aucune réponse la boucle for sort immédiatement, normal.
      au post #1 J'ai un programme qui renvoie une valeur lorsque qu'il est terminé.
      de quoi parles-tu ?
      1. C'est dans la documentation de daemon tools

        http://www.daemon-help.com/windows_integration_lite/command_line_parameters.html

        "-add - increments number of devices, returns number of virtual devices or -1 if error"
    6. Contributeur
      il est dans errorlevel, fais:

      set daemon=D:\Program Files (x86)\DAEMON Tools Lite\DTLite.exe
      "%daemon%" -add
      echo %errorlevel%

      si c'est ça, dans ton script enléve la ligne avec for et met
      "%daemon%" -add
      set drive=%errorlevel%
      1. http://bnwarriors.free.fr/images/cmd1.jpg

        J'ai toujours 0 comme valeur de retour...

        set daemon=D:\Program Files (x86)\DAEMON Tools Lite\DTLite.exe
        "%daemon%" -add
        echo %errorlevel%
        "%daemon%" -add
        echo %errorlevel%
        "%daemon%" -add
        echo %errorlevel%
        pause
    7. Contributeur
      ne faut-il pas exécuter le -mount avant le -add ?
      1. Non il faut créer un nouveau lecteur virtuel (-add) avant de monter une image dessus (-mount), mais j'essayerais quand même...
    8. Contributeur
      -1 est une erreur, donc 0 est une valeur possible, que fait le reste de ton script avec 0 ?
      1. @echo off
        setlocal enableDelayedExpansion

        set daemon=D:\Program Files (x86)\DAEMON Tools Lite\DTLite.exe
        echo daemon : %daemon%

        set ubuntu=D:\OS\Ubuntu9.10.iso
        echo ubuntu : %ubuntu%

        "%daemon%" -add
        set /a mount="%errorlevel%"
        echo Ajout du disque virtuel
        "%daemon%" -mount %mount%,"%ubuntu%"
        echo Montage de l'image CD dans le disque
        pause
        "%daemon%" -unmount %mount%
        echo Demontage de l'image CD
        "%daemon%" -remove
        echo Suppression du disque virtuel

        pause
        exit

        Le script fonctionne, seulement si aucun autre disque virtuel existe.
        Si je crée un disque virtuel (Z:\) avant et que je lance le script, il va lui aussi créer un disque virtuel (Y:\) mais monter l'image disque dans le premier disque virtuel crée (Z:\) et donc démonter l'image disque qui était déjà monté dans Z:\. Et à la fin du script, il va supprimer le disque virtuel qu'il à crée (Y:\)
      2. @remadTout cela parce que %errorlevel% reste à 0, donc cible le premier disque virtuel crée soit Z:\.
    9. Contributeur
      je n'ai pas vraiment saisi ce que fait ce programme, mais si il n'affiche aucun résultat et que %errorlevel% reste à 0, je ne vois pas très bien comment avoir un résultat dans une variable