【问题标题】:Get data from cmd, split the values and insert them into textboxes从 cmd 获取数据,拆分值并将它们插入到文本框中
【发布时间】:2017-12-30 13:22:15
【问题描述】:

我正在尝试从 cmd 读取电池信息。如何提取每个值并将它们放入各自的文本框中,如下图所示?

这是我的代码:

Private Results As String
Private Delegate Sub delUpdate()
Private Finished As New delUpdate(AddressOf UpdateText)

Private Sub UpdateText()
    TextBox11.Text = Results
End Sub

Private Sub batt_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim CMDThread As New Threading.Thread(AddressOf CMDAutomate)
    CMDThread.Start()
End Sub

Private Sub CMDAutomate()
    Dim myprocess As New Process
    Dim StartInfo As New System.Diagnostics.ProcessStartInfo
    StartInfo.FileName = "cmd" 'starts cmd window
    StartInfo.RedirectStandardInput = True
    StartInfo.RedirectStandardOutput = True
    StartInfo.UseShellExecute = False 'required to redirect
    StartInfo.CreateNoWindow = False 'creates no cmd window
    myprocess.StartInfo = StartInfo
    myprocess.Start()
    Dim SR As System.IO.StreamReader = myprocess.StandardOutput
    Dim SW As System.IO.StreamWriter = myprocess.StandardInput
    SW.WriteLine("adb shell dumpsys battery") 'the command you wish to run.....
    SW.WriteLine("exit") 'exits command prompt window
    Results = SR.ReadToEnd 'returns results of the command window
    SW.Close()
    SR.Close()
    'invokes Finished delegate, which updates textbox with the results text
    Invoke(Finished)
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim value As String = TextBox11.Text
    Dim topic_start As String = topic_start = value.LastIndexOf("AC Powered:") + 1
    Dim topic As String = value.Substring(topic_start, value.Length - topic_start)
    TextBox1.Text = topic.ToString
End Sub

Button1 在图片中标记为Get Battery Information

【问题讨论】:

  • 您可能想展示这些数据是如何进入文本框的。但是,您只需要使用 VbCrLf 作为分隔符 .Split() TextBox.Text。
  • 到目前为止你写了什么代码?我们不能简单地为您编写完整的代码
  • 所有相关信息都应发布在问题中,而不是链接到其他网站。
  • 那么您已有的代码有什么问题?运行时会发生什么/不会发生什么?
  • 你需要那个文本框吗?据我所知,您想在用户按下按钮时填写这些“字段”。如果是这样,您需要将那些在 Results 返回的值存储在 List() 或 Array() 中,然后根据需要用该 List/Array 的项目填充文本框/标签。

标签: vb.net


【解决方案1】:
 Private Sub UpdateText()
  Dim xList As New List(Of KeyValuePair(Of String, String))
    Results = Results.Replace(vbLf, "")
    Dim LineSplit() As String = Results.Split(vbCr)
    For Each xLine As String In LineSplit
        If xLine <> "" Then
            xList.Add(New KeyValuePair(Of String, String)(xLine.Split(":")(0), xLine.Split(":")(1).Trim.Replace(" ", "")))
        End If
    Next
'do some work here to put the values in the right textboxes

End Sub

您可以让自己成为一个自定义控件,由您在应用中使用的标签和文本框组成。然后,您只需将列表的每个条目传递给您的自定义控件。使添加或删除字段变得更容易,而无需大量的 IF then 或大的 Select Case

【讨论】:

  • 你能给我一些帮助吗?在这里做一些工作,把值放在正确的文本框中?我不明白。
【解决方案2】:

这是一种使用IndexOf()Substring() 方法和Length 属性从用换行符(Enviroment.NewLine) 分隔的文本中提取值的方法:

Private Sub UpdateGUI()
    Dim lines As String() = TextBox1.Text.Split(New String() {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)

    For Each itm In lines
        MsgBox(itm.Substring(itm.IndexOf(":") + 1, itm.Length - itm.IndexOf(":") - 1))
    Next
End Sub

【讨论】:

  • 一个不错的、简短的、简洁的解决方案!我正在考虑使用Regex 写一个答案,但它可能变得太复杂了。
  • 也许StringSplitOptions.RemoveEmptyEntries 在这里更温和一些。只是为了预防。
  • @Jimi 我想最好使用StringSplitOptions.RemoveEmptyEntries, tnx。
【解决方案3】:

除非您的 TextBoxes 的名称与返回字符串中的值完全相同(无论如何您都必须将空格转换为其他字符),否则除了手动编码每种情况外,实际上没有任何方法可以做到这一点。应该这样做,只需相应地更改文本框的名称:

Private Sub UpdateText()
    Dim lines() As String = Results.Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries)
    For Each line In lines
        Dim values() As String = line.Split(":")
        Select Case values(0).ToUpper.Trim
            Case "AC POWERED"
                TextBox1.Text = values(1).ToUpper.Trim
            Case "USB POWERED"
                TextBox2.Text = values(1).ToUpper.Trim
            Case "WIRELESS POWERED"
                TextBox3.Text = values(1).ToUpper.Trim
            Case "STATUS"
                TextBox4.Text = values(1).ToUpper.Trim
            Case "HEALTH"
                TextBox5.Text = values(1).ToUpper.Trim
            Case "PRESENT"
                TextBox6.Text = values(1).ToUpper.Trim
            Case "LEVEL"
                TextBox7.Text = values(1).ToUpper.Trim
            Case "SCALE"
                TextBox8.Text = values(1).ToUpper.Trim
            Case "VOLTAGE"
                TextBox9.Text = values(1).ToUpper.Trim
            Case "TEMPERATURE"
                TextBox10.Text = values(1).ToUpper.Trim
            Case "TECHNOLOGY"
                TextBox11.Text = values(1).ToUpper.Trim
            Case Else
                MessageBox.Show(line, "Unknown Value")
        End Select
    Next
End Sub

如果您以可预测的方式命名您的文本框,那么您可以使用Controls.Find() 并将代码缩短为以下内容。例如,将空格更改为下划线,并在前面添加“txt”:“txtAC_Powered”、“txtUSB_Powered”、“txtStatus”、“txtHealth”等。大小写无关紧要,因为无论如何都会找到匹配项。这意味着您在命名控件时需要手动操作,而不是编写冗长的 select case 语句(或其他内容):

Private Sub UpdateText()
    Dim lines() As String = Results.Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries)
    For Each line In lines
        Dim values() As String = line.Split(":")
        Dim ctlName As String = "txt" & values(0).Replace(" ", "_").Trim
        Dim ctl As Control = Me.Controls.Find(ctlName, True).FirstOrDefault
        If Not IsNothing(ctl) Then
            ctl.Text = values(1).ToUpper.Trim
        End If
    Next
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 2016-06-15
    • 2023-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多