Problem beim Aufruf einer .msi Datei

  • Hallo zusammen,

    ich habe wahrscheinlich ein Problem mit dem Aufruf eines Skriptes. Es soll eine Installation über eine .msi Datei gestartet werden. Diese Installation wird über ein Skript geregelt. Rufe ich das Skript über die Kommandozeile auf funktioniert alles wunderbar. Sobald ich aber das Installations-Skript über ein anderes Skript öffne bekomme ich beim Aufruf der Installation die Fehlermeldung:" "TriopticsRedistributablePackage_1.0.7.msi" konnte nicht gefunden werden. Stellen Sie sicher, dass Sie den Namen korrekt eingegeben haben und wiederholen Sie den Vorgang. Klicken Sie auf "Start" und anschließend auf "Suchen", um eine Datei zu suchen. "

    Ich habe keine Idee mehr warum der selbe Aufruf meines Skriptes aus der Konsole heraus diesen Fehler nicht hervorruft und die Installation wie gewünscht startet. Ich bin auch sicher, dass ich im anderen Skript die richtige Datei aufrufe, da meine Debug-Message Box korrekt angezeigt wird.

    Hier dann die relevanten Codeausschnitte aus den beiden Skripten. Die kompletten Skripte darf ich leider nicht posten, aber die Ausschnitte geben eigentlich alles Relevante wieder:


    Skript für die Installation des msi- Packages :

    [autoit]


    If $CmdLine[0] > 1 Then
    #Region --- CodeWizard generated code Start ---
    ;MsgBox features: Title=Yes, Text=Yes, Buttons=OK, Icon=Critical
    MsgBox(16,"Error install_Trioptics Redistributables","Script opened with wrong number of arguments !")
    help()
    #EndRegion --- CodeWizard generated code End ---
    Exit
    EndIf

    [/autoit][autoit][/autoit][autoit]

    If $CmdLine[0] < 1 Then
    tr_install_manu()
    Else
    Switch $CmdLine[1]
    Case "-check"
    ; prüft ob die Treiber bereits installiet sind
    $exitcode = tr_check()
    Exit($exitcode)
    Case "-uninstall"
    ; deinstalliert die Trioptics Redistributables
    tr_uninstall()
    Case "-manual"
    ; aktiviert die manuelle Installation der Trioptics Redistributables
    tr_install_manu()
    Case "-automatic"
    ; aktiviert die automatische Installation der Trioptics Redistributables
    tr_install_auto()
    Case "-h"
    ; gibt die Hilfe auf der Console aus
    help()
    Case "-help"
    ; gibt die Hilfe auf der Console aus
    help()
    Case "/?"
    ; gibt die Hilfe auf der Console aus
    help()
    Case Else
    #Region --- CodeWizard generated code Start ---
    ;MsgBox features: Title=Yes, Text=Yes, Buttons=OK, Icon=Critical
    MsgBox(16,"Error install_Trioptics Redistributables","Wrong argument given to script !")
    ; gibt die Hilfe auf der Console aus
    help()
    #EndRegion --- CodeWizard generated code End ---
    Exit
    EndSwitch
    EndIf
    ; Aufruf der Manuellen Installation der Trioptics Redistributables
    Func tr_install_manu ()
    $dir = @WorkingDir
    FileChangeDir("Data")
    MsgBox(64,"test","test")
    ShellExecuteWait("TriopticsRedistributablePackage_1.0.7.msi") ; Manuelle Installation der Trioptics Redistributables
    FileChangeDir($dir)
    EndFunc

    [/autoit]

    Obiges wird als "Cui" kompiliert. So dass es über die Kommandozeile aufrufbar ist. Dies funktioniert auch genauso wie es soll. Ich habe auch schon andere arten des Aufrufes probiert. Sowohl ein Benutzen von Runwait mit Comspec als auch das Benutzen von Runwait mit MSIEXEC rufen das selbe Verhalten hervor.

    Rufe ich hingegen dieses Skript in meinem Installationsprogramm auf, kommt die zu Beginn erwähnte Fehlermeldung.
    Skriptabschnitt mit dem Aufruf:

    [autoit]

    If $install[0] > 0 Then
    For $j = 1 To $install[0] ; Alle vorhandenen installationen durchgehen
    If $nMsg = $install[$j] Then ; Wenn auf einen Installationsbutton gedrückt wurde
    $application = $apps[$j] ; Application aus der Appsliste holen
    If ($application <> "Install all applications") Then ; wenn es nicht "Install all applications" ist
    $all_files = _GetFileList(@ScriptDir,"*.*") ; Array mit allen Dateien ermitteln
    Local $k = 1 ; Zählvariable beim Durchlaufen der Files
    Local $found = 0 ; Variable die anzeigt, ob bereits eine passende Datei gefunden wurde
    While ($found = 0) And ($k <= $all_files[0])
    If StringInStr($all_files[$k],'install_' & $application & '.exe',0) <> 0 Then ; Suchen nach dem Installationsskript
    RunWait(@ComSpec & ' /c "' & $all_files[$k] & '" -manual', '', @SW_HIDE) ; Ausführen der manuellen Installation
    $found = 1 ; Flag setzen, dass ein Installationsskript gefunden wurde
    set_buttons_images () ; Setzen der richtigen Images und Buttons
    EndIf
    $k += 1
    WEnd
    If $found = 0 Then ; Wenn kein Installationsskript gefunden wird
    #Region --- CodeWizard generated code Start ---
    ;MsgBox features: Title=Yes, Text=Yes, Buttons=OK, Icon=Critical
    MsgBox(16, "Error", "Missing install script of " & $apps[$j]) ; Nachricht wenn das Install-Skript fehlt
    #EndRegion --- CodeWizard generated code Start ---
    EndIf
    Else
    install_all () ; Alles installieren was noch nicht vorhanden ist
    set_buttons_images () ; Setzen der Images und Buttons
    EndIf
    EndIf
    Next
    EndIf

    [/autoit]

    Ich weiß, dass es eventuell schwierig ist, weil ihr es nicht selber nachstellen könnt, aber vielleicht hat ja trotzdem jemand eine Idee wodran es liegen könnte. Wie gesagt: Der Aufruf meines Installationsskriptes funktioniert, da die Messagebox aus dem oberen Skript erscheint. Aber beim Aufruf der Installation kommt dann die Fehlermeldung.

    Vielen Dank schonmal.

  • Hallo sharkthorn

    ich gehe mal davon aus, das Du bereits eine Lösung gefunden hast. Da ich noch Autoit Anfänger bin steige ich so ganz in Deinem Script noch nicht durch, aber ich würde es einfach daraufhin mal testweise ändern, die MSI Dateien direkt mit MSIEXEC aufzurufen und dort ein vernünftiges Logfile schreiben zu lassen.

    Der Hintergrund ist folgender. Wenn das nicht geht, dann stimmen irgendwo Deine Pfade vermutlich nicht. Wenn die MSI zumindest mal angetriggert wird, kannst Du denn Rest aus dem Logfile vielleicht heraus finden.

    Gruss Hassan

  • Ich würde mal drauf tippen, dass da was mit den Arbeitsverzeichnissen nicht stimmt.

    Hier mal meine Vermutung was passiert:

    Hauptprogramm befindet sich sagen wir mal in C:\Test
    CUI Tool, welches den Installer aufruft befindet sich in C:\Test\Tool
    Die MSI Dateien befinden sich in C:\Test\Tool\Data

    Startet man das CUI Tool direkt (z.B. aus Scite heraus) ist das Arbeitsverzeichnis C:\Test\Tool da dort die CUI liegt. Die MSI Dateien werden dann auch im Unterverzeichnis Data gefunden.
    Startet man das CUI Tool hingegen per run oder vergleichbaren Befehlen vom Hauptprogramm aus und gibt in den Parametern des Befehls kein Workingdir an, dann wird die CUI nicht unter C:\Test\Tool ausgeführt, sondern unter C:\Test. Da es dort kein Data Unterverzeichnis gibt wird auch keine MSI gefunden und die Installation scheitert.

    Lösung wäre also:

    [autoit]


    RunWait(@ComSpec & ' /c "' & $all_files[$k] & '" -manual', '', @SW_HIDE) ; Ausführen der manuellen Installation
    ; mit dem hier ersetzen...
    RunWait(@ComSpec & ' /c "' & $all_files[$k] & '" -manual', $VerzeichnisindemsichdieCUIbefindet, @SW_HIDE) ; Ausführen der manuellen Installation

    [/autoit]

    Aber da das Problem vermutlich längst gelöst ist und hier auch keinerlei Informationen stehen wie die Verzeichnisstruktur genau ausschaut wird das wohl nur eine Vermutung bleiben.