Считывание выходных данных консоли для записи журнала ошибок VB

#vb.net #visual-studio-2010

#vb.net #visual-studio-2010

Вопрос:

Я запускаю некоторые команды на компьютерах, и я хотел бы, чтобы они выводили отдельный текстовый файл, если команда не может быть выполнена.

 For Each strUserName As String In strLines
        Dim ReplaceCommand As String = sCommand.Replace("*", strUserName).Replace("$$$", saveFileDialog3.FileName amp; ".txt").Replace("###", exeSearch)
        Shell("cmd.exe /c" amp; 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
  

Я на правильном пути? Я получаю выходные данные в текстовый файл, но в нем всего одна строка, в которой всегда написано «ПРОЙТИ».

Ответ №1:

Несколько вещей: вы создаете новый StreamWriter каждый раз, когда хотите записать в него строку, вместо того, чтобы создавать его, а затем просто записывать в него, когда вам нужно. Вы все еще используете оболочку, которая действительно базовая и не совсем подходит для того, что вам нужно. Вы действительно должны использовать для этого процесс.

Я написал функцию для вас, чтобы использовать ее для выполнения процесса вместо использования командной оболочки, которая вернет выходные данные от выполнения команды в переменную ConsoleOutput, которую вы затем можете проверить на наличие выходных строк.

Наконец, вы должны использовать String.Форматируйте вместо 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"
  

Поэтому измените приведенное ниже значение в соответствии с требованиями, в частности переменную 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