VB.net循环ReadLine在一行后停止

时间:2016-02-06 00:18:12

标签: vb.net string loops variables stringreader

好的我遇到了一个试图做循环的问题我有一个包含服务器列表的变量,当我尝试循环它时只循环一次并停止

我在下面的代码中有一部分尝试让您了解我正在做什么,尽管我已经删除了任何可以指向我所在公司的数据。

第一部分代码,从域

获取服务器列表
Dim oStartInfo As New ProcessStartInfo("c:\windows\system32\dsquery.exe", "computer " & cnameodd & oservpath & " -o rdn")
        oStartInfo.UseShellExecute = False
        oStartInfo.RedirectStandardOutput = True
        oStartInfo.RedirectStandardError = True
        oStartInfo.CreateNoWindow = True
        oProcess.StartInfo = oStartInfo
        oProcess.Start()
        Using oStreamReader As System.IO.StreamReader = oProcess.StandardOutput
            sOutput = oStreamReader.ReadToEnd()

sOutPut的输出如下所示(通过debug.write("服务器:"& sOutPut)显示在下面的代码中

"SERVERxafe01"
"SERVERxafe02"
"SERVERxafe03"
"SERVERxafe04"
"SERVERxafe05"
"SERVERxafe06"

然后我试图让输出为每个服务器循环一个命令

If sOutput = "" Then
                    Debug.Write("No Servers Found")
                Else
                    Debug.Write("Servers: " & sOutput)
                    Dim reader As New StringReader(sOutput.Replace(Chr(34), ""))
                    While True
                        Dim line = reader.ReadLine()
                        Debug.Write("Line is" & line)
                        If line IsNot Nothing Then
                            Dim command As String = " user " & user & " /server:" & line
                            Dim pStartInfo As New ProcessStartInfo("c:\windows\sysnative\query.exe", command)
                            pStartInfo.UseShellExecute = False
                            pStartInfo.RedirectStandardOutput = True
                            pStartInfo.RedirectStandardError = True
                            pStartInfo.CreateNoWindow = True
                            pProcess.StartInfo = pStartInfo
                            pProcess.Start()
                            Using pStreamReader As System.IO.StreamReader = pProcess.StandardError
                                sOutput = pStreamReader.ReadToEnd()
                                Debug.Write(sOutput & "Error " & command)
                            End Using
                            Using pStreamReader As System.IO.StreamReader = pProcess.StandardOutput
                                sOutput = pStreamReader.ReadToEnd()
                                Debug.Write(sOutput & "Output" & command)
                                Return sOutput
                            End Using
                        End If
                    End While
                End If
            End Using

在代码中我尝试通过执行debug.write来输出它当前正在处理的行,但是无论何时我运行这个,我只看到使用的第一行sOutPut而没有其他行被循环,所以基本上只输出debug.write(" Line is:"& line)是

Line is : SERVERxafe01

所以我从来没有通过其他服务器>

循环

我只是编写代码来尝试让我的工作更有效率,但是我不认为自己是程序员,因为我很容易感到沮丧并且在专注于代码时接听电话会有点前卫

所以欢迎任何想法,谢谢。

2 个答案:

答案 0 :(得分:0)

尝试替换

    while true
    '
    '
    '
    '
    '
    End While

    Do
    '
    '
    '
    '
    '
    Loop While line <> ""

答案 1 :(得分:0)

在尝试查找更多信息之后,我发现了一篇帖子,显示了退出循环的不同技巧,而不是我想要的东西,但发现了一些东西引起了我的注意力,使用的语句我已经

Return sOutput

退出模块,因此它停止循环

所以通过修改,这现在正在工作,我不得不将返回的政治家放在一个if语句中,这样只有在获得所需的数据时它才会运行返回

  Using oStreamReader As System.IO.StreamReader = oProcess.StandardOutput
        sOutput = oStreamReader.ReadToEnd()
        Dim server = sOutput.Replace(Chr(34), "")
        For Each line As String In server.Split(vbCrLf)
            Dim command As String = " " & user & " /server:" & line.Replace(vbLf, "")
            Dim pStartInfo As New ProcessStartInfo("c:\windows\sysnative\quser.exe", command)
            pStartInfo.UseShellExecute = False
            pStartInfo.RedirectStandardOutput = True
            pStartInfo.RedirectStandardError = True
            pStartInfo.CreateNoWindow = True
            pProcess.StartInfo = pStartInfo
            pProcess.Start()
            Using pStreamReader As System.IO.StreamReader = pProcess.StandardError
                sOutput = pStreamReader.ReadToEnd()
                If sOutput.Contains("SESSIONNAME") = True Then
                    Return "Found on Citrix Server: " & line & vbCrLf & sOutput
                End If
            End Using
            Using pStreamReader As System.IO.StreamReader = pProcess.StandardOutput
                sOutput = pStreamReader.ReadToEnd()
                If sOutput.Contains("SESSIONNAME") = True Then
                    Return "Found on Citrix Server: " & line & vbCrLf & sOutput
                End If
            End Using
        Next
    End Using