Overblog
Editer l'article Suivre ce blog Administration + Créer mon blog

VBS: Lancer un script depuis un script et recuperer le resultat

Publié le par damcuvelier

 

Fonctionnement:

Script 1 (cmd.vbs) execute une commande ou une fonction ou whatever

Scritp A (execcmd.vbs) lance script 1 dans une variable et “joue” avec la variable.

 

Très utile si on a un script A chapeau et X scripts autour avec chacun une fonction propre.

 

script A:

 

' Execute script in argument "/Cmd:" and analyse stdout
' stdout = objExecObject.StdOut of "/Cmd:"
' usage: cscript execcmd.vbs /Cmd:cmd.vbs

Set oShell = CreateObject("Wscript.Shell")
Set colNamedArguments = WScript.Arguments.Named

Cmd = colNamedArguments.Item("Cmd")


Set objExecObject = oShell.Exec("cscript " & Cmd)
Set objStdOut = objExecObject.StdOut

    Do Until objStdOut.AtEndOfStream
        strLine = objStdOut.ReadLine
        analyse(strLine)
    Loop

wscript.quit

   
function analyse(strLine)
    if instr(lcase(strLine),lcase("actif")) > 0 then
    Wscript.Echo "useractif = " & trim(mid(strLine,20,19))
    end if
end function

 

Script 1:

' Execute command strCommand and stdout in strLine
' usage cscript cmd.vbs
' strCommand = the command to run

Set oShell = CreateObject("Wscript.Shell")
'strCommand = "%comspec% /c dir /b *.vbs"
strCommand = "%comspec% /c qwinsta"
Set objExecObject = oShell.Exec(strCommand)
Set objStdOut = objExecObject.StdOut
    Do Until objStdOut.AtEndOfStream
        strLine = objStdOut.ReadLine
        Wscript.Echo strLine ‘output the command result
    Loop

 

ici la command est un dir ou un qwinsta, mais cela peut très bien être une commande powershell ou une requete sql… etc

on peut très bien mettre cela dans un script unique, mais lorsqu’on commence à avoir plus de 200 lignes à un script, il est plus simple, à mon avis, d’utiliser cette méthode, plutôt que d’écrire des usines à gaz.

 

---------------------------------------------

ensuite on peut aussi, appeler un autre script depuis un script, en utilisant les variables résultantes des actions précédentes.

 

wshshell.run "cscript vbscript.vbs /arg:" & strLine ,0,true
or
wshshell.run "batch/arg:" & strLine ,0,true
or
wshshell.run "command/arg:" & strLine ,0,true


si vous ne lancez pas tout depuis le même répertoire, n'oubliez pas de fournir le chemin de chaque objet appelé.
si vous lancez une commande MSDOS comme "dir" n'oubliez pas d'ajouter %comspec% /c comme ça:
wshshell.run "%comspec% /c command",0,true

that's all

Commenter cet article

S
<br /> Juju,<br /> <br /> Je suis tombé sur ta réponse au détour d'une recherche puisque j'ai eu un problème similaire. Damien confirmera surement mais je pense que la solution suivante peut répondre à tes attentes :<br /> <br /> Avant de lancer ton CMD tu peux essayer de developper un applet JAVA qui va, à l'aide de la fonction Eval() lancer ton CMD. Normalement le code de retour sera récupéré et tu pourras le parser via<br /> un shellscript BASH. Par contre il te faut CygWin pour les commandes Linux.<br /> <br /> <br />
Répondre
D
<br /> <br /> Bonjour,<br /> <br /> <br /> Je ne connais pas le shell linux, et:<br /> <br /> <br /> "si tu le dis."<br /> <br /> <br /> je ne suis pas dév, et je ne connais le JAVA... ;)<br /> <br /> <br />  <br /> <br /> <br /> <br />
J
<br /> Bonjour Damien, super ton blog. Je viens du monde non Windows mais je dois dans le cadre de mon travail exécuter un cmd qui lance un script et qui lui-même exécute un kix (au logon du PC). Le cmd<br /> doit récupérer la valeur du kix ? Comment penses-tu que je dois m’y prendre. En perl j’ai trouvé des exemples mais là je sèche. Penses-tu que PowerShell pourrai m’aider ? Merci par avance<br /> <br /> <br />
Répondre
D
<br /> <br /> dsl: je ne suis pas dév<br /> <br /> <br /> <br />