web-dev-qa-db-fra.com

Exécuter la ligne de commande en mode silencieux avec VbScript et obtenir une sortie?

Je veux pouvoir exécuter un programme en ligne de commande et le lancer avec VbScript. Je souhaite également obtenir le résultat de la ligne de commande et l'affecter à une variable. Je souhaite que tout cela soit fait en mode silencieux sans que les fenêtres cmd n'apparaissent. J'ai réussi deux choses séparément mais pas ensemble. Voici ce que j'ai obtenu jusqu'ici . Exécutez la commande à partir de cmd et obtenez le résultat:

Dim WshShell, oExec
Set WshShell = WScript.CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("C:\snmpget -c public -v 2c 10.1.1.2 .1.3.6.1.4.1.6798.3.1.1.1.5.1")
x = oExec.StdOut.ReadLine
Wscript.Echo x

Le script ci-dessus fonctionne et fait ce que je veux sauf que cmd apparaît pour un bref instant. 

Voici un script qui s'exécutera en mode silencieux mais ne récupérera pas la sortie

Set WshShell = WScript.CreateObject("WScript.Shell")
Return = WshShell.Run("C:\snmpset -c public -v 2c -t 0 10.1.1.2 .1.3.6.1.4.1.6798.3.1.1.1.7.1 i 1", 0, true)

Y a-t-il un moyen de faire en sorte que ces deux-là travaillent ensemble?

Laissez-moi vous expliquer pourquoi je veux faire cela. En gros, j'interroge une unité toutes les 5 à 10 minutes et je vais demander au script d'envoyer un message électronique ou d'envoyer une boîte de message lorsqu'une certaine situation se produit, mais je ne veux pas voir la ligne cmd apparaître toute la journée sur mon ordinateur. Des suggestions? Merci

30
Onat

Vous pouvez rediriger la sortie vers un fichier, puis lire le fichier:

return = WshShell.Run("cmd /c C:\snmpset -c ... > c:\temp\output.txt", 0, true)

Set fso  = CreateObject("Scripting.FileSystemObject")
Set file = fso.OpenTextFile("c:\temp\output.txt", 1)
text = file.ReadAll
file.Close
34
Mark Cidade

J'ai pris cela et divers autres commentaires et créé une fonction un peu plus avancée pour exécuter une application et obtenir le résultat.

Exemple à appeler Fonction: Génère la liste DIR de C:\pour les répertoires uniquement. La sortie sera renvoyée à la variable CommandResults et restera dans C:\OUTPUT.TXT.

CommandResults = vFn_Sys_Run_CommandOutput("CMD.EXE /C DIR C:\ /AD",1,1,"C:\OUTPUT.TXT",0,1)

Une fonction

Function vFn_Sys_Run_CommandOutput (Command, Wait, Show, OutToFile, DeleteOutput, NoQuotes)
'Run Command similar to the command Prompt, for Wait use 1 or 0. Output returned and
'stored in a file.
'Command = The command line instruction you wish to run.
'Wait = 1/0; 1 will wait for the command to finish before continuing.
'Show = 1/0; 1 will show for the command window.
'OutToFile = The file you wish to have the output recorded to.
'DeleteOutput = 1/0; 1 deletes the output file. Output is still returned to variable.
'NoQuotes = 1/0; 1 will skip wrapping the command with quotes, some commands wont work
'                if you wrap them in quotes.
'----------------------------------------------------------------------------------------
  On Error Resume Next
  'On Error Goto 0
    Set f_objShell = CreateObject("Wscript.Shell")
    Set f_objFso = CreateObject("Scripting.FileSystemObject")
    Const ForReading = 1, ForWriting = 2, ForAppending = 8
      'VARIABLES
        If OutToFile = "" Then OutToFile = "TEMP.TXT"
        tCommand = Command
        If Left(Command,1)<>"""" And NoQuotes <> 1 Then tCommand = """" & Command & """"
        tOutToFile = OutToFile
        If Left(OutToFile,1)<>"""" Then tOutToFile = """" & OutToFile & """"
        If Wait = 1 Then tWait = True
        If Wait <> 1 Then tWait = False
        If Show = 1 Then tShow = 1
        If Show <> 1 Then tShow = 0
      'RUN PROGRAM
        f_objShell.Run tCommand & ">" & tOutToFile, tShow, tWait
      'READ OUTPUT FOR RETURN
        Set f_objFile = f_objFso.OpenTextFile(OutToFile, 1)
          tMyOutput = f_objFile.ReadAll
          f_objFile.Close
          Set f_objFile = Nothing
      'DELETE FILE AND FINISH FUNCTION
        If DeleteOutput = 1 Then
          Set f_objFile = f_objFso.GetFile(OutToFile)
            f_objFile.Delete
            Set f_objFile = Nothing
          End If
        vFn_Sys_Run_CommandOutput = tMyOutput
        If Err.Number <> 0 Then vFn_Sys_Run_CommandOutput = "<0>"
        Err.Clear
        On Error Goto 0
      Set f_objFile = Nothing
      Set f_objShell = Nothing
  End Function
10
Tony Wolf

@ Mark Cidade

Merci Mark! Cela a résolu quelques jours de recherche sur la question de savoir comment appeler ceci depuis PHP WshShell. Donc, grâce à votre code, j'ai pensé ...

function __exec($tmppath, $cmd)
{
   $WshShell = new COM("WScript.Shell");
   $tmpf = Rand(1000, 9999).".tmp"; // Temp file
   $tmpfp = $tmppath.'/'.$tmpf; // Full path to tmp file

   $oExec = $WshShell->Run("cmd /c $cmd -c ... > ".$tmpfp, 0, true);

   // return $oExec == 0 ? true : false; // Return True False after exec
   return $tmpf;
}

C'est ce qui a fonctionné pour moi dans mon cas. N'hésitez pas à utiliser et à modifier selon vos besoins. Vous pouvez toujours ajouter des fonctionnalités dans la fonction pour lire automatiquement le fichier tmp, l'affecter à une variable et/ou la renvoyer puis supprimer le fichier tmp . Merci encore @Mark!

0
GTodorov

Je suis assez nouveau pour tout cela, mais j'ai constaté que si le script est démarré via CScript.exe (console de scripting hôte), aucune fenêtre n'apparaît sur exec (): ainsi lors de l'exécution: 

cscript myscript.vbs //nologo

les appels .Exec () dans le fichier myscript.vbs n'ouvrent pas de fenêtre supplémentaire, ce qui signifie que vous pouvez utiliser la première variante de votre solution d'origine (à l'aide de exec).

(Notez que les deux barres obliques dans le code ci-dessus sont intentionnelles, voir cscript /?)

0
Johannes Thoma