Programm mit Befehl aufrufen (und antworten)

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Fakiz.

    Programm mit Befehl aufrufen (und antworten)

    Hallo Comm,

    Wie ich zb den Aufruf des Programmes über die CMD mit einen Parameter auslese weiß ich bereits, meine frage ist nur kann ich auch eine Antwort an die CMD senden?
    ZB. wenn mein Programm aufgerufen wird mit test.exe -say "Hello" wie gesagt das auswerten von der Übergabe habe ich schon und Speicher ich in eine Variable
    möchte jedoch das darauf hin in der CMD eine Zeile drunter "Hello" steht.

    Hoffe man kann verstehen was ich meine, ist dies überhaupt möglich? und wenn ja wie da ich dazu leider nix auf Google gefunden habe ._.
    (Es handelt sich um eine WinForm Anwendung)

    LG Ruerte
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    slice schrieb:

    Console.Write(DeineVariable) bzw. Console.WriteLine(DeineVariable)

    Ist das nicht normal nur die VS Console? Zumindest tut sich nix wenn ich zb: Console.Write("test") im Startevent meiner Anwendung habe in der CMD

    VB.NET-Quellcode

    1. <Global.System.Diagnostics.DebuggerStepThroughAttribute()>
    2. Protected Overrides Sub OnCreateMainForm()
    3. Console.WriteLine("test1")
    4. Console.Write("test2")
    5. Me.MainForm = Global.WindowsApplication7.Form1
    6. End Sub

    LG Ruerte
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Damit schreibst du den Output in einer Konsolenanwendung, was anfangs deine Frage war - Zitat: ...darauf hin in der CMD eine Zeile drunter...
    Und jetzt fängst du mit ner WinForms-Anwendung an, du solltest dich entscheiden was du willst und dann deine Frage nochmals klar formulieren.

    Hab deine letzte Zeile überlesen, also ich weiß nicht wo die Datei in VB.Net ist, aber irgendwo musst du ein Einstiegspunkt in deine Anwendung haben (in C# ist es die Program.cs, dort steht so etwas wie

    C#-Quellcode

    1. static void Main(string[] args)
    2. {
    3. Application.EnableVisualStyles();
    4. Application.SetCompatibleTextRenderingDefault(false);
    5. Application.Run(new FormName());
    6. }

    An der Stelle kannst du dann unterscheiden ob du ins GUI springst oder nur in den Output schreibst.

    C#-Quellcode

    1. static void Main(string[] args)
    2. {
    3. if (args[0] == "FooBar")
    4. {
    5. Console.WriteLine("BarFoo");
    6. }
    7. else
    8. {
    9. Application.EnableVisualStyles();
    10. Application.SetCompatibleTextRenderingDefault(false);
    11. Application.Run(new FormName());
    12. }
    13. }

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „slice“ ()

    Spoiler anzeigen

    slice schrieb:

    Damit schreibst du den Output in einer Konsolenanwendung, was anfangs deine Frage war
    Das war eigentlich nicht meine anfangsfrage O.o Der anfangs Post ist wie du sehen kannst auch nich Editiert also erst lesen :D

    Ruerte schrieb:

    in der CMD eine Zeile

    Ruerte schrieb:

    WinForm Anwendung



    nun zur C# variante von dir, ich habe es mit folgendem getestet:

    C#-Quellcode

    1. namespace WindowsFormsApplication1
    2. {
    3. static class Program
    4. {
    5. /// <summary>
    6. /// Der Haupteinstiegspunkt für die Anwendung.
    7. /// </summary>
    8. [STAThread]
    9. static void Main()
    10. {
    11. Console.WriteLine("BarFoo");
    12. }
    13. }
    14. }


    und das Programm per CMD aufgerufe sehen ich kein Text in der CMD (was mir eigentlich vorher klar war weil wie du auch schön schreibst)

    slice schrieb:

    Damit schreibst du den Output in einer Konsolenanwendung
    Entweder hast du meine Frage nicht verstanden oder ich verstehe deine Antworten einfach nicht o.o

    LG Ruerte
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    @thefiloe das ist es ja, ich möchte KEINE Konsolen Anwendung sondern eine Anwendung die entweder normal gestartet wird per Doppel klick und eine eigene GUI hat oder per CMD die .exe mit befehlen aufruft und in der CMD antwortet (wie im startpost erklärt) Ich habe sowas auch schon mal gehabt finde jedoch das progg was das könnte leider nicht wieder sonst hätte ich es mit ILSpy mir mal angeschaut ._.

    Ruerte schrieb:

    WinForm Anwendung
    Ist lesen zu viel verlangt? :c

    LG Ruerte
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Klick das an was ich gesagt hab. Damit funktioniert das. Ich kann und habe dein Zeug gelesen. Prüfe die args und zeig die gui oder halt nicht.
    ansonsten musst über allocconsole gehen.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    @nafets ich will keine Konsole sondern in der CMD mit der ich das Programm aufrufe einen Code schreiben
    @thefiloe dadurch erhalte ich doch nur eine neue Console? oder versteh ich das falsch O.o
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Die CMD ist doch die Konsole!? Oder was meinst du genau?

    Nur mal als Beispiel:

    du öffnest die CMD und machst dann deinProgramm.exe -> GUI öffnet sich (wäre das gleiche wie doppelklick auf Icon, also ohne Parameter)
    du öffnest die CMD und machst dann deinProgramm.exe -Parameter -> GUI öffnet sich nicht sondern bleibt direkt in der CMD/Konsole und weiter geht's
    Ich glaube, ich habe eine Lösung gefunden: Man kann mit AttachConsole das Programm an die Konsole der Parent-Anwendung (cmd) binden. Dies funktioniert jedoch nur, wenn die Anwendung wirklich über die Konsole gestartet wurde - bei einem Link funktioniert das nicht. Deswegen habe ich mal ein kleines Beispiel gemacht, welches in allen Fällen funktionieren sollte :)
    Beispiel

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.IO;
    4. using System.Linq;
    5. using System.Runtime.InteropServices;
    6. using System.Threading.Tasks;
    7. using System.Windows.Forms;
    8. namespace Test
    9. {
    10. static class Program
    11. {
    12. [DllImport("kernel32.dll", SetLastError = true)]
    13. [return: MarshalAs(UnmanagedType.Bool)]
    14. static extern bool AllocConsole();
    15. [DllImport("kernel32.dll", SetLastError = true)]
    16. static extern bool AttachConsole(int dwProcessId);
    17. const int ATTACH_PARENT_PROCESS = -1;
    18. /// <summary>
    19. /// The main entry point for the application.
    20. /// </summary>
    21. [STAThread]
    22. static int Main(string[] args)
    23. {
    24. if (args.Length > 0 && args[0] == "/console")
    25. {
    26. //Wenn die Anwendung in der Konsole ausgeführt werden soll
    27. try
    28. {
    29. bool consoleAllocated = false;
    30. #if !DEBUG //Beim Debugging wird sowieso auf die VS-Konsole weitergeleitet
    31. if (!AttachConsole(ATTACH_PARENT_PROCESS) && !(consoleAllocated = AllocConsole())) //Versuchen, auf die Konsole des Parents (cmd) zuzugreifen, ansonsten eine Konsole erzeugen (hauptsächlich nötig, wenn die Anwendung über eine Verknüpfung ausgeführt wurde)
    32. {
    33. return 1; //Wenn beides fehlschlägt die Anwendung beenden und einen Fehlercode zurückgeben
    34. }
    35. #endif
    36. ConsoleApp(); //Die eigentliche Konsolenanwendung ausführen
    37. if (consoleAllocated) //Prüfen, ob eine eigene Konsole zugewiesen wurde
    38. {
    39. Console.ReadKey(false); //Ich mach hier mal ReadKey, um dem Nutzer Zeit zu lassen, den Output zu lesen
    40. }
    41. return 0; //Anwendung mit "Success" beenden
    42. }
    43. catch
    44. {
    45. return 1; //Anwendung mit Fehlercode beenden
    46. }
    47. }
    48. else
    49. {
    50. //Wenn die Anwendung normal gestartet wird, einfach ganz normal die WinForms-Anwendung starten
    51. Application.EnableVisualStyles();
    52. Application.SetCompatibleTextRenderingDefault(false);
    53. Application.Run(new Form1());
    54. return 0;
    55. }
    56. }
    57. static void ConsoleApp()
    58. {
    59. //Die eigentliche Konsolenanwendung
    60. Console.WriteLine("Writing to the parent console :)");
    61. Console.WriteLine("It works!");
    62. }
    63. }
    64. }

    Grüße
    Stefan
    Erstell dir eine Konsolen -Anwendung. Anschließend fügst du deinem Projekt (Konsolen -Anwendung) deine Windows -Forms hinzu.
    Jetzt musst du in der Console nur noch auf den entsprechenden Befehl reagieren um die GUI anzuzeigen.

    Spoiler anzeigen
    Aufruf:

    C#-Quellcode

    1. new Thread(new ThreadStart(delegate()
    2. { ShowGUI(new string[] { "HelloWorld" });
    3. })).Start();


    Benötigte/Optionale Methoden

    C#-Quellcode

    1. static void ShowGUI(string[] args)
    2. {
    3. FrmMain frm = new FrmMain(args);
    4. frm.FormClosed += FrmClosed;
    5. frm.Shown += FrmShown;
    6. Application.Run(frm);
    7. }
    8. static void FrmShown(object sender, EventArgs e)
    9. { Console.WriteLine("[ + ] GUI started..."); }
    10. static void FrmClosed(object sender, EventArgs e)
    11. { Console.WriteLine("[ - ] GUI closed..."); }



    *Edit*
    So sieht das dann aus, denke so meintest du das.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Fakiz“ ()