web-dev-qa-db-fra.com

Comment exécuter les commandes DOS / CMD / invite de commande à partir de VB.NET?

La question s'explique d'elle-même. Ce serait génial si le code était d'une ligne (quelque chose à voir avec "Process.Start("...")"?). J'ai fait des recherches sur le Web, mais je n'ai trouvé que d'anciens exemples et de tels exemples qui ne fonctionnent pas (du moins pour moi). Je veux l'utiliser dans ma bibliothèque de classes, pour exécuter des commandes Git (si cela aide?).

13
user1072207

Vous pouvez essayer cette méthode:

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

appelez par exemple de cette manière:

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

EDIT: Pour la commande multiple sur une ligne, la clé est la | et || connecteurs de commande

  • A B → exécuter la commande A, puis exécuter la commande B.
  • A | B → exécuter la commande A, et rediriger toute sa sortie vers l'entrée de la commande B.
  • A B → exécuter la commande A, évaluer le niveau d'erreur après avoir exécuté la commande A, et si le code de sortie (errorlevel) est 0, alors seulement exécuter la commande B.
  • A || B → exécutez la commande A, évaluez le code de sortie de cette commande et si c'est autre chose que 0, alors exécutez la commande B.
20
Steve

Vous pouvez essayer ceci pour exécuter la commande, puis cmd quitte

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

Vous pouvez essayer ceci pour exécuter la commande et laisser cmd attendre plus de commandes

Process.Start("cmd", "/k YourCode")
13
Saeed A Suleiman

J'ai été inspiré par la réponse de Steve mais j'ai pensé y ajouter un peu d'éclat. J'aime faire le travail avant d'écrire des méthodes d'extension donc plus tard j'ai moins de travail à faire pour appeler la méthode.

Par exemple avec la version modifiée de la réponse de Steve ci-dessous, au lieu de faire cet appel ...

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

Je peux simplement taper la commande et l'appeler à partir de mes chaînes comme ceci ...

Directement dans le code.

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

OR

À partir d'une variable.

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

OR

À partir d'une zone de texte.

textbox.text.RunCMD(WaitForProcessComplete:=True)


Les méthodes d'extension devront être placées dans un module public et porter l'attribut <Extension> Sur le sous-module. Vous voudrez également ajouter Imports System.Runtime.CompilerServices En haut de votre fichier de code.

Il y a beaucoup d'informations sur SO sur les méthodes d'extension si vous avez besoin d'aide supplémentaire.


Méthode d'extension

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
4
Fütemire
Sub systemcmd(ByVal cmd As String)
    Shell("cmd /c """ & cmd & """", AppWinStyle.MinimizedFocus, True)
End Sub
2
Bernardo Ravazzoni
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

Ça marche aussi

0
vincent