OVH Cloud OVH Cloud

HTA et errorlevel

9 réponses
Avatar
GOWAP
Salutation,

je cherche une solution d'équivalence pour récupérer un code "errorlevel"
sur un appel "MSHTA toto.hta".
En fait, je ne sais pas s'il y a un méthode comme le
wscript.quit(ValErrovel) pour le HTA.

Comment procédez-vous dans vos BATCH pour un traitement qui dépend de la
"réponse" du HTA ?

Merci.

GOWAP

9 réponses

Avatar
Méta-MCI
Bonsoir !


AMHA, le plus simple, c'est de passer par un fichier batch temporaire.

Exemple (avec deux fichiers) :


toto2.bat :
::Envoi un paramètre (TOTO) à Toto2.hta
::Récupère, au retour de Toto2.hta, la variable VRET
@echo off
set TOTOªZZEERR
toto2.hta
call RETOUR.BAT
echo VRET=%VRET%
del RETOUR.BAT


Toto2.hta :
<!-- Script HTA appelé par toto2.bat -->
<HTML><BODY bgColor=#ffffaa>
<DIV>Bla-bla-bla.<BR>
Fermez la fenêtre, SVP.</DIV>

<script id="htenv" language=JavaScript>
var wshell = new ActiveXObject("WScript.Shell");
var sysenv = wshell.Environment("PROCESS");
alert(sysenv("TOTO"));
sysenv("TOTO")="AABBCCDDEE"; //Attention, l'affection n'a qu'une portée
locale au script Toto2.hta
alert(sysenv("TOTO"));

var fso = new ActiveXObject("Scripting.FileSystemObject");
var file = fso.OpenTextFile("retour.bat",2,1,0);
file.Write("set VRETªZZEERRTTYYUUIIOOPP");
file.Close();
</script>

</BODY></HTML>






@-salutations
--
Michel Claveau
Avatar
GOWAP
c'est à peut prêt l'idée que j'ai utilisé pour l'instant, même si je la
trouve pas jolie.
En fait je créer un fichier au nom de HTA.commandline + ".bat" ; comme ca,
je suis sûr de ne pas faire des bêtises ; cependant, pour les appels de
programme HTA via réseau en lecture seul, ca coince, peut-être faire un
%temp%nom_prog_hta.bat

Sinon, je ne sais pas s'il y a une possibilité d'écrire une variable
d'environnement qui resterait (permanente) même après la fin du HTA !

A++
GOWAP

"Méta-MCI" a écrit dans le message de
news: eCdwG%
Bonsoir !


AMHA, le plus simple, c'est de passer par un fichier batch temporaire.

Exemple (avec deux fichiers) :


toto2.bat :
::Envoi un paramètre (TOTO) à Toto2.hta
::Récupère, au retour de Toto2.hta, la variable VRET
@echo off
set TOTOªZZEERR
toto2.hta
call RETOUR.BAT
echo VRET=%VRET%
del RETOUR.BAT


Toto2.hta :
<!-- Script HTA appelé par toto2.bat -->
<HTML><BODY bgColor=#ffffaa>
<DIV>Bla-bla-bla.<BR>
Fermez la fenêtre, SVP.</DIV>

<script id="htenv" language=JavaScript>
var wshell = new ActiveXObject("WScript.Shell");
var sysenv = wshell.Environment("PROCESS");
alert(sysenv("TOTO"));
sysenv("TOTO")="AABBCCDDEE"; //Attention, l'affection n'a qu'une
portée
locale au script Toto2.hta
alert(sysenv("TOTO"));

var fso = new ActiveXObject("Scripting.FileSystemObject");
var file = fso.OpenTextFile("retour.bat",2,1,0);
file.Write("set VRETªZZEERRTTYYUUIIOOPP");
file.Close();
</script>

</BODY></HTML>






@-salutations
--
Michel Claveau






Avatar
Méta-MCI
Bonsoir !

Pour garder la persistance, de l'affectation d'une variable d'environnement,
après la fin d'un .HTA, il faudrait que le HTA soit lancé dans le même
processus que le batch.

