[BATCH] Manipulation de variables avec NIRCMD

[Fermé]
Signaler
-
 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é ?

6 réponses

REMARQUE:
Avec > nircmd execmd call test.cmd
J'obtient le même résultat (Valeur Bidon)
Messages postés
18247
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
2 août 2021
5 331
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
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.
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 ?
Ok, ca semble fonctionner de cette manière:
nircmd execmd ( setlocal enableDelayedExpansion & call test.cmd )

Ca me retourne bien: Valeur OK
Messages postés
18247
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
2 août 2021
5 331 > Skape
bien vu, je n'aurais pas pensé à le mettre là
> 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 ?
Messages postés
18247
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
2 août 2021
5 331
essayer
nircmd execmd cmd /c ( setlocal enableDelayedExpansion & call test.cmd )
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
> Skape
Zut, y a un double "&" comme ceci:
nircmd execmd CMD /C "setlocal enableDelayedExpansion && call test.cmd"
> malheureusement ca ne change rien.
Messages postés
18247
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
2 août 2021
5 331
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 ?
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 ?
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 ?
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.