[VB.NET] CMD window tekst lezen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Mavamaarten
  • Registratie: September 2009
  • Laatst online: 13:17

Mavamaarten

Omdat het kan!

Topicstarter
Hallo medetweakers,

Vandaag kwam ik op het idee om een simpel programma te maken om mijn local minecraft server te bedienen. (hij draait op CraftBukkit)
Commands uitvoeren is geen probleem. Ik kan gewoon sendkeys gebruiken omdat er toch niks anders op de server draait. Het enige probleem waar ik tegenaanloop is hoe ik dingen uit de console kan uitlezen.

Simpel voorbeeld : online spelers weergeven
Command in console : "list".
Wat je dan terugkrijgt is dit : "12:23:34 [INFO] Connected players:" en hieronder de online spelers.

Hoe kan ik dit uitlezen ?
Als ik op google zoek vind ik niet veel, behalve een vuile manier om via cmd (en een .bat file)een nieuwe applicatie uit te lezen. De server moet wel blijven lopen. Ik zou dus eigenlijk een soort van cmd hook moeten hebben.

Alvast bedankt,
Mavamaarten.

Android developer & dürüm-liefhebber


Acties:
  • 0 Henk 'm!

  • SpamLame
  • Registratie: Augustus 2000
  • Laatst online: 12-09 21:15

SpamLame

niks

Je zou sceen scraping kunnen gebruiken Wikipedia: Screen scraping

Acties:
  • 0 Henk 'm!

  • Mavamaarten
  • Registratie: September 2009
  • Laatst online: 13:17

Mavamaarten

Omdat het kan!

Topicstarter
Ja, dat probeer ik te doen maar het lukt me niet. Ik ben momenteel in vb.net aan het experimenteren of ik daar niet verder mee kom, maar momenteel blijft mijn textbox leeg :/

EDIT: Momenteel krijg ik niet de return te zien (wel telkens als hij iets returnt een ">") maar wel wat ik typ :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
>
>
>
>
>
>
>list
>
>
>
>
>
>
verschijnt er in mijn textbox nadat ik in de server "list" typte :/

EDIT2: Dit lijkt verdacht veel op wat mijn probleem is. Ik heb ook een java server, en ik lees ook alles uit met Process.StartInfo.RedirectStandardOutput. Ik snap alleen niet waarom ik alleen maar ">"s terugkrijg :-(

EDIT3: Na een tijdje ben ik erachter gekomen dat heel wat programma's (waaronder dus java) niet outputten met gewoon StandardOutput (wat logisch zou zijn), maar met "StandardError". Nu doet hij het :D

[ Voor 79% gewijzigd door Mavamaarten op 20-03-2011 19:59 ]

Android developer & dürüm-liefhebber


Acties:
  • 0 Henk 'm!

  • Mavamaarten
  • Registratie: September 2009
  • Laatst online: 13:17

Mavamaarten

Omdat het kan!

Topicstarter
Hmm, nu loop ik toch weer tegen een ander probleem 8)7
Even voor de duidelijkheid, ik gebruik nu VB.NET !!

Ik heb nu deze code :
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Dim process2 As New Process
        process2.StartInfo.FileName = "java"
        process2.StartInfo.Arguments = "-Xms1024M -Xmx1024M -jar craftbukkit.jar"
        process2.StartInfo.WorkingDirectory = "C:\Users\Maarten\Desktop\Minecraft"
        process2.StartInfo.UseShellExecute = False
        process2.StartInfo.ErrorDialog = False
        process2.StartInfo.CreateNoWindow = False
        process2.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
        process2.StartInfo.RedirectStandardInput = True
        process2.StartInfo.RedirectStandardOutput = True
        process2.StartInfo.RedirectStandardError = True
        process2.Start()
        Dim d2 As StreamReader = process2.StandardError
        Dim w2 As StreamWriter = process2.StandardInput
        Do Until process2.HasExited
            Application.DoEvents()
            Dim s2 As String = d2.ReadLine
            If s2 <> "" Then
                If InStr(s2, "Connected players:") > 0 Then
                    nigger = s2
                    BackgroundWorker1.ReportProgress(0)
                    BackgroundWorker1.ReportProgress(1)
                    Application.DoEvents()
                ElseIf InStr(s2, "logged in") > 0 Then
              --->  w2.WriteLine("list" & vbCrLf)  <---
              --->  w2.Flush()                     <---
                Else
                    nigger = s2
                    BackgroundWorker1.ReportProgress(0)
                    BackgroundWorker1.ReportProgress(3)
                End If
            End If
            Application.DoEvents()
        Loop
        process2.WaitForExit()


Bij het aangeduide deel moet hij "list" writen naar de server, en bevestigen met enter. De flush deed ik maar voor de zekerheid, ik las ergens dat dit diende om de stream werkelijk te schrijven. Maar het vreemde is... er gebeurt niets ? Heeft iemand hier al eerder mee gewerkt, en kan me uitleggen hoe ik "list" doorstuur naar de console window en bevestig met enter (no sendkeys graag...) ?

