如何从VB.NET运行DOS/CMD/命令提示符命令?

17

这个问题很明确。如果代码只有一行最好(可能与“Process.Start("...")”有关?)。我查阅了网络,但只找到旧的例子和不起作用的例子(至少对我是这样)。我想在我的类库中使用它来运行Git命令(如果有帮助的话?)。


1
也许可以从简单的Process.Start("C:\Windows\System32\MSPaint.exe")开始尝试,然后再尝试Git命令,我想它们会更难,因为有很多额外的命令行参数。另一个有用的提示是阅读StandardError以帮助您找出问题所在,这里的答案是一个完美的例子:https://dev59.com/2nE85IYBdhLWcg3wkkfK - Jeremy Thompson
5个回答

24

你可以尝试这种方法:

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 后评估其错误级别(errorlevel),如果退出代码(errorlevel)为 0,才执行命令 B。
  • A || B → 执行命令 A,评估此命令的退出代码,如果其退出代码不为 0,则仅执行命令 B。

你好!我使用了这段代码(https://gist.github.com/2465024),当我运行你的命令(我将名称更改为“runCommand”并使用它-所以这不是问题!)时,我得到一个“引用非共享成员需要对象引用。”错误。有任何想法吗? - user1072207
顺便提一下,当它在同一个类中时它是有效的,但是我将它用在了一个类库中,然后将其导入到我的Windows Forms项目中。有什么想法为什么它不起作用? - user1072207
另外,有没有一种同时运行多个命令的方法。类似于“隐藏cmd,运行第一个命令,隐藏cmd,运行第二个命令,显示cmd。” - user1072207
对于类库问题:当然,在类库内,如果你想在不创建实例的情况下使用,你需要声明方法为Shared。我会编辑答案。 - Steve

17

你可以尝试这个方法来运行命令,然后cmd退出。

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

您可以尝试此方法来运行命令,并让cmd等待更多命令。

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

6
我受到Steve的回答的启发,但想要增加一些亮点。我喜欢提前编写扩展方法,这样以后调用方法时就会少做一些工作。
例如,在下面修改过的Steve的答案中,不是像这样调用... MyUtilities.RunCommandCom("DIR", "/W", true) 我实际上可以直接在我的字符串中键入命令并调用它,像这样... 直接在代码中。 Call "CD %APPDATA% & TREE".RunCMD() 或者 从变量中。
Dim MyCommand = "CD %APPDATA% & TREE"
MyCommand.RunCMD()

OR

来自文本框。

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

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

0
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

这也可以正常工作


2
不是我的答案,也不是说这是或不是一个好的答案,但如果你要点踩,请解释一下为什么。让其他人知道为什么这不被认为是一个好的解决方案是有益的。 - Fütemire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接