如何解决Reading Console输出以写出错误日志VB
| 我在计算机上运行一些命令,如果命令无法运行,我希望它们输出单独的文本文件。For Each strUserName As String In strLines
Dim ReplaceCommand As String = sCommand.Replace(\"*\",strUserName).Replace(\"$$$\",saveFileDialog3.FileName & \".txt\").Replace(\"###\",exeSearch)
Shell(\"cmd.exe /c\" & ReplaceCommand,AppWinStyle.Hide,True,)
\' If Command Cannot Execute,List Why and Move onto Next Command
Using swrr As New StreamWriter(File.Open(ErrorLog,FileMode.OpenOrCreate))
If Console.Readline = \"blahblah\" Then swrr.WriteLine(\"FAIL\") Else swrr.WriteLine(\"PASS\")
End Using
Next
我在正确的轨道上吗?我正在将输出输出到文本文件,但仅一行回答总是显示PASS。
解决方法
有几件事情:您每次要向其写入一行时都在创建一个新的StreamWriter,而不是创建一个,而是在需要时仅对其进行写入。您仍在使用shell,它实际上是非常基本的,并不真正适合您的需求。您确实应该为此使用一个过程。
我已经为您编写了一个函数来执行该过程,而不是使用Shell,该函数会将命令执行的输出返回到ConsoleOutput变量,然后您可以检查该变量以查找输出字符串。
最后,您应该使用String.Format而不是replace来创建要运行的命令的正确字符串。例如:
Dim FirstName As String = \"Jay\"
Dim Age As String = \"twenty\"
Dim Greeting As String = String.Format(\"Hello {0},I know you\'re {1} years old\",FirstName,Age)
\' Greetings value would be \"Hello Jay,I know you\'re twenty years old\"
因此,请使用STRING.FORMAT函数来调整以下内容以使其适合特定的Args变量:)
Sub DoWork()
Dim ConsoleOutput As String = String.Empty
Using swrr As New StreamWriter(ErrorLog,True)
For Each strUserName As String In StrLines
ConsoleOutput = GetCMDOuput(strUserName,saveFileDialog3.FileName,exeSearch)
\' If Command Cannot Execute,List Why and Move onto Next Command
If ConsoleOutput = \"blahblah\" Then swrr.WriteLine(\"FAIL\") Else swrr.WriteLine(\"PASS\")
Next
End Using
End Sub
Function GetCMDOuput(ByVal strUserName As String,ByVal strFileName As String,ByVal strExeSearch As String) As String
Dim Args As String = String.Format(\"/c -paramzero {0} -paramone {1} -paramtwo {2}\",strUserName,strFileName,strExeSearch)
Dim CMD As New Process
CMD.StartInfo.FileName = \"cmd.exe\"
CMD.StartInfo.Arguments = Args
CMD.StartInfo.UseShellExecute = False
CMD.StartInfo.RedirectStandardInput = True
CMD.StartInfo.RedirectStandardOutput = True
CMD.StartInfo.CreateNoWindow = True
CMD.Start()
Dim retval As String = CMD.StandardOutput.ReadToEnd
CMD.WaitForExit()
Return retval
End Function