command-line - script - ocultar cmd con vbs
¿Ejecuta la línea de comandos silenciosamente con VbScript y obtiene resultados? (5)
@Mark Cidade
Gracias Mark! Esto resolvió algunos días de investigación sobre cómo debería llamar esto desde PHP WshShell. Así que gracias a tu código, 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;
}
Esto es lo que funcionó para mí en mi caso. Siéntase libre de usar y modificar según sus necesidades. Siempre puede agregar funcionalidad dentro de la función para leer automáticamente el archivo tmp, asignarlo a una variable y / o devolverlo y luego eliminar el archivo tmp. Gracias de nuevo @Mark!
Quiero poder ejecutar un programa a través de la línea de comandos y quiero iniciarlo con VbScript. También quiero obtener el resultado de la línea de comando y asignarlo a una variable y quiero que todo esto se haga de forma silenciosa sin que aparezcan las ventanas de cmd. He manejado dos cosas por separado pero no juntas. Esto es lo que obtuve hasta ahora. Ejecute el comando desde cmd y obtenga salida:
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
El script anterior funciona y hace lo que quiero, excepto que el cmd aparece por un breve momento.
Aquí hay un script que se ejecutará en silencio pero no captará la salida
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)
¿Hay alguna manera de hacer que estos dos trabajen juntos?
Déjame darte un resumen sobre por qué quiero hacer esto. Básicamente, estoy sondeando una unidad cada 5-10 minutos y voy a enviar la secuencia de comandos por correo electrónico o lanzar un cuadro de mensaje cuando ocurre una determinada condición, pero no quiero ver la línea de cmd apareciendo todo el día en mi computadora. ¿Alguna sugerencia? Gracias
He tomado este y otros comentarios y he creado una función un poco más avanzada para ejecutar una aplicación y obtener el resultado.
Ejemplo de función de llamada: generará la lista DIR de C: / solo para directorios. La salida se devolverá a la variable CommandResults y permanecerá en C: / OUTPUT.TXT.
CommandResults = vFn_Sys_Run_CommandOutput("CMD.EXE /C DIR C:/ /AD",1,1,"C:/OUTPUT.TXT",0,1)
Función
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
O bien, busque asignar la salida al Portapapeles (en su primer script) y luego en el segundo script analizar el valor del Portapapeles.
Si obtiene cualquier otro método, por favor sugiérame también.
Puede redirigir la salida a un archivo y luego leer el archivo:
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
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)
guarda su archivo .bat en "Appdata del usuario actual", si no existe y elimina los atributos y luego establece los atributos "ocultos" en el archivo después de escribir su código cmd y ejecutarlo silenciosamente y capturar todos los resultados, lo guarda en archivo así que si quieres guardar toda la salida de cmd en el archivo simplemente agrega tu como este
code > C:/Users/Lenovo/Desktop/output.txt
simplemente reemplace la palabra "código" con su código o comando de archivo .bat y después de eso el directorio del archivo de salida encontré un código recientemente después de buscar mucho si quiere ejecutar el archivo .bat en vb o c # o simplemente agregue esto de la misma manera en el cual he escrito