[BATCH] Manipulation de variables avec NIRCMD

Skape -  
 Skape -
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. Skape
     
    REMARQUE:
    Avec > nircmd execmd call test.cmd
    J'obtient le même résultat (Valeur Bidon)
    0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
    0
    1. Skape
       
      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.
      0
  3. Skape
     
    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 ?
    0
    1. Skape
       
      Ok, ca semble fonctionner de cette manière:
      nircmd execmd ( setlocal enableDelayedExpansion & call test.cmd )

      Ca me retourne bien: Valeur OK
      0
      1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660 > Skape
         
        bien vu, je n'aurais pas pensé à le mettre là
        0
      2. Skape > Skape
         
        Oué, 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 ?
        0
  4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    essayer
    nircmd execmd cmd /c ( setlocal enableDelayedExpansion & call test.cmd )
    0
    1. Skape
       
      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
      0
      1. Skape > Skape
         
        Zut, y a un double "&" comme ceci:
        nircmd execmd CMD /C "setlocal enableDelayedExpansion && call test.cmd"
        > malheureusement ca ne change rien.
        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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 ?
    0
    1. Skape
       
      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 ?
      0
  7. Skape
     
    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 ?
    0
    1. Skape
       
      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.
      0