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
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 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
@ 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!
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 /?)