Konsolenanwendung startet manuell, aber wirft eine Fehlermeldung wenn durch Aufgabenplaner gestartet

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Bluespide.

    Konsolenanwendung startet manuell, aber wirft eine Fehlermeldung wenn durch Aufgabenplaner gestartet

    Hi,

    ich habe eine kleine Konsolenanwendung, die bei Start eine XML-File öffnet, Konfigurationsdaten liest und im Anschluss ein paar SQL-Befehle ausführt. Wenn ich die Anwendung manuell starte werden alle Befehle problemlos ausgeführt.

    Wird die Anwendung über den Aufgabenplaner gestartet, kommt folgende Fehlermeldung:

    VB.NET-Quellcode

    1. Unbehandelte Ausnahme: System.IndexOutOfRangeException: An der Position 0 befindet sich keine Zeile.
    2. bei System.Data.RBTree`1.GetNodeByIndex(Int32 userIndex)
    3. bei System.Data.DataRowCollection.get_Item(Int32 index)
    4. bei _27000_transfer.configurationDs.ConfigDataTable.get_Item(Int32 index)
    5. bei _27000_transfer.Module1.getDataFromSql()
    6. bei _27000_transfer.Module1.Main()


    Das Problem sind folgende Zeilen:

    VB.NET-Quellcode

    1. Dim Daten As New FileInfo("config.xml")
    2. If Daten.Exists Then
    3. Console.WriteLine("file is found!")
    4. cfgds.ReadXml(Daten.FullName)
    5. Else
    6. Console.WriteLine("#### file is not found! ####")
    7. End If


    Von Hand gestartet, wird die Datei gefunden, per Scheduler nicht. ?( Wie kann ich dafür sorgen, dass die File auch per Scheduler gefunden wird?
    Option strict = on

    If it's stupid and it works it ain't stupid.
    Du verwendest einen relativen Pfad, da wird der fehler vermutlich verbuddelt sein. Lass dir mal in beiden Fällen den StartUpPath ausgeben.

    Edit @Nils_Kr :
    Ist ja eine ConsolenApp, lass dir dann System.AppDomain.CurrentDomain.BaseDirectory ausgeben.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

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

    BaseDirectory ist wohl mit Vorsicht zu genießen, da sich das zur Laufzeit ändern kann. Die am besten bewertete Methode auf StackOverflow ist: System.Reflection.Assembly.GetExecutingAssembly().Location. Leider sind die Pfade identisch bei Manuellem und Autostart.
    Option strict = on

    If it's stupid and it works it ain't stupid.
    Auch wenn sich das ändern kann, lass es dir mal beim Programmstart ausgeben. Ohne es getestet zu haben bin ich mir sicher das dann 2 verschiedene Pfade rauskommen. Das was du ausliest ist der Pfad der exe, nicht der StartUppath/das WorkingDirectory.

    Oder mach mal auf dem Desktop eine batch(mit diesen Code) und starte die App damit, dann wird dir der Pfad des Desktops ausgegeben

    Quellcode

    1. start "C:\Path to the App\ConsoleApplication1.exe"

    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    Hab basedirectory ausprobiert, ist genau der gleiche Pfad. Aber trotzdem ist es nicht der Standardpfad beim Öffnen von Files.

    Ich habe jetzt mal den kompletten Pfad in die FileInfo eingetragen und die Datei wird gefunden. Wenn das Programm vom Aufgabenplaner gestartet wird, wird bei relativen Pfaden in System\Windows32 gesucht. Verrückt.
    Option strict = on

    If it's stupid and it works it ain't stupid.

    Nils_Kr schrieb:

    Wenn das Programm vom Aufgabenplaner gestartet wird, wird bei relativen Pfaden in System\Windows32 gesucht. Verrückt.


    Genau das dachte ich mir.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    Da muss man erst einmal drauf kommen, dass die Anwendung im Aufgabenplaner ein anderes Standardverzeichnis hat, als beim manuellen Start, obwohl es genau an der gleichen Stelle ausgeführt wird.

    Feste Pfade sind natürlich störend, deshalb sieht das ganze jetzt so aus:
    Dim Daten As New FileInfo(System.AppDomain.CurrentDomain.BaseDirectory & "\config.xml")

    Damit wird die File immer gefunden.

    Danke für die Hinweise!
    Option strict = on

    If it's stupid and it works it ain't stupid.
    Startest du die eine App aus deiner heraus und legst nicht explizit ein WorkingDirectory fest, "erbt" der Prozess den deiner App, da er von dort aus gestartet wurde.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin