Я пытаюсь разобрать вывод arp.exe, чтобы получить MAC-адрес для компьютера. Я могу разобрать ping.exe и получить IP-адрес, но по какой-то причине arp.exe, похоже, никогда не выходит. Если я удалю аргументы, я выйду почти мгновенно. Если я запускаю команду самостоятельно в командной строке, она выводит результат менее чем за одну секунду. Я не уверен, почему он не работает.Parsing arp.exe - WaitForExit (60000) отключен
Public Function DNSLookup(ByVal dnsName As String)
#If Not Debug Then
Try
#End If
Dim p As New Process
With p.StartInfo
.FileName = "ping.exe"
.Arguments = "-n 1 -4 " + dnsName 'Send 1 echo/packet (-n 1) and force IPv4 (-4)
.CreateNoWindow = True
.RedirectStandardOutput = True
.RedirectStandardError = True
.UseShellExecute = False
End With
p.Start()
If p.WaitForExit(5000) Then
'Find and parse "Reply from xxx.xxx.xxx.xxx: bytes=xx time=xms TTL=xxx"
Dim result As String = p.StandardOutput.ReadToEnd 'Read the result from the command line
Dim i As Integer = result.IndexOf("Reply from ") + 11 '11 is the length of "Reply from "
result = result.Substring(i, result.IndexOf(": bytes=") - i) 'Get the IP from the command line output
Return result
Else
Throw New System.Exception("DNS lookup failed. Timeout exceeded")
End If
#If Not Debug Then
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical)
End Try
#End If
End Function
Public Function GetMACAddress(ByVal dnsName As String)
Dim ip As String = DNSLookup(dnsName)
#If Not Debug Then
Try
#End If
Dim arp As New Process
With arp.StartInfo
.FileName = "arp.exe"
.Arguments = "-a" ' | find " + Chr(34) + ip + Chr(34) 'Example: arp -a | find "192.168.0.1"
.CreateNoWindow = True
.RedirectStandardOutput = True
.RedirectStandardError = True
.RedirectStandardInput = False
.UseShellExecute = False
End With
arp.Start()
If arp.WaitForExit(60000) Then
MsgBox(arp.StandardOutput.ReadToEnd)
Else
Throw New System.Exception("ARP lookup failed. Timeout exceeded")
End If
Return 1 '### TO DO: Return parsed MAC address
#If Not Debug Then
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical)
End Try
#End If
End Function
um .... в вашем первом примере «найти» -комментацию прокомментировал ... вот почему он не работал. Вы даже можете увидеть, что SO окрашивает его в серый цвет, что сразу бросается в глаза ... – specializt
Я прокомментировал это, чтобы выяснить, не вызывает ли это проблемы. Но по какой-то неизвестной причине он все еще не работал, когда просто использовал -a и ничего больше. Однако на следующее утро, когда я снова запустил его, не внося никаких изменений (все еще используя только -а), он работал ... Я не понимаю, почему это произошло: S поместив часть «| find», а затем сразу же сломал ее снова. Использование cmd/c отлично работает с аргументом «| find». – Daniel
Лучше всего называть WINAPI-функции для таких задач, используя команды командной строки и параметры передачи, которые всегда дают неожиданные результаты, а не просто как разрабатывать программное обеспечение в окнах, которое работает только на linux – specializt