Announcement

Collapse
No announcement yet.

Anwendung mit Parametern starten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Anwendung mit Parametern starten

    Hallo!
    Ich würde gern mein Programm mit Parametern starten.
    Also dass z.B. nach Aufruf von "programm.exe -a" die Textdatei a geladen wird, oder nach Aufrufen von "programm.exe -b" eben eine andere.

    Das Problem ergibt sich dadurch, dass eine Html-Datei von mir über verschiedene Links unterschiedliche Dateien mit diesem Programm öffnen muss, insgesamt 5 oder 6.

    Wenn jemand dafür ne andere Lösung parat hat, sag ich auch nicht nein

    Danke, und Grüße, Tobi

  • #2
    Hallo,

    das mit der Befehlszeile zeigt dieses einfache Bsp.
    [highlight=vb.net]
    Namespace Test
    Class Program
    ' Befehlszeile in args als Array. 1. Element = 1. Argument
    Public Shared Sub Main(ByVal args As String())
    ' Prüfen ob Argumente vorhanden sind
    If args.Length > 0 Then
    Console.WriteLine(args(0))
    End If

    Console.ReadKey(True)
    End Sub
    End Class
    End Namespace
    [/highlight]

    Dein Problem hab ich nicht ganz verstanden.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Hm. Und ich hab deinen Code nicht so 100%ig verstanden.

      Zu meinem Problem:
      Stell dir vor, ich habe in einem Ordner meine von VB erstellte Anwendung: programm.exe

      Des weiteren hab ich in dem Ordner die Textdateien: Text1.txt sowie Text2.txt

      programm.exe hat die Aufgabe, den Text aus einer Textdatei auszulesen, und in einem Label darzustellen.

      So. Und ich will jetzt auf meinem Desktop 2 Links haben; beim Klicken auf den einen soll programm.exe in seinem Label den Inhalt von Text1.txt anzeigen, beim Klick auf den anderen den Inhalt von Text2.txt.

      Ich hab mir eben gedacht, dies ließe sich durch Übergeben eines Parameters an programm.exe erledigen, so dass einer der Links z.B. so aussehen könnte (keine Ahnung, ob man das so schreiben würde, nur als Beispiel):

      Ziel: "Ordner\programm.exe -a"

      programm.exe würde dann beim Start seine Parameter überprüfen, ein "a" finden, und daraufhin die Datei "Text1.txt" laden.
      Hätte programm.exe ein "b" erhalten, würde es "Text2.txt" laden.

      Ich hoffe, ich habs jetzt einigermaßen verständlich rübergebracht

      Grüße, Tobi

      Comment


      • #4
        OK, das kann dann zB so gelöst werden:

        Code für Program.vb
        [highlight=vb.net]
        Imports System
        Imports System.IO
        Imports System.Windows.Forms

        Namespace TobiD
        Public NotInheritable Class Program
        Private Sub New()
        End Sub

        <STAThread> _
        Public Shared Sub Main(args As String())
        Application.EnableVisualStyles()
        Application.SetCompatibleTextRenderingDefault(Fals e)

        ' Prüfen ob Argument vorhanden sind - wenn nicht Form "normal"
        ' laden:
        If args.Length = 0 Then
        Application.Run(New Form1())
        Else
        ' Welche Datei soll gelesen werden?
        ' Parameter a -> Text1.txt
        ' Parameter b -> Text2.txt
        Dim fileName As String = Nothing
        If args(0) = "a" Then
        fileName = "Text1.txt"
        ElseIf args(0) = "b" Then
        fileName = "Text2.txt"
        End If

        ' Inhalt der Datei lesen:
        Dim text As String = Nothing
        Using sr As New StreamReader(fileName)
        text = sr.ReadToEnd()
        End Using

        ' Form1 mit Überladung öffnen:
        Dim frm As New Form1(text)
        Application.Run(frm)
        End If
        End Sub
        End Class
        End Namespace
        [/highlight]

        Code für Form1.vb
        [highlight=vb.net]
        Imports System.Windows.Forms

        Namespace TobiD
        Public Partial Class Form1
        Inherits Form
        Public Sub New()
        InitializeComponent()
        End Sub

        Public Sub New(dateiText As String)
        Me.New()
        label1.Text = dateiText
        End Sub
        End Class
        End Namespace
        [/highlight]

        Das mit der Verknüpfung zum Öffnen des Programms und übergeben der Argumente (Parameter) geht so.

        Allerdings könnte auch direkt der Dateiname übergeben werden.

        Was das ganze aber mit HTML-Dateien zu tun hat weiß ich nicht.

        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Hi Tobi,

          wenn Du doch mit Parametern arbeitest wieso dann nicht einfach den Dateinamen als Parameter übergeben, dann muss auch nix im Programm angepasst werden wenn mal die 3495. Datei damit verwendet werden soll.

          Dann würde auch gfoidl's erst Variante ganz locker ausreichen, weil dort dann der Name der zu öffnenden Datei stände und fertig.

          Solltest Du das Programm evtl. weiterreichen kann eine Prüfung, wenigstens auf die Dateierweiterung nicht schaden. Falls die Dateien so etwas wie einen Header haben umso besser dann prüf' diesen.

          Gruß Womble

          Comment


          • #6
            nur zur Vervollständigung:

            Wenn Du Dein VB-Programm nicht über eine Startfunktion sondern ein StartFormular konfigurierst, die Argumente also nicht in der Start() Funktion übergeben kannst, kommst Du mit System.Environment.GetCommandLineArgs() jederzeit an die Kommandozeilenparameter.

            Comment


            • #7
              der Start() Funktion übergeben kannst
              Warum soll das nicht gehen -> nur die Argumentenliste der Method bearbeiten.
              Siehe mein Beispiel.

              Mit Environment.GetCommandLineArgs bzw. mit Environment.CommandLine wird als 1. Argument der die ausführbare Datei zurückgegeben.

              mfG Gü
              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

              Comment


              • #8
                Wenn ein Formular als Startobjekt angegeben ist, wird die Main() Funktion der Hauptklasse oder des Hauptmoduls üblicherweise nicht aufgerufen, sondern das Framework ruft New() und Show() des Startformulars auf; dass dann noch eine Sub New(args as String()) existiert interessiert das Framework nicht (zumindest wurde mir das mal so erklärt). Somit wären die übergebenen Parameter verloren, weil die Funktion, die sie ausliest, nicht aufgerufen wird.

                Nutzt man GetCommandLineArgs oder Environment.CommandLine, hat man zusätzlich den Vorteil, dass man beliebig tief in der Programmstruktur die Kommandozeilenparameter abfragen kann, ohne sie als globale Variablen anlegen zu müssen oder von einer Aufrufebene in die nächste weiterzugeben. In Deinem Beispiel funktioniert die Übergabe der benötigten Information nur, wenn man einen bestimmten Konstruktor aufruft. Gut, es ist "nur" ein Form, da ist eine Vielzahl von Konstruktoren eher die Seltenheit, aber andere Klassen könnten je nach Aufgabe auch Informationen aus dem Programmaufruf benötigen, und wenn diese Funktion nur aufgerufen werden kann, wenn ein bestimmter Konstruktor genutzt wurde, oder die Information bei jedem Konstruktor extra übergeben werden muss, kannst Du Dir ja wohl vorstellen, was für einen Aufwand es bedeutet, wenn plötzlich eine zusätzliche Eigenschaft über Kommandozeilenparameter gesteuert werden soll.

                Und dass die Liste mit dem Programmnamen anfängt ist auch kein wirklicher Hinderungsgrund, dann muss man halt mit 1 anfangen zu zählen statt mit 0 (aber stimmt, das hätte ich vielleicht erwähnen sollen, wenn man nicht aus der C-Welt kommt denkt man da üblichweise nicht dran).

                Gruß
                Martin Dietz

                Comment


                • #9
                  sondern das Framework ruft New() und Show() des Startformulars auf
                  Das Framework nicht sondern die Visual Basic-Komponente. Das Framework ruft immer eine Methode auf die den Message-Loop für zB die Form aufruft.
                  In VB.net stimmt das was du geschrieben hast (mit obiger Korrektur).
                  Mein Bsp. ist von C# konvertiert und somit ist die Main-Methode vorhanden und wird auch aufgerufen - bisher hab ich nicht gewusst dass da VB.net wieder eine eigene Lösung hat

                  Nutzt man GetCommandLineArgs oder Environment.CommandLine, hat man zusätzlich den Vorteil, dass man beliebig tief in der Programmstruktur die Kommandozeilenparameter abfragen kann, ohne sie als globale Variablen anlegen zu müssen oder von einer Aufrufebene in die nächste weiterzugeben. In Deinem Beispiel funktioniert die Übergabe der benötigten Information nur, wenn man einen bestimmten Konstruktor aufruft. Gut, es ist "nur" ein Form, da ist eine Vielzahl von Konstruktoren eher die Seltenheit, aber andere Klassen könnten je nach Aufgabe auch Informationen aus dem Programmaufruf benötigen, und wenn diese Funktion nur aufgerufen werden kann, wenn ein bestimmter Konstruktor genutzt wurde, oder die Information bei jedem Konstruktor extra übergeben werden muss, kannst Du Dir ja wohl vorstellen, was für einen Aufwand es bedeutet, wenn plötzlich eine zusätzliche Eigenschaft über Kommandozeilenparameter gesteuert werden soll.
                  Wurde nie bezweifelt - nur auf das Problem angepasst.

                  Und dass die Liste mit dem Programmnamen anfängt ist auch kein wirklicher Hinderungsgrund, dann muss man halt mit 1 anfangen zu zählen statt mit 0
                  War nur der Hinweis den du vergessen hast.

                  mfG Gü
                  "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                  Comment

                  Working...
                  X