Batch Datei startet nicht Aufgrund "Pfad Fehlern"

  • VB.NET
  • .NET (FX) 4.0

Es gibt 101 Antworten in diesem Thema. Der letzte Beitrag () ist von Gangsterkrafter.

    @Gangsterkrafter
    Mediafire ist halt extrem eklig, mein Chrome stürzt da immer ab. Hab die Projektmappe jetzt über Edge heruntergeladen. Mal als Tipp für die Zukunft: Wenn du ein Projekt weitergeben willst, kannst du einfach die Ordner \bin und \obj löschen. Wenn du es dann als zip packst, kommst du auf flockige 14,6 MB. Außerdem ist es im Forum verboten, ausführbare Dateien außerhalb des Showrooms zu verteilen.

    Ich werde mir das später mal angucken, gerade habe ich nicht so viel Zeit.
    Mfg
    Vincent

    @Gangsterkrafter
    Keine Sorge, das Thema ist nicht geschlossen, du kannst nur innerhalb 3 Stunden (?) nicht zwei Posts hintereinander abschicken.


    Ganz wichtig: Option Strict On Das ist elementar und unumgänglich. Es ist häufig so, dass Anfänger das ignorieren, als komplizierter betrachten o. ä., aber ich kann dir versprechen, dass du irgendwann erkennst, wie wichtig und wertvoll diese Einstellung ist.

    Bitte lies mal dieses Tutorial: Visual Studio - Empfohlene Einstellungen Dort wird alles erklärt und gezeigt, wie man es macht.

    Es werden ein paar Fehler in deinem Projekt aufgezeigt werden (die durch Option Strict Off einfach ignoriert wurden). Die sind relativ einfach zu beheben, wenn du irgendwo Probleme haben solltest, kannst du es auch hier schreiben, wir helfen dir ;)

    Ich habe dir mal den Code geschrieben:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim _serverProcess As Process
    2. Private Sub ServerStart_btn_Click(sender As Object, e As EventArgs) Handles ServerStart_btn.Click
    3. Dim serverFile = new FileInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
    4. "Minecraft Server Launcher\Server\craftbukkit.jar"))
    5. If Not serverFile.Exists
    6. MessageBox.Show("Error: Couldn't Start the Server!", "Wtf", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    7. Return
    8. End If
    9. Try
    10. _serverProcess = new Process()
    11. _serverProcess.StartInfo.FileName = ""
    12. _serverProcess.StartInfo.Arguments = String.Format("-Xmx{0}M -Xms{0}M -jar {1} -nojline", "512",
    13. "craftbukkit.jar")
    14. _serverProcess.StartInfo.RedirectStandardError = True
    15. _serverProcess.StartInfo.RedirectStandardInput = True
    16. _serverProcess.StartInfo.RedirectStandardOutput = True
    17. _serverProcess.StartInfo.CreateNoWindow = True
    18. _serverProcess.StartInfo.UseShellExecute = True
    19. _serverProcess.Start()
    20. _serverProcess.BeginOutputReadLine()
    21. _serverProcess.BeginErrorReadLine()
    22. AddHandler _serverProcess.OutputDataReceived, AddressOf Process_OutputDataReceived
    23. AddHandler _serverProcess.ErrorDataReceived, AddressOf Process_OutputDataReceived
    24. MessageBox.Show("Server started.")
    25. Catch ex As Exception
    26. MessageBox.Show(ex.Message)
    27. End Try
    28. End Sub
    29. Private Sub Process_OutputDataReceived(sender As Object, e As DataReceivedEventArgs)
    30. Invoke(Sub()
    31. 'Hier kannst du über e.Data die neue Zeile abfragen
    32. End Sub)
    33. End Sub


    Du kannst dann so in die Konsole schreiben:

    VB.NET-Quellcode

    1. _serverProcess.StandardInput.WriteLine("time set day")
    Mfg
    Vincent

    Vielen Dank :) Falls ich Noch Fragen habe Kann ich mich in diesem Thema doch Melden oder?

    Also kann es vlt. Offen Bleiben?
    ---------------
    Ich habe Deinen Code jetzt mal ausprobiert Alles ohne Fehler nur (Trotz dateinamen angabe) Kommt ein Fehler in der exception Messagebox mit "Fuer das Prozessobjekt muss die UseShellExecute-Eigenschaft auf "false" festgelegt sein, um IO-Streams umzuleiten"

    2. Fehler ich bin jetzt n bisschen dumm denn meine variablen funktionieren nicht mehr seidem ich "Option Strict On" in die 1. Zeile Geschrieben habe, Hier habe ich die zwei variablen von mir welche als "Falsch" angezeigt wird:

    VB.NET-Quellcode

    1. Dim getWindowsUser = System.Environment.UserName
    2. Dim myLocalAppDataFolder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)


    Begeisterter BF4 Spieler :D

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

    Wieso sollte es denn geschlossen werden?

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Nein, das musst Du selber machen, also das auf erledigt setzen. Und erledigt != geschlossen.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ok, Danke :)

    Die Farbe "Rot" ist der Moderation vorbehalten. Farbe geändert. ~Trade

    Der Erste Spoiler ist Komplett Behoben!
    Spoiler anzeigen

    IST ALLES BEHOBEN ALSO UNWICHTIG

    Fehler 1 Ist schon behoben:
    Anstatt

    VB.NET-Quellcode

    1. Dim getWindowsUser = System.Environment.UserName
    2. Dim myLocalAppDataFolder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

    Habe ich Jetzt

    VB.NET-Quellcode

    1. Dim getWindowsUser As String = System.Environment.UserName
    2. Dim myLocalAppDataFolder As String = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)


    Nur jetzt existiert noch Dieser Fehler:
    " Fuer das Prozessobjekt muss die UseShellExecute-Eigenschaft auf "false" festgelegt sein, um IO-Streams umzuleiten " <- Ist auch Behoben

    Die Komplette Fehlermeldung:

    Quellcode

    1. An unhandled exception of type 'System.InvalidOperationException' occurred in System.dll
    2. Additional information: Für das Prozessobjekt muss die UseShellExecute-Eigenschaft auf "false" festgelegt sein, um IO-Streams umzuleiten.



    Jedoch Existiert nun ein Weiteres Problem:
    Die Msgbox die Du erstellt hast mit "WTF" Erscheint jetzt obwohl Der Pfad Existiert:
    Spoiler anzeigen


    Und Hier:


    Code :

    VB.NET-Quellcode

    1. Private Sub ServerStart_btn_Click(sender As Object, e As EventArgs) Handles ServerStart_btn.Click
    2. Dim serverFile = New FileInfo(Path.Combine(myLocalAppDataFolder, "\Minecraft Server Launcher\Server\craftbukkit.jar"))
    3. If Not serverFile.Exists Then
    4. MessageBox.Show("Error: Couldn't Start the Server!", "Wtf", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    5. Return
    6. End If
    7. Try
    8. _serverProcess = New Process()
    9. _serverProcess.StartInfo.FileName = "craftbukkit.jar"
    10. _serverProcess.StartInfo.Arguments = String.Format("-Xmx{0}M -Xms{0}M -jar {1} -nojline", "512",
    11. "craftbukkit.jar")
    12. _serverProcess.StartInfo.RedirectStandardError = True
    13. _serverProcess.StartInfo.RedirectStandardInput = True
    14. _serverProcess.StartInfo.RedirectStandardOutput = True
    15. _serverProcess.StartInfo.CreateNoWindow = True
    16. _serverProcess.StartInfo.UseShellExecute = False
    17. _serverProcess.Start()
    18. _serverProcess.BeginOutputReadLine()
    19. _serverProcess.BeginErrorReadLine()
    20. AddHandler _serverProcess.OutputDataReceived, AddressOf Process_OutputDataReceived
    21. AddHandler _serverProcess.ErrorDataReceived, AddressOf Process_OutputDataReceived
    22. MessageBox.Show("Server started.")
    23. Catch ex As Exception
    24. MessageBox.Show(ex.Message)
    25. End Try
    26. End Sub


    Begeisterter BF4 Spieler :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Trade“ ()

    @Gangsterkrafter
    Wow, okay, da habe ich dann einen Fehler gemacht (mit dem UseShellExecute).

    Versuch doch mal folgendes: Setz in der 3 Zeile aus dem Codeauschnitt (​If Not serverFile.Exists Then) einen Breakpoint und sieh dir an, welcher Dateiname in der FileInfo ist. Sollte der wie erwartet sein, kopiert diesen und füg ihn in den Explorer ein. Sollte nach einem Druck auf die Taste Enter Java starten (also dass passieren, was auch passiert, wenn man einen Doppelklick auf die craftbukkit.jar macht), dann kannst du dich ja nochmal melden.

    Übrigens:

    VB.NET-Quellcode

    1. ​_serverProcess.StartInfo.FileName = "craftbukkit.jar"

    Der Dateiname muss aber der Pfad zu Java sein. Deswegen habe ich mir auch eine Funktion gebaut, welche diesen ausfindig macht.
    Mfg
    Vincent

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

    Ok. Ich bin Beginner also habe vlt. 6 Monate Erfahrung deshalb...
    1. Weiss ich nicht wie man einen Breakpoint nutzt geschweige denn ihn Schreibt
    2. Deine Function ist echt geil, nur wo binde ich die Function in

    VB.NET-Quellcode

    1. _serverProcess.StartInfo.FileName = "craftbukkit.jar"
    ein?

    -> RegistryKey, RegistryHive, RegistryView wird als Ror Makiert.

    Oh mann :(, Ich will echt nicht nerven Aber weiss halt noch nicht viel.
    PS sry An @Trade dass ich die Rote farbe genutzt habe, kommt nicht mehr vor :(.
    Begeisterter BF4 Spieler :D
    @Gangsterkrafter
    Du nervst nicht, wir sind hier ein Forum, in welchem man Fragen klärt ;)

    Guck dir mal bitte dieses Tutorial an: VisualStudio richtig nutzen (Google ist nicht deine Mami) (vorallem das Video), dort wird 1. erklärt, was Breakpoints sind und zweitens, wie man den Fehler

    Gangsterkrafter schrieb:

    ​-> RegistryKey, RegistryHive, RegistryView wird als Ror Makiert.

    selber beheben kann. Die Zeile ist richtig, die Funktion kannst du wie eine Variable benutzen, in welcher der Java-Pfad drin steht.
    Mfg
    Vincent

    Zum 1. : RegistryKey, RegistryHive, RegistryView ist gefixt einfach Imports Microsoft.Win32 nutzen!

    2. Wie binde ich nun die Public Shared Function GetjavaPath() As String in den pfad von _serverProcess.StartInfo.FileName = "craftbukkit.jar" ein?

    3 . Die Breakpoints hab ich immer noch nicht Kapiert / geschafft sie Hinzuzufuegen, ich Schaetze es ist etwas mit Case und break oder sowas Waere Sehr nett, wenn du einen
    Kleinen abschnitt zeigst wie man einen Breakpoint bei

    VB.NET-Quellcode

    1. If Not serverFile.Exists Then
    hinzufuegt.
    Begeisterter BF4 Spieler :D

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

    @Gangsterkrafter

    Gangsterkrafter schrieb:

    in den pfad von _serverProcess.StartInfo.FileName = "craftbukkit.jar" ein?

    Welchen Pfad meinst du? Ich sehe da nur einen Dateinamen. Einbinden brauchst du gar nichts. Wie ich bereits sagte, du kannst die Funktion wie eine Variable verwenden. Also du kannst einfach

    VB.NET-Quellcode

    1. _serverProcess.StartInfo.FileName = GetjavaPath()

    schreiben. Fertig.

    3.
    Weil ich davon ausgehe, dass du die neuste Version von Visual Studio nutzt:

    Du musst an den Rand neben der Codezeile klicken:


    Anschließend färbt sich die Zeile rot und ein kleiner Punkt erscheint:


    Wenn du nun das Programm startest und die Codezeile erreicht wird, wird die Ausführung pausiert und du kannst gucken, welche Variablen welchen Wert haben und diese Tracken (wird in dem Tutorial gezeigt). Mit F10 kannst du eine Zeile nach vorne springen, mit F5 machst du ganz normal weiter.
    Mfg
    Vincent

    Hey, Ich hab's Ausprobiert und ich muss sagen
    Breakpoints sind ne geile Sache! habe sie Kapiert echt Peinlich dass ich dachte es hat was mit Case und break zutun.
    Jedoch Zeigen mir die Breakpoints mir jetzt was Die Kodierung Falsch macht, Und zwar muss Anstatt , ein & hin (Beim path.combine) ansonsten zeigt es den Pfad falsch an:
    Spoiler anzeigen




    Wenn ich nun Das Binde-Zeichen Aendere zu einem & Funktioniert zwar der Pfad im Breakpoint, Wenn man aber im Programm den Server Startet kommt "Das System kann den angegebenen Pfad nicht finden."




    Begeisterter BF4 Spieler :D
    @Gangsterkrafter
    Sehr gut, Breakpoints wirst du sehr häufig brauchen :)

    Nun 2 Sachen:
    1. StartInfo.FileName muss der Pfad zu Java sein
    2. Du musst in der Zeile mit dem String.Format ​craftbukkit.jar durch den Pfad zu der craftbukkit.jar ersetzen
    Mfg
    Vincent

    Also so?:
    _serverProcess.StartInfo.FileName = GetjavaPath()
    und So? : _serverProcess.StartInfo.Arguments = String.Format("-Xmx{0}M -Xms{0}M -jar {1} -nojline", "512", myLocalAppDataFolder & "\Minecraft Server Launcher\Server\craftbukkit.jar")

    Edit: Funktioniert jetzt Komplett nur jetzt Existiert mal wieder Ein Problem:


    Er soll Einfach seinen CMD Code in die richtextbox Schreiben haste ja schon hingeschrieben mit e.Data aber ... wie man Sieht mache ich Etwas Falsch... So wie immer
    Begeisterter BF4 Spieler :D
    Also das was du in Batch Datei startet nicht Aufgrund "Pfad Fehlern" machst ist kompletter Mist.
    Ein , trennt Parameter und ist nicht mit einem & vergleichbar. Du darfst nicht einfach Zeug rumprobieren in der Hoffnung, dass es funktioniert. Somit ist doch das Ganze Path.Combine Konstrukt fürn Arsch.
    Du machst aus Zwei Parameter einen Parameter und nix anderes. Nimm den Backslash bei "\Minecraft..." raus. Das macht dir ja eben Combine Methode.
    Zusätzlich enthällt der Pfad Spaces. Somit musste den in einer CommandLine quoten.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Exakt. Path.Combine ist sehr wichtig. Path.Combine nimmt belibig viele Stings entgegen und verkettet diese zu einem Pfad. Also zB

    VB.NET-Quellcode

    1. ​Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Minecraft", "bin", "Minecraft.exe"))

    würde bei mir ​C:\Users\Vincent\AppData\Roaming\Minecraft\bin\Minecraft.exe ergeben.

    Was macht denn die Write-Methode? (also nicht, dass sie irgendetwas richtig machen könnte, die Signatur ist nämlich schon völlig falsch :D )
    Mfg
    Vincent