2012-04-21 61 views
9

La domanda è auto-esplicativa. Sarebbe bello se il codice fosse lungo una riga (qualcosa ha a che fare con "Process.Start("...")"?). Ho fatto ricerche sul web ma ho trovato solo vecchi esempi e simili che non funzionano (almeno per me). Voglio usare questo nella mia libreria di classi, per eseguire comandi Git (se questo aiuta?).Come eseguire i comandi DOS/CMD/Command Prompt da VB.NET?

+1

magari iniziare semplice con Process.Start ("C: \ Windows \ System32 \ MSPaint.exe") - poi una volta che si ottiene che andando iniziare a provare i comandi Git Immagino che ci sia molto più difficile con tutti gli altri argomenti della riga di comando. L'altro consiglio utile per aiutarti a capire cosa è sbagliato, è leggere l'errore StandardError, la risposta qui è un esempio perfetto: http://stackoverflow.com/questions/2709198/process-start-get-errors-from-command- prompt-window –

risposta

14

Si potrebbe provare questo metodo:

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 

chiamata, ad esempio, in questo modo:

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

EDIT: Per il comando multipla su una linea chiave sono il & | & & e || connettori comando

  • A & B → eseguire il comando A, quindi eseguire il comando B.
  • A | B → eseguire il comando A, e reindirizzare tutto il suo output nella ingresso di comando B.
  • A & & B → eseguire il comando A, valutare l'errorlevel dopo l'esecuzione comando A, e se il codice di uscita (errorlevel) è 0, solo allora esegui il comando B.
  • A || B → eseguire un comando, valutare il codice di uscita di questo comando e se è tutt'altro che 0, solo allora eseguire il comando B.
+0

Ciao! Ho usato questo codice (https://gist.github.com/2465024) e quando eseguo il comando (ho cambiato il nome in "' runCommand' "e l'ho usato - quindi non è questo il problema!), Ottengo un" 'Il riferimento a un membro non condiviso richiede un riferimento oggetto." Errore. Qualche idea, perché? –

+0

BTW, funziona quando è nella stessa classe, tuttavia l'ho usato in una libreria di classi, che ho importato nel mio progetto Windows Forms. Qualche idea sul perché non funziona? –

+0

Inoltre, c'è un modo per eseguire più comandi contemporaneamente. Qualcosa come "' Nascondi cmd, esegui il primo comando, nascondi cmd, esegui il secondo comando, mostra cmd' ". –

11

si può provare questo di eseguire il comando Poi cmd Esce

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

Si può provare questo per eseguire il comando And Let cmd aspettare per più comandi

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 

Questo funziona così

+0

Non è la mia risposta, e non dico che questa è o non è una buona risposta, ma se non sei votato per favore spiega perché. È vantaggioso per gli altri sapere perché questa non è stata considerata una buona soluzione. –

0

Sono stato ispirato dalla risposta di Steve, ma ho pensato di aggiungere un po 'di flare ad esso. Mi piace lavorare in anticipo sulla scrittura dei metodi di estensione, quindi in seguito ho meno lavoro da fare per chiamare il metodo.

Ad esempio, con la versione modificata della risposta di Steve seguito, invece di fare questa chiamata ...

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

posso effettivamente basta digitare il comando e lo chiamano dalle mie corde come questo ..

Direttamente nel codice.

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

O

Da una variabile.

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

O

Da una casella di testo. dovranno

textbox.text.RunCMD(WaitForProcessComplete:=True)


metodi di estensione ad essere immessi in un modulo pubblico e portare l'attributo <Extension> sopra il sub. Sarà inoltre necessario aggiungere Imports System.Runtime.CompilerServices all'inizio del file di codice.

Ci sono molte informazioni su SO su Extension Methods se hai bisogno di ulteriore aiuto.


Metodo di estensione

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 
Problemi correlati