[BATCH] Manipulation de variables avec NIRCMD

Question aux amateurs de l'utilitaire NIRCMD.EXE

Bonjour,
Je souhaiterais comprendre pourquoi une variable fixée par nircmd ne se retrouve pas dans mon script d'origine.
Voici un exemple qui illustre parfaitement mon souci:

Contenu du fichier "test.cmd"
set var1=Valeur OK

TEST 1
set var1=Valeur Bidon
call test.cmd
echo %var1%

Résultat => Valeur OK

TEST 2
set var1=Valeur Bidon
nircmd execmd test.cmd
echo %var1%

Résultat => Valeur Bidon

- Comment expliquez-vous ceci ?
- Quelle solution proposez-vous pour obtenir le résultat souhaité ?
Configuration: Windows XP / Internet Explorer 6.0

6 réponses

  1. REMARQUE:
    Avec > nircmd execmd call test.cmd
    J'obtient le même résultat (Valeur Bidon)
    1. Contributeur
      hello
      parce que la variable est créée dans un environnement qui disparait à l'arrêt de nircmd
      - essayer setlocal enableDelayedExpansion
      - ne pas utiliser nircmd
      1. D'accord, c'est bien ce qu'il me semblait...

        A quel moment dois-je utiliser "setlocal enableDelayedExpansion" ?
        > j'ai bien tenter de le mettre en début de script mais ca ne semble pas fonctionner

        La seconde proposition ne me convient pas. J'ai vraiment besoin de nircmd, tu comprendras que le code décris ci-dessus ne sert qu'a expliquer mon problème. Le script final consiste a executer un programme en silence qui retourne un tas de valeurs et je souhaite n'en recuperer qu'une seule.

        Merci pour ta participation.
    2. J'ai bien une idée mais je ne sais pas si elle convient:
      est-il possible d'ecrire dans les variables d'environnement (de windows) ?
      est-ce une bonne idée et si oui, comment fait-on ?
      1. Ok, ca semble fonctionner de cette manière:
        nircmd execmd ( setlocal enableDelayedExpansion & call test.cmd )

        Ca me retourne bien: Valeur OK
      2. Contributeur
        @Skapebien vu, je n'aurais pas pensé à le mettre là
      3. @SkapeOué, ben non... faux espoir, ca ne fonctionne pas
        En fait, ca revient a faire ceci:

        nircmd execmd setlocal enableDelayedExpansion
        call test.cmd


        J'ai également tenté de l'inserer dans le test.cmd mais c'est pas mieux.
        l'idée des variables d'environnement de windows est-elle bonne ?
    3. Contributeur
      essayer
      nircmd execmd cmd /c ( setlocal enableDelayedExpansion & call test.cmd )
      1. C'est plutot ca: nircmd execmd CMD /C "setlocal enableDelayedExpansion & call test.cmd"
        > mais ca ne fonctionne pas non plus

        J'ai meme essayé ca: nircmd execmd CMD /V:ON "call test.cmd"
        > sans succès
      2. @SkapeZut, y a un double "&" comme ceci:
        nircmd execmd CMD /C "setlocal enableDelayedExpansion && call test.cmd"
        > malheureusement ca ne change rien.
    4. Contributeur
      le double && a une autre signification que &
      & [...] commande1 & commande2 Permet de séparer plusieurs commandes sur la ligne de commande. Cmd.exe exécute la première commande, puis la seconde.

      && [...] commande1 && commande2 Permet d'exécuter la commande suivant && uniquement si la commande précédant le symbole est exécutée correctement. Cmd.exe exécute la première commande, puis la deuxième commande uniquement si la première a été exécutée correctement.

      passer les données par un fichier ?
      1. Pour le moment, je procède de cette manière mais j'aurais voulu l'eviter car c'est un peu bête de creer un fichier pour une seule valeur. Les variables d'environnements, qui apparaissent dans la liste de la fonction SET, ne serait-ce pas unee bonne idée ?
    5. Pas plus de succès avec la commande "setx ... -m" qui nécessite un rafraichissement de l'environnement. Mais cela m'a permis de me mettre sur la voix d'une autre commande: setenv
      Cela n'est pas forcement la meilleure méthode mais j'ai réussi a rafraichir la variable en procédant ainsi:

      Contenu du fichier "test.cmd":
      setenv -m var1 "Valeur OK"

      TEST 2
      set var1=Valeur Bidon
      nircmd execmd call test.cmd
      setenv -m var1 -delete
      for /F "delims=" %%i in ('setenv -m var1') do set var1=%%i
      echo %var1%

      Résultat => Valeur OK

      Par contre, ce que je ne comprends pas, c'est pourquoi ai-je besoin de la ligne "setenv -m var1 -delete" pour rafraichir la variable ?
      1. OK, j'ai compris: j'ai simplement besoin de faire une pause car le script continue son execution alors que nircmd n'a pas encore terminé.

        Donc, en somme:

        TEST 2
        set var1=Valeur Bidon
        nircmd execmd test.cmd
        ping 0.0.0.0 -n 1 > NUL
        for /f "delims=" %%i in ('setenv -m var1') do set var1=%%i
        echo %var1%

        allez, au dodo.