2012-04-21 59 views
9

La pregunta es autoexplicativa. Sería fantástico si el código tuviera una línea de longitud (algo que ver con "Process.Start("...")"?). Investigué la web, pero solo encontré ejemplos antiguos y otros que no funcionan (al menos para mí). Quiero usar esto en mi biblioteca de clase, para ejecutar comandos de Git (si eso ayuda?).¿Cómo ejecutar comandos DOS/CMD/Command Prompt desde VB.NET?

+1

tal vez empezar de forma sencilla con Process.Start ("C: \ Windows \ System32 \ MSPaint.exe") - a continuación, una vez que usted consigue que va empezar a tratar los comandos de Git Imagino que es mucho más difícil con todos los argumentos adicionales de la línea de comando. El otro consejo útil para ayudarlo a resolver cuál es el error es leer StandardError, la respuesta aquí es un ejemplo perfecto: http://stackoverflow.com/questions/2709198/process-start-get-errors-from-command- ventana de solicitud –

Respuesta

14

Usted podría intentar este método:

Public Class MyUtilities 
    Shared Sub RunCommandCom(command as String, arguments as String, permanent as Boolean) 
     Dim p as Process = new Process() 
     Dim pi as ProcessStartInfo = new ProcessStartInfo() 
     pi.Arguments = " " + if(permanent = true, "/K" , "/C") + " " + command + " " + arguments 
     pi.FileName = "cmd.exe" 
     p.StartInfo = pi 
     p.Start() 
    End Sub 
End Class 

llamada, por ejemplo, de esta manera:

MyUtilities.RunCommandCom("DIR", "/W", true) 

EDIT: Para el comando múltiples en una sola línea la clave son el & | & & y || conectores de mando

  • Un & B → comando de ejecución A, a continuación, ejecutar el comando B.
  • A | B → comando de ejecución A, y redirigir todo esto es la salida a la entrada de mando B.
  • Un & & B → ejecutar el comando A, evaluar el nivel de error después de ejecutar Comando A, y si el código de salida (nivel de error) es 0, solo luego ejecute el comando B.
  • A || B → ejecutar comandos A, evaluar el código de salida de este comando y si es cualquier cosa menos 0, sólo entonces ejecutar el comando B.
+0

¡Hola! Usé este código (https://gist.github.com/2465024) y cuando ejecuté su comando (cambié el nombre a "' runCommand' "y lo usé - ¡así que ese no es el problema!), Obtengo un" 'La referencia a un miembro no compartido requiere un error de referencia de objeto.". ¿Alguna idea de por qué? –

+0

Por cierto, funciona cuando está en la misma clase, sin embargo, lo usé en una Biblioteca de clases, que importé a mi proyecto de Windows Forms. ¿Alguna idea de por qué no está funcionando? –

+0

Además, ¿hay alguna manera de ejecutar varios comandos a la vez? Algo como "' Ocultar cmd, ejecutar el primer comando, ocultar cmd, ejecutar el segundo comando, mostrar cmd' ". –

11

Usted puede intentar esto para ejecutar comandos Entonces cmd salidas

Process.Start("cmd", "/c YourCode") 

Usted puede probar esto para ejecutar el comando y dejó cmd esperar más comandos

Process.Start("cmd", "/k YourCode") 
1
Sub systemcmd(ByVal cmd As String) 
    Shell("cmd /c """ & cmd & """", AppWinStyle.MinimizedFocus, True) 
End Sub 
-1
Imports System.IO 
Public Class Form1 
    Public line, counter As String 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     counter += 1 
     If TextBox1.Text = "" Then 
      MsgBox("Enter a DNS address to ping") 
     Else 
      'line = ":start" + vbNewLine 
      'line += "ping " + TextBox1.Text 
      'MsgBox(line) 
      Dim StreamToWrite As StreamWriter 
      StreamToWrite = New StreamWriter("C:\Desktop\Ping" + counter + ".bat") 
      StreamToWrite.Write(":start" + vbNewLine + _ 
           "Ping -t " + TextBox1.Text) 
      StreamToWrite.Close() 
      Dim p As New System.Diagnostics.Process() 
      p.StartInfo.FileName = "C:\Desktop\Ping" + counter + ".bat" 
      p.Start() 
     End If 
    End Sub 
End Class 

Esto funciona así

+0

No es mi respuesta, y no digo que esto sea o no una buena respuesta, pero si rechazas votar, explica por qué. Beneficia a otros saber por qué esto no se consideró una buena solución. –

0

Me inspiré en la respuesta de Steve, pero que me gustaría añadir un poco de brillo a la misma. Me gusta hacer el trabajo antes de escribir métodos de extensión, así que después tengo menos trabajo para llamar al método.

Por ejemplo, con la versión modificada de la respuesta de Steve a continuación, en lugar de hacer esta llamada ...

MyUtilities.RunCommandCom("DIR", "/W", true)

puedo realidad sólo tiene que escribir el comando y lo llaman de mis cadenas como esta ..

Directamente en el código.

Call "CD %APPDATA% & TREE".RunCMD()

O

De una variable.

Dim MyCommand = "CD %APPDATA% & TREE" 
MyCommand.RunCMD() 

O

Desde un cuadro de texto.

textbox.text.RunCMD(WaitForProcessComplete:=True)


Los métodos de extensión tendrán que ser colocado en un módulo público y llevar el atributo <Extension> sobre el submarino. También querrá agregar Imports System.Runtime.CompilerServices a la parte superior de su archivo de código.

Hay mucha información sobre SO sobre métodos de extensión si necesita más ayuda.


Método de extensión

Public Module Extensions 
''' <summary> 
''' Extension method to run string as CMD command. 
''' </summary> 
''' <param name="command">[String] Command to run.</param> 
''' <param name="ShowWindow">[Boolean](Default:False) Option to show CMD window.</param> 
''' <param name="WaitForProcessComplete">[Boolean](Default:False) Option to wait for CMD process to complete before exiting sub.</param> 
''' <param name="permanent">[Boolean](Default:False) Option to keep window visible after command has finished. Ignored if ShowWindow is False.</param> 
<Extension> 
Public Sub RunCMD(command As String, Optional ShowWindow As Boolean = False, Optional WaitForProcessComplete As Boolean = False, Optional permanent As Boolean = False) 
    Dim p As Process = New Process() 
    Dim pi As ProcessStartInfo = New ProcessStartInfo() 
    pi.Arguments = " " + If(ShowWindow AndAlso permanent, "/K", "/C") + " " + command 
    pi.FileName = "cmd.exe" 
    pi.CreateNoWindow = Not ShowWindow 
    If ShowWindow Then 
     pi.WindowStyle = ProcessWindowStyle.Normal 
    Else 
     pi.WindowStyle = ProcessWindowStyle.Hidden 
    End If 
    p.StartInfo = pi 
    p.Start() 
    If WaitForProcessComplete Then Do Until p.HasExited : Loop 
End Sub 
End Module 
Cuestiones relacionadas