Android developer & dürüm-liefhebber


Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 10:25
Flush, of beter Close moet eigenlijk pas opvragen wanneer je klaar bent met lezen. Behalve wanneer je tussendoor moet flushen omdat je buffer (en dus geheugen) daarmee te groot wordt. Zie ook hiervoor de MSDN documentatie!

Acties:
  • 0 Henk 'm!

  • TallManNL
  • Registratie: Oktober 2005
  • Laatst online: 08-09 11:05
Is er een bepaalde reden dat je d2 naar StandardError wijst i.p.v. StandardOutput?

Heb je eigenlijk al gekeken wat je input op je ReadLine is? Simpelweg met een
Visual Basic .NET:
1
Debug.Output("Read line: '{0}'", s2)

geheelonthouder met geheugenverlies


Acties:
  • 0 Henk 'm!

  • Styxxy
  • Registratie: Augustus 2009
  • Laatst online: 12-09 15:22
TallManNL schreef op maandag 21 maart 2011 @ 00:11:
Is er een bepaalde reden dat je d2 naar StandardError wijst i.p.v. StandardOutput?
Zie:
Mavamaarten schreef op donderdag 10 maart 2011 @ 18:49:
EDIT3: Na een tijdje ben ik erachter gekomen dat heel wat programma's (waaronder dus java) niet outputten met gewoon StandardOutput (wat logisch zou zijn), maar met "StandardError". Nu doet hij het :D

Acties:
  • 0 Henk 'm!

  • Mavamaarten
  • Registratie: September 2009
  • Laatst online: 13:17

Mavamaarten

Omdat het kan!

Topicstarter
@Styxxy: inderdaad. Daarom werkte mijn programma de hele tijd niet. Nu werkt dit deel wel, maar wil ik commando's naar de server passeren. Volgens mij moet er nog bevestigd worden met enter, alleen heb ik geen idee hoe (nu heb ik vbcrlf getest maar dit doet niet veel...)

Iemand een idee hoe je hiermee commando's naar cmd.exe (of in dit geval java.exe) zend met die streamwriter

EDIT: Blehh, in CMD werkt dit wel gewoon :
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Dim process2 As New Process
        process2.StartInfo.FileName = "cmd"
        process2.StartInfo.Arguments = ""
        process2.StartInfo.WorkingDirectory = "C:\Users\Maarten\Desktop\"
        process2.StartInfo.UseShellExecute = False
        process2.StartInfo.ErrorDialog = False
        process2.StartInfo.CreateNoWindow = False
        process2.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
        process2.StartInfo.RedirectStandardInput = True
        process2.StartInfo.RedirectStandardOutput = True
        process2.StartInfo.RedirectStandardError = True
        process2.Start()
        Dim d2 As StreamReader = process2.StandardOutput
        process2.StandardInput.WriteLine("echo WERK AUB !")
        Do Until process2.HasExited
            Application.DoEvents()
            Dim s2 As String = d2.ReadLine
            If s2 <> "" Then
                TextBox1.Text += s2 & vbCrLf
            End If
            Application.DoEvents()
        Loop
        process2.WaitForExit()


Hij echo't netjes "WERK AUB !"... Dus java doet gewoon lastig. Ik ben nu aan het testen met SendMessage (waarmee ik al naar consoles kon senden, maar enkel moet ik de handle van de zwarte textbox nog weten te vinden.... als die al bestaat...)

Edit: UHHH ! Spy++ vertelt me droogjes dat er niet op dat venster kan worden gespied. Ik probeer nu met cmd.exe --> java.exe. Hopelijk kan hij wel die output spyen (input redirecten kan er wel mee !)

[ Voor 68% gewijzigd door Mavamaarten op 21-03-2011 17:36 ]

Android developer & dürüm-liefhebber


Acties:
  • 0 Henk 'm!

  • Mavamaarten
  • Registratie: September 2009
  • Laatst online: 13:17

Mavamaarten

Omdat het kan!

Topicstarter
Sorry, maar ik heb effe zin om te bumpen.
Wat ik ook probeer, alles blijkt gewoon te werken in CMD.exe (zoals process.standardinput.writeline) maar doet niets in Java. Iemand een idee hoe ik dit kan doen ? Ik heb al zooo veel geprobeerd :-(

Android developer & dürüm-liefhebber


Acties:
  • 0 Henk 'm!

  • TallManNL
  • Registratie: Oktober 2005
  • Laatst online: 08-09 11:05
bron m.b.t.
Visual Basic .NET:
1
        process2.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
The hidden window style. A window can be either visible or hidden. The system displays a hidden window by not drawing it. If a window is hidden, it is effectively disabled. A hidden window can process messages from the system or from other windows, but it cannot process input from the user or display output.
Misschien dat java daar anders mee omgaat dan cmd?

geheelonthouder met geheugenverlies

Pagina: 1