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

如何从VB.NET运行DOS/CMD/命令提示符命令?,vb.net,cmd,command,Vb.net,Cmd,Command,这个问题不言自明。如果代码只有一行就好了(与“Process.Start(“…””?)有关)。我研究了一下网络,但只找到了一些旧的例子和不起作用的例子(至少对我来说是这样)。我想在类库中使用它来运行Git命令(如果有帮助的话)。您可以尝试以下方法: Public Class MyUtilities Shared Sub RunCommandCom(command as String, arguments as String, permanent as Boolean)

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

您可以尝试以下方法:

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,运行后评估errorlevel 命令A,如果退出代码(errorlevel)为0,则仅执行 命令B
  • A|B→ 执行命令A,计算该命令的退出代码 如果不是0,则只执行命令B

您可以尝试运行此命令,然后退出
cmd

Process.Start("cmd", "/c YourCode")
您可以尝试运行该命令,并让
cmd
等待更多命令

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

这也行得通

我从史蒂夫的回答中得到了灵感,但我想我应该给它添加一点闪光。 我喜欢在编写扩展方法之前先做一些工作,这样以后调用该方法的工作就更少了

例如,使用下面Steve答案的修改版本,而不是打这个电话

MyUtilities.RunCommandCom(“DIR”,“/W”,true)

实际上,我可以键入命令并从字符串中调用它,就像这样

直接在代码中

调用“CD%APPDATA%&TREE.RunCMD()

从一个变量

从一个文本框

textbox.text.RunCMD(WaitForProcessComplete:=True)


扩展方法需要放在公共模块中,并在子模块上带有
属性。您还需要将
Imports System.Runtime.CompilerServices
添加到代码文件的顶部

如果您需要进一步的帮助,有很多关于扩展方法的信息


扩展方法

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
公共模块扩展
''' 
''扩展方法将字符串作为CMD命令运行。
''' 
'''[String]要运行的命令。
'''[Boolean](默认值:False)选项以显示CMD窗口。
'''[Boolean](默认值:False)选项,用于在退出子进程之前等待CMD进程完成。
''[Boolean](默认值:False)选项,以在命令完成后保持窗口可见。如果ShowWindow为False,则忽略。
Public Sub RunCMD(命令为字符串,可选ShowWindow为Boolean=False,可选WaitForProcessComplete为Boolean=False,可选permanent为Boolean=False)
Dim p As流程=新流程()
作为ProcessStartInfo的Dim pi=新ProcessStartInfo()
pi.Arguments=“”+If(显示窗口并也是永久的,“/K”,““/C”)+”+命令
pi.FileName=“cmd.exe”
pi.CreateNoWindow=不显示窗口
如果显示窗口那么
pi.WindowStyle=ProcessWindowStyle.Normal
其他的
pi.WindowStyle=ProcessWindowStyle.Hidden
如果结束
p、 StartInfo=pi
p、 开始()
如果WaitForProcessComplete,则执行直到p.hasExit:循环
端接头
端模块

也许从Process.start(“C:\Windows\System32\MSPaint.exe”)开始简单-然后,一旦你开始尝试Git命令,我想所有额外的命令行参数都会让你更加困难。另一个帮助你找出错误的有用技巧是阅读StandardError,这里的答案是一个完美的例子:Hello!我使用了此代码(),当我运行您的命令时(我将名称更改为“
runCommand
”并使用了该名称-所以这不是问题!),我得到了“
对非共享成员的引用需要对象引用。
”错误。你知道为什么吗?顺便说一句,它在同一个类中工作,但是我在类库中使用了它,我将它导入了我的Windows窗体项目。你知道为什么它不工作吗?还有,有没有一种方法可以同时运行多个命令。类似于“
Hide cmd,run first command,Hide cmd,run second command,show cmd.
”。对于类库问题:是的,当然,如果要在不创建实例的情况下使用,需要在类库内部声明共享的方法。我将编辑答案。不是我的答案,也不是说这是或不是一个好答案,但如果你否决了投票,请解释原因。了解为什么这不是一个好的解决方案对其他人有利。
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
Dim MyCommand = "CD %APPDATA% & TREE"
MyCommand.RunCMD()
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