Vb.net 实时控制台重定向问题
首先,我确实花了相当长的时间试图找到我的问题的答案,但到目前为止,什么都没有 问题就在这里。 我必须运行带有参数的cli命令,并将输出(实时)重定向到文本框。 该命令将如下所示: smcli-n name-f“script.scr” 由于smcli不在系统路径变量中,我首先需要转到右边的目录 因此,我最终运行的完整命令如下所示: cmd/c cd“c:\ProgramFiles(x86)\bla\”和&smcli-n name-f“script.scr” 我会在一秒钟内完成代码,但基本上,一切正常,我找到正确的目录,运行命令,它运行脚本,一切正常 我试图将输出重定向到另一个表单,但结果根本不起作用;无论如何,这将是一个额外的问题 但问题是,当脚本运行时,它会一步一步地说明它正在做什么,并将该信息发送到输出(即恢复名称、恢复磁盘配置等) 正如我所说,我确实得到了所有这些输出……一旦一切都完成(即,在5分钟明显冻结后)。 我没有将输出重定向到文本框(即保持控制台窗口打开),而是实时获取输出 下面是代码(有一点,抱歉): 除了命令本身,其他一切都来自研究,它们只是放在一起,一方面是运行命令的方式,另一方面是重定向 我相信问题出在我的指挥上(看起来这部分很合理) 要么我可以用另一种方式(同样,它可以工作,但不是实时的),要么我错过了一些琐碎的事情 谢谢你的帮助 以下是更新后的代码: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” 我会在一秒钟内完成代码,但基本上,一切正
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)