Exécuter la ligne de commande silencieusement avec VbScript et obtenir une sortie?

Je veux pouvoir exécuter un programme via la ligne de commande et je veux le démarrer avec VbScript. Je veux aussi obtenir la sortie de la ligne de commande et l'assigner à une variable et je veux que tout cela soit fait silencieusement sans que les fenêtres cmd apparaissent. J'ai réussi deux choses séparément, mais pas ensemble. Voici ce que j'ai obtenu jusqu'à présent. Exécutez la commande à partir de cmd et obtenez la sortie:

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 pendant un bref moment.

Voici un script qui s'exécutera silencieusement 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)

Est-il un moyen d'obtenir ces deux travailler ensemble?

Permettez-moi de vous donner un arrière-plan sur pourquoi je veux faire à cela. J'interroge essentiellement une unité toutes les minutes 5-10 et je vais envoyer le script par e-mail ou lancer une boîte de message lorsqu'une certaine condition se produit, mais je ne veux pas voir la ligne cmd apparaître toute la journée sur mon ordinateur. Toutes les suggestions? Merci

30
demandé sur Onat 2011-04-17 02:41:01

5 réponses

, 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
33
répondu Mark Cidade 2016-06-18 17:42:48

J'ai pris ceci et divers autres commentaires et créé une fonction un peu plus avancée pour exécuter une application et obtenir la sortie.

Exemple pour appeler la fonction: affichera la liste DIR de C: \ pour les répertoires uniquement. La sortie sera renvoyée à la variable CommandResults ainsi que rester dans C:\OUTPUT.TXT.

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

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
répondu Tony Wolf 2012-09-21 20:21:23

Ou bien recherchez l'affectation de la sortie au presse-papiers (dans votre premier script), puis dans le second script, analysez la valeur du Presse-papiers.

Si vous obtenez une autre méthode, veuillez me suggérer aussi.

0
répondu sameer 2011-12-13 06:43:53

@ Mark Cidade

Merci Marc! Cela a résolu quelques jours de recherche sur la question de savoir comment devrais-je appeler cela à partir du PHP WshShell. Donc, grâce à votre code, je me suis dit...

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 le renvoyer, puis supprimer le fichier tmp. Merci encore @Marc!

0
répondu GTodorov 2014-11-24 00:59:14
Dim path As String = GetFolderPath(SpecialFolder.ApplicationData)
 Dim filepath As String = path + "\" + "your.bat"
    ' Create the file if it does not exist. 
    If File.Exists(filepath) = False Then
        File.Create(filepath)
    Else
    End If
    Dim attributes As FileAttributes
    attributes = File.GetAttributes(filepath)
    If (attributes And FileAttributes.ReadOnly) = FileAttributes.ReadOnly Then
        ' Remove from Readonly the file.
        attributes = RemoveAttribute(attributes, FileAttributes.ReadOnly)
        File.SetAttributes(filepath, attributes)
        Console.WriteLine("The {0} file is no longer RO.", filepath)
    Else
    End If
    If (attributes And FileAttributes.Hidden) = FileAttributes.Hidden Then
        ' Show the file.
        attributes = RemoveAttribute(attributes, FileAttributes.Hidden)
        File.SetAttributes(filepath, attributes)
        Console.WriteLine("The {0} file is no longer Hidden.", filepath)
    Else
    End If
    Dim sr As New StreamReader(filepath)
    Dim input As String = sr.ReadToEnd()
    sr.Close()
    Dim output As String = "@echo off"
    Dim output1 As String = vbNewLine + "your 1st cmd code"
    Dim output2 As String = vbNewLine + "your 2nd cmd code "
    Dim output3 As String = vbNewLine + "exit"
    Dim sw As New StreamWriter(filepath)
    sw.Write(output)
    sw.Write(output1)
    sw.Write(output2)
    sw.Write(output3)
    sw.Close()
    If (attributes And FileAttributes.Hidden) = FileAttributes.Hidden Then
    Else
        ' Hide the file.
        File.SetAttributes(filepath, File.GetAttributes(filepath) Or FileAttributes.Hidden)
        Console.WriteLine("The {0} file is now hidden.", filepath)
    End If
    Dim procInfo As New ProcessStartInfo(path + "\" + "your.bat")
    procInfo.WindowStyle = ProcessWindowStyle.Minimized
    procInfo.WindowStyle = ProcessWindowStyle.Hidden
    procInfo.CreateNoWindow = True
    procInfo.FileName = path + "\" + "your.bat"
    procInfo.Verb = "runas"
    Process.Start(procInfo)

Il enregistre votre .bat fichier à "Appdata de l'utilisateur actuel", si elle n'existe pas et supprimer les attributs et après cela, définissez les attributs" cachés " dans le fichier après avoir écrit votre code cmd et exécutez le silencieusement et capturez toute la sortie l'enregistre dans un fichier donc, si vous voulez enregistrer toutes les sorties de cmd dans un fichier, ajoutez simplement votre like this

code > C:\Users\Lenovo\Desktop\output.txt

Il suffit de remplacer le mot "code" par votre .bat code de fichier ou commande et après cela le répertoire du fichier de sortie J'ai trouvé un code récemment après avoir cherché beaucoup si u veux exécuter .fichier bat en vb ou c# ou simplement il suffit d'ajouter ceci de la même manière que j'ai écrit

0
répondu Aditya 2015-06-21 10:51:51