Написание команд в cmd с помощью Visual Basic - PullRequest
0 голосов
/ 22 октября 2011

Я использую VirtualBox для подключения USB-устройства. Это USB-устройство работает только под 32 бит. Мой хост ОС - Windows 7 64 бит, мой Гость Windows 7 32 бит.

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

Есть идеи, как мне решить эту проблему?

Public Class Form1
    Private Results As String
    Private test As Double
    Private test2 As String

    'The "Delegate" is used to correct the threading issue (Can't update control directly in VB.net 08/10), and invokes the needed text
update.
    Private Delegate Sub delUpdate()
    Private Finished As New delUpdate(AddressOf UpdateText)

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

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        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

        'Starts the CMD Prompt
        StartInfo.FileName = "cmd.exe"
        StartInfo.RedirectStandardInput = True
        StartInfo.RedirectStandardOutput = True

        'Required to redirect
        StartInfo.UseShellExecute = False

        'Disables the creation of a CMD Prompt outside application.
        StartInfo.CreateNoWindow = False


        myprocess.StartInfo = StartInfo
        myprocess.Start()
        Dim SR As System.IO.StreamReader = myprocess.StandardOutput
        Dim SW As System.IO.StreamWriter = myprocess.StandardInput

        'Runs the command you entered...
        'SW.WriteLine(TextBox1.Text)
        SW.WriteLine("cd C:\Program Files\Oracle\VirtualBox")
        SW.WriteLine("vboxmanage list usbhost")
        'Exits CMD Prompt 
        'SW.WriteLine("exit")

        'Displayes the results...
        Results = SR.ReadToEnd
        'Im reading the string out to get the right Device id
        test = InStr(Results, "0x0547", CompareMethod.Text)
        test = test - 58
        test2 = Mid(Results, test, 36)
        'test2 gives 80be0bc1-6f69-4886-868f-c8857bff34c1
        'this is the right id, if i try to input it myselves with:
        'C:\Program Files\Oracle\VirtualBox>vboxmanage controlvm "test" usbattach
        '80be0bc1-6f69-4886-868f-c8857bff34c1
        'it works...

        SW.WriteLine("vboxmanage controlvm " + Chr(34) + "test" + Chr(34) + "usbattach " + test2)
        SW.WriteLine("exit")
        Results = SR.ReadToEnd
        SW.Close()
        SR.Close()

        'Invokes Finished delegate, which updates textbox with the results text
        Invoke(Finished)
    End Sub

End Class

1 Ответ

0 голосов
/ 22 октября 2011

Я думаю, что ReadToEnd не завершится, потому что командное окно все еще открыто. Я бы выполнил половину ваших команд и затем прочитал их после вызова команды EXIT. Затем вам просто нужно проанализировать строку результата и запустить другой процесс командной строки.

...