#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