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?
risposta
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.
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é? –
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? –
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' ". –
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")
Sub systemcmd(ByVal cmd As String)
Shell("cmd /c """ & cmd & """", AppWinStyle.MinimizedFocus, True)
End Sub
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ì
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. –
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
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 –