Подтвердить что ты не робот

Как запустить команды DOS/CMD/Command Prompt из VB.NET?

Вопрос не требует пояснений. Было бы здорово, если бы код был длиной в одну строку (что-то вроде "Process.Start("...")"?). Я исследовал Интернет, но нашел только старые примеры и такие, которые не работают (по крайней мере для меня). Я хочу использовать это в своей библиотеке классов для запуска команд Git (если это помогает?).

4b9b3361

Ответ 1

Вы можете попробовать этот метод:

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

вызовите, например, следующим образом:

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

РЕДАКТИРОВАТЬ: Для нескольких команд в одной строке ключом являются и | && и || командные коннекторы

  • A и B → выполните команду A, затем выполните команду B.
  • A | B → выполнить команду A и перенаправить все ее вывод в ввод команды B.
  • A && B → выполнить команду A, оценить уровень ошибок после запуска Команда A, и если код выхода (уровень ошибок) равен 0, только затем выполните команда B.
  • A || B → выполнить команду A, оценить код выхода этой команды и если это ничего, кроме 0, только тогда выполните команду B.

Ответ 2

Вы можете попробовать эту команду для запуска Затем cmd Выход

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

Вы можете попробовать это запустить команду и cmd ждать дополнительных команд

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

Ответ 3

Я был вдохновлен ответом Стива, но думал, что добавлю к нему немного вспышки. Мне нравится делать работу перед написанием методов расширения, поэтому позже у меня меньше работы, чтобы вызвать метод.

Например, с измененной версией ответа Стива ниже, вместо того, чтобы делать этот вызов...

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

Я могу просто набрать команду и вызвать ее из моих строк, как это...

Непосредственно в коде.

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

ИЛИ

Из переменной.

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

ИЛИ

Из текстового поля.

textbox.text.RunCMD(WaitForProcessComplete:=True)


Методы расширения должны быть размещены в общедоступном модуле и нести атрибут <Extension> поверх юга. Вы также захотите добавить Imports System.Runtime.CompilerServices в начало вашего файла кода.

Там много информации о SO о методах расширения, если вам нужна дополнительная помощь.


Метод расширения

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

Sub systemcmd(ByVal cmd As String)
    Shell("cmd /c """ & cmd & """", AppWinStyle.MinimizedFocus, True)
End Sub

Ответ 5

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

Это также работает

Ответ 6

Я не понял из предоставленного решения, почему /W добавляется к аргументам?

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