【问题标题】:How to run DOS/CMD/Command Prompt commands from VB.NET?如何从 VB.NET 运行 DOS/CMD/命令提示符命令?
【发布时间】:2012-05-02 22:36:05
【问题描述】:

这个问题是不言自明的。如果代码只有一行,那就太好了(与“Process.Start("...")”有关?)。我研究了网络,但只发现了旧的例子和那些不起作用的例子(至少对我来说)。我想在我的类库中使用它来运行 Git 命令(如果有帮助?)。

【问题讨论】:

  • 也许从 Process.Start("C:\Windows\System32\MSPaint.exe") 开始简单 - 然后一旦你开始尝试 Git 命令,我想所有额外的命令行参数。另一个帮助您找出问题的有用提示是阅读 StandardError,这里的答案是一个完美的例子:stackoverflow.com/questions/2709198/…

标签: vb.net cmd command


【解决方案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。
  • 一个 | B → 执行命令 A,并将它的所有输出重定向到 命令 B 的输入。
  • A && B → 执行命令A,运行后判断errorlevel 命令A,如果退出代码(errorlevel)为0,才执行 命令 B。
  • 一个 || B → 执行命令A,判断该命令的退出码 如果不是 0,则只执行命令 B。

【讨论】:

  • 您好!我使用了这段代码 (gist.github.com/2465024),当我运行您的命令时(我将名称更改为“runCommand”并使用了它 - 所以这不是问题!),我收到“Reference to a non-shared member requires an object reference.”错误。任何想法为什么?
  • 顺便说一句,当它在同一个类中时它可以工作,但是我在一个类库中使用它,我将它导入到我的 Windows 窗体项目中。任何想法为什么它不起作用?
  • 另外,有没有办法一次运行多个命令。类似“Hide cmd, run first command, hide cmd, run second command, show cmd.”。
  • 对于类库问题:是的,当然,在类库内部,如果要在不创建实例的情况下使用,则需要声明Shared方法。我将编辑答案。
【解决方案2】:

你可以试试这个来运行命令然后cmd退出

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

你可以试试这个来运行命令并让cmd等待更多命令

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

【讨论】:

    【解决方案3】:

    Steve 的回答启发了我,但我想我会为它添加一些闪光点。 我喜欢在编写扩展方法之前先做这些工作,所以以后调用该方法的工作就更少了。

    例如,使用下面史蒂夫答案的修改版本,而不是拨打这个电话......

    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
        

        这个也可以

        【讨论】:

        • 不是我的答案,也不是说这是或不是一个好的答案,但如果你投反对票,请解释原因。知道为什么这不是一个好的解决方案会让其他人受益。
        猜你喜欢
        • 1970-01-01
        • 2013-06-07
        • 2021-11-20
        • 2013-04-16
        • 2023-04-03
        • 2010-11-30
        • 2016-06-17
        相关资源
        最近更新 更多