Et, effectivement, je ne crois pas que ce soit possible.
Quoique... J'ai peut-être une idée, mais difficile à tester : utiliser un
composant (serveur) COM singleton, appelé par le batch, ET par le .HTA. Le
comportement singleton entraînerait l'unicité de l'instanciation, ce qui
règlerait le problème.

Malheureusement, je ne sais pas faire de serveur COM singleton... Il serait
toujours possible de tester avec Word, mais ça semble un peu lourd.

@-salutations

Michel Claveau
Avatar
Jean
Sinon, je ne sais pas s'il y a une possibilité d'écrire une variable
d'environnement qui resterait (permanente) même après la fin du HTA !


var sysenv = wshell.Environment("USER");

voir :

http://groups.google.com/group/microsoft.public.fr.scripting/msg/ed171b9e025d2ef2?dmode=source&hl=fr

http://groups.google.com/group/microsoft.public.fr.scripting/msg/563ab980f094b646?dmode=source&hl=fr

Amicalement,


--
Jean - JMST
Belgium

Avatar
Méta-MCI
Bonjour !

Ben, non.
L'affectation d'une variable d'environnement ne résistera pas à la fermeture
du script .HTA
Plus exactement, avec "USER", on aura des variables d'environnement
différentes, dans le batch et le .HTA
Alors que, avec "PROCESS", le .HTA "héritera" la valeur affectée par le
batch, mais, s'il l'affecte, cela restera localisé au .HTA

@-salutations

Michel Claveau
Avatar
Jean
Plus exactement, avec "USER", on aura des variables d'environnement
différentes, dans le batch et le .HTA


Ca c'est toute une histoire :-)

A priori je ne pense pas que ce soit une bonne idée d'utiliser des
variables d'envirronement.

Mais a-t-il vraiment besoin d'un hta ? ... ou : a-t-il vraiment besoin
d'un batch ? ...

Sans savoir ce qu'il veut faire exactement ... difficile à dire :-)

Amicalement,


--
Jean - JMST
Belgium

Avatar
Méta-MCI
Bonjour !

Mais a-t-il vraiment besoin d'un hta ? ... ou : a-t-il vraiment besoin
d'un batch ? ...Sans savoir ce qu'il veut faire exactement ...




Effectivement.

Néanmoins, le principe du .HTA est très pratique, comme interface
utilisateur dans les batchs.
Exemple (attention à bien conserver les espaces) :

@echo off

if exist %0 (
set FICHIER=%0
) else (
set FICHIER=%0.bat
)

set /P MSG= Tapez un message court :

type %FICHIER% | find " " | find /V "Pas moi..." > %TEMP%tmp.hta

%TEMP%tmp.hta %MSG%
del %TEMP%tmp.hta

goto :EOF

<HTML>
<HTA:APPLICATION ID="oHTA"
ID="b12HTA"
SCROLL="No"
SINGLEINSTANCE="yes"
CAPTION="yes"
BORDER="thin"
BORDERSTYLE="complex" CAPTION="yes" CONTEXTMENU="yes"
INNERBORDER="no" MAXIMIZEBUTTON="no" MINIMIZEBUTTON="no"
NAVIGABLE="no"
SCROLL="no" SCROLLFLAT="no"
SELECTION="no" SHOWINTASKBAR="yes" SINGLEINSTANCE="yes"
SYSMENU="yes" WINDOWSTATE="normal">
<head><TITLE>l'Ecran Noir, version 'Luxe'</TITLE></head>
<BODY bgColor=#ffffcc onload="ENinit();">
<DIV ID="TOTO" alignÎnter><STRONG><EM><BR><FONT color=#ff0000
size=4>Salut, lecteur de l'</FONT><FONT color=#000000 size=4> Ecran Noir !
</FONT><BR><BR>
<BR><FONT color=#000080>Cette page est un exemple
d'utilisation<BR>d'un HTA</FONT> par un Batch.<BR><BR><BR>
<FONT color=#8888cc>Et, voici le message tapé : </FONT><BR><FONT
color=#880000><DIV ID=PARAM>XXX<BR></DIV></FONT></DIV>
<SCRIPT language=JavaScript>
function ENinit(){self.resizeTo(340,255);
var ligarg=oHTA.commandLine;
var i=ligarg.slice(1,255).indexOf(""");
var pointeur=document.getElementById('PARAM');
pointeur.innerText=ligarg.slice(i+3,255) + " ";}
</SCRIPT></BODY></HTML>



Avatar
Jean
Bonjour !

Mais a-t-il vraiment besoin d'un hta ? ... ou : a-t-il vraiment besoin
d'un batch ? ...Sans savoir ce qu'il veut faire exactement ...




Effectivement.

Néanmoins, le principe du .HTA est très pratique, comme interface utilisateur
dans les batchs.
Exemple (attention à bien conserver les espaces) :

@echo off

if exist %0 (
set FICHIER=%0
) else (
set FICHIER=%0.bat
)

set /P MSG= Tapez un message court :

type %FICHIER% | find " " | find /V "Pas moi..." > %TEMP%tmp.hta

%TEMP%tmp.hta %MSG%
del %TEMP%tmp.hta

goto :EOF

<HTML>
<HTA:APPLICATION ID="oHTA"
ID="b12HTA"
SCROLL="No"
SINGLEINSTANCE="yes"
CAPTION="yes"
BORDER="thin"
BORDERSTYLE="complex" CAPTION="yes" CONTEXTMENU="yes"
INNERBORDER="no" MAXIMIZEBUTTON="no" MINIMIZEBUTTON="no"
NAVIGABLE="no"
SCROLL="no" SCROLLFLAT="no"
SELECTION="no" SHOWINTASKBAR="yes" SINGLEINSTANCE="yes"
SYSMENU="yes" WINDOWSTATE="normal">
<head><TITLE>l'Ecran Noir, version 'Luxe'</TITLE></head>
<BODY bgColor=#ffffcc onload="ENinit();">
<DIV ID="TOTO" alignÎnter><STRONG><EM><BR><FONT color=#ff0000
size=4>Salut, lecteur de l'</FONT><FONT color=#000000 size=4> Ecran Noir !
</FONT><BR><BR>
<BR><FONT color=#000080>Cette page est un exemple d'utilisation<BR>d'un
HTA</FONT> par un Batch.<BR><BR><BR>
<FONT color=#8888cc>Et, voici le message tapé : </FONT><BR><FONT
color=#880000><DIV ID=PARAM>XXX<BR></DIV></FONT></DIV>
<SCRIPT language=JavaScript>
function ENinit(){self.resizeTo(340,255);
var ligarg=oHTA.commandLine;
var i=ligarg.slice(1,255).indexOf(""");
var pointeur=document.getElementById('PARAM');
pointeur.innerText=ligarg.slice(i+3,255) + " ";}
</SCRIPT></BODY></HTML>


Ca a l'air bien :-) ... (j'avoue, je n'ai pas essayé)
Le principe est intérressant (je crois que j'aurais utilisé des echo
pour générer le hta).

Je crois aussi qu'en utilisant ::::: à la place des 5 espaces on peut
éviter un goto.

Ne faut-t-il pas faire start /w %TEMP%tmp.hta %MSG% avant d'effacer le
hta ?

Le "find /v pas moi" ... à première vue je ne comprends pas trop a quoi
il sert.

Amicalement,

--
Jean - JMST
Belgium




Avatar
Méta-MCI
Bonsoir !


j'aurais utilisé des echo pour générer le hta




Possible, mais, AMHA, moins lisible.


Je crois aussi qu'en utilisant ::::: à la place des 5 espaces on peut
éviter un goto.




Oui ; mais il y a plus d'éditeurs qui permettent de d'indenter des blocs
avec des espaces, ce qui est moins fatiguant...


Ne faut-t-il pas faire start /w %TEMP%tmp.hta %MSG% avant d'effacer le
hta ?




Le start /W est jouable. Mais l'appel direct attend aussi. Reste à savoir si
on veut rester dans le même processus. Tout dépend de l'utilisation. On peut
aussi envisager un START sans WAIT, et simuler du multi-tâches-Batch (fô
alors pas deleter intempestivement).


Le "find /v pas moi" ... à première vue je ne comprends pas trop a quoi
il sert.




C'est pour éliminer la ligne du FIND, qui contient (aussi) les espaces
(critère de sélection des lignes). Et, ça c'est un piège/effet de bord
classique, que l'on élimine vite fait au premier déboguage.



Amicalement (et tchin-tchin) aussi !

MCI