Vb.net 实时控制台重定向问题

Vb.net 实时控制台重定向问题,vb.net,real-time,console-redirect,Vb.net,Real Time,Console Redirect,首先,我确实花了相当长的时间试图找到我的问题的答案,但到目前为止,什么都没有 问题就在这里。 我必须运行带有参数的cli命令,并将输出(实时)重定向到文本框。 该命令将如下所示: smcli-n name-f“script.scr” 由于smcli不在系统路径变量中,我首先需要转到右边的目录 因此,我最终运行的完整命令如下所示: cmd/c cd“c:\ProgramFiles(x86)\bla\”和&smcli-n name-f“script.scr” 我会在一秒钟内完成代码,但基本上,一切正

首先,我确实花了相当长的时间试图找到我的问题的答案,但到目前为止,什么都没有

问题就在这里。 我必须运行带有参数的cli命令,并将输出(实时)重定向到文本框。 该命令将如下所示: smcli-n name-f“script.scr”

由于smcli不在系统路径变量中,我首先需要转到右边的目录

因此,我最终运行的完整命令如下所示: cmd/c cd“c:\ProgramFiles(x86)\bla\”和&smcli-n name-f“script.scr”

我会在一秒钟内完成代码,但基本上,一切正常,我找到正确的目录,运行命令,它运行脚本,一切正常

我试图将输出重定向到另一个表单,但结果根本不起作用;无论如何,这将是一个额外的问题

但问题是,当脚本运行时,它会一步一步地说明它正在做什么,并将该信息发送到输出(即恢复名称、恢复磁盘配置等)

正如我所说,我确实得到了所有这些输出……一旦一切都完成(即,在5分钟明显冻结后)。 我没有将输出重定向到文本框(即保持控制台窗口打开),而是实时获取输出

下面是代码(有一点,抱歉):

除了命令本身,其他一切都来自研究,它们只是放在一起,一方面是运行命令的方式,另一方面是重定向

我相信问题出在我的指挥上(看起来这部分很合理)

要么我可以用另一种方式(同样,它可以工作,但不是实时的),要么我错过了一些琐碎的事情

谢谢你的帮助

以下是更新后的代码:

Private Sub MainForm_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
    copyrightlbl.Focus()
    wait(1000)
    Await RunCommandCom("", "192.168.219.152", False) '172.16.1.55
    CmdCloseBtn.Enabled = True
End Sub

Private Async Function RunCommandCom(command As String, arguments As String, permanent As Boolean) As Task(Of Int32)
    TextBox1.Text = "Communication in progress..." & vbCrLf
    exitcodelbl.Text = ""
    CmdCloseBtn.Enabled = False
    ToolStrip1.Enabled = False
    CmdOutputPanel.Visible = True

    Dim p As Process = New Process()
    With p.StartInfo
        .WorkingDirectory = Environment.GetEnvironmentVariable("ProgramFiles") & "\Dell\MD Storage Manager\client\" 'Directory for SMcli.exe"
        .FileName = "ping.exe"
        .Arguments = command + " " + arguments
        .CreateNoWindow = True
        .UseShellExecute = False
        .RedirectStandardOutput = True
        .RedirectStandardError = True
    End With

    p.Start()

    Do Until p.HasExited
        TextBox1.Text &= Await p.StandardOutput.ReadLineAsync
    Loop
    exitcodelbl.Text = p.ExitCode
    Return p.ExitCode
End Function

尝试直接将输出读取到文本框,而不是使用委托。进程的
StandardOutput
属性是一个流,您可以使用ReadLineAsync方法获取输出。像这样的方法应该会奏效:

pi.CreateNoWindow = True
pi.UseShellExecute = False
pi.RedirectStandardOutput = True
pi.RedirectStandardError = True
p.StartInfo = pi
p.Start()

Do Until p.HasExited
   TextBox1.Text &= Await p.StandardOutput.ReadLineAsync
Loop
Intellisense将提示您使子例程异步,但这样您就可以获得所需的输出

Private Async Function RunCommandCom(command As String, arguments As String, permanent As Boolean) As Task(Of Int32)


Await RunCommandCom("", "192.168.219.152", False) 

如果脚本是要在控制台中运行的,你不能在它自己的控制台中运行它而不是使用cmd控制台吗?谢谢你的回复。我可能不能,因为1)我必须从特定路径运行命令,因此必须首先导航到该路径;2)基于cli的应用程序不在Windows的路径变量中(不,我不能添加它,因为我会更改Windows配置,这是完全不可以的)您可以在Filename属性中设置可执行文件的整个路径。无需尝试使用路径或在任何地方导航。如果可执行文件需要一个特定的工作目录,那么在startInfo属性中也设置它,这有助于我不再需要运行命令1&&command2。这显然是向前迈出的一步。我还尝试使用pi.FileName=“ping.exe”和pi.Arguments=“192.168.0.1”。它按预期在我的文本框中生成输出,但仍然不是实时的。有什么建议吗?事实上,我知道了:错误'Await'只能在异步方法中使用。考虑将此方法标记为“AsiNC”修饰符,并将其返回类型改为“任务(整数)”。请原谅我的无知,但如何处理它。再次尝试查找,但不理解我正在阅读的内容,因为它的工作方式超出了我的知识范围。Async修饰符在函数或子关键字之前。很抱歉,但你们把我弄丢了-(我添加了一个异步修饰符的位置示例。这对我来说是未知的。我四处寻找示例,发现了以下问题:复制/粘贴了被认为是有效的代码,我在这一行得到了一个错误:
Dim pingStatus As String=wait pingStatusTask
,错误为“等待”只能在异步方法中使用。考虑用“AsiNC”修饰符标记该方法,并将其返回类型改为“整数的任务”,“我没有得到它……”
Private Async Function RunCommandCom(command As String, arguments As String, permanent As Boolean) As Task(Of Int32)


Await RunCommandCom("", "192.168.219.152", False)