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
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
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
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.
@ 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!
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