Bestimmtes Programm wählen, wenn Datei geöffnet wird

  • Hallo zusammen.

    Ich möchte mein Anliegen kurz erklären, dann sagen, was ich vorhabe und erhoffe mir von euch die Hilfe, dass das so realistisch und machbar ist oder vielleicht Verbesserungsvorschläge.

    Situation:

    Spoiler anzeigen

    Ich habe für meine Arbeit von einem Produkt mehrere Versionen installiert. Man kann von den Produkten immer nur eine Version öffnen. Ab und zu registriert sich dann die Version, die ich öffne, neu. Das bedeutet, dass sie in der Registrie sagt " ich bin die aktuelle Version" und würde ich eine Datei per Doppelklick öffnen, öffnet sich die Version gemäß des Regedit-Eintrags.
    Ich springe täglich zwischen den Versionen hin und her. Und weil die Versionen optisch sehr ähnlich sind, habe ich das Problem, dass ich eine Datei mit der falschen Version öffne, bearbeite und speichere (ohne es zu bemerken). Im schlimmsten Fall ist es so, dass die Datei dadurch unbrauchbar wird, weil sie mit der falschen Version abgespeichert wurde. Und dann war jegliche Arbeit umsonst. Dieses Problem umgehe ich, indem ich erst das Programm mit der richtigen Version öffne und dann die Datei lade. Finde ich aber umständlich.

    Hier kommt mein Vorhaben:

    Spoiler anzeigen

    Ich möchte ein Script schreiben, was ich in den Autostart packe und es somit sofort aktiv ist (es darf also nicht riesig werden, wenn es läuft).

    Sobald ich einen Doppelklick auf einen bestimmten Dateityp mache, soll das Script eingreifen. Mir ein Auswahldialog anzeigen, wo ich per Radio-Button die richtige Programmversion auswähle, die sich dann öffnet (sozusagen eine "Öffne mit"-Auswahl. Die Auswahl soll variabel sein (Regedit-Einträge sollen dafür ausgelesen werden, welche Versionen alles installiert sind) damit ich es nicht bearbeiten muss, falls wiedermal eine neue Version hinzukommt.

    Ich frage mich, wie ich das realisieren soll, dass das Script reagiert und nicht schon der Befehl "öffnen/bearbeiten" reagiert, wenn ich den Doppelklick auf die Datei ausführe. Es gibt doch auch dafür Windows-Funktionen, wo festgelegt wird, dass die und die Dateitypen mit dem und dem geöffnet werden, oder? Könnte ich doch dort vielleicht direkt das Script eingeben, oder?

    Was sagt ihr dazu?
    Lieben Gruß und Danke im Voraus.
    Xethria

    Einmal editiert, zuletzt von Xethria (22. September 2010 um 10:26)

  • Hi,

    also ich würde wahrscheinlich so vorgehen:
    Ich würde die Dateiendung des Programms mit meinem AutoIt Script verknüpfen, welches dann dadurch per CMD-Line den Pfad der zu öffnenden Datei bekommt.
    Das ist per registry realisierbar. Dann wäre es möglich, die Datei mit Autoit zu öffnen und auszulesen, denn irgendwo möge wohl in der Datei die Version stehen, sodass das Autoit-Programm bescheid weiss,
    und die Datei mit der richtigen Version öffnet ( Es müsste natürlich die Pfade zu den verschiedenen Versionen entweder aus einer ini lesen oder vll. steht es auch in der registry )

    Grüße

    edit:
    Hiermit kann man per Registry einstellen, dass eine bestimmte Endung mit dem Autoit Programm verknüpft wird, und das Autoit Programm bekommt durch das "%1" in dem Eintrag den Pfad der zu öffnenden Datei per cmd line (dazu in der Hilfe unter $CmdLine oder so schauen) übergeben
    Der Zweite Regeintrag setzt für eine bestimmte Endung das Icon des Autoit Programms.

    [autoit]

    $ProgPath = @Desktopdir & "\AutoItProgramm.exe"
    $Ext = ".blub"
    RegWrite("HKEY_CLASSES_ROOT\" & $Ext & "\shell\open\command", "", "REG_SZ", '"' & $ProgPath & '" "%1"')
    RegWrite("HKEY_CLASSES_ROOT\" & $Ext & "\DefaultIcon", "", "REG_SZ", '"' & $ProgPath & '",0')

    [/autoit]

    2 Mal editiert, zuletzt von qon (22. April 2010 um 14:24)

    • Offizieller Beitrag

    Ich würde es auch versuchen zu strukturieren.

    Du willst die Dateien anklicken und diese sollen automatisch mit der richtigen Version eines Programms geöffnet werden, richtig?
    Wenn das Skript durch einen Doppelklick auf die Datei gestartet wird, dann brauchst du doch eigentlich auch keine Auswahlmenü mehr, sondern kannst gleich die richtige starten, oder?
    Waron erkennst du denn die Version in der Datei?

    • Offizieller Beitrag

    Habe es gerade mal getestet.

    Key angelegt : HKEY_CLASSES_ROOT\.mega\shell\open\command
    Standard auf c:\AutoIt\Mega.exe "%1" gesetzt

    Mega.exe

    Spoiler anzeigen
    [autoit]

    If $cmdline[0] > 0 Then
    ;~ MsgBox(0, $cmdline[1], "MEGA" & @CRLF & $cmdline[1] & @CRLF)
    $file = FileOpen($cmdline[1], 0)

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

    ; Check if file opened for reading OK
    If $file = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf

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

    MsgBox(64, 'Inhalt', FileRead($cmdline[1]))

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

    FileClose($file)
    EndIf

    [/autoit]

    Datei angelegt Test.mega irgendwas reinschreiben und dann Doppelklick.

    Mega

  • Vielen Dank für eure Ideen und Vorschläge.

    Das Problem ist, dass die Eigenschaften der Datei nicht angibt, mit welcher Version es erstellt wurde. Geben wir dem Kind einen Namen, es geht um die Software AutoCAD, AutoCAD Mechanical und AutoCAD Inventor.

    Formatbeispiele:
    AutoCAD/AutoCAD Mechanical: dwg, dwf, dxf
    AutoCAD Inventor: idw, iam, ipt

    Bei den Eigenschaften der Datei würde unter Dateityp das stehen: AutoCAD-Zeichnung (.dwg)
    Aber nicht, ob es mit AutoCAD 2009, AutoCAD 2010 oder AutoCAD 2011 erstellt wurde.

  • und wie findest du heraus, mit welcher Versionsnr. die Zeichnung gespeichert wurde?

  • Ich weiß, mit welcher Version der Kunde arbeitet für den ich die Datei ändere. Daher ist es ja besonders schlimm, wenn ich aufwendig für den Kunden arbeite und durch die falsche Version die Datei unbrauchbar wird.

    Durch den Doppelklick auf die Datei öffnet sich immer die Version, die als "aktuell" in regedit eingetragen ist. Das ist aber in den seltesten Fällen auch gleich die Version, die ich benutzen möchte.

    Daher möchte ich immer die Abfrage beim Doppelklick auf eine DWG:
    Bitte wählen:
    AutoCAD 2009
    AutoCAD 2010
    AutoCAD 2011

  • ok, also musst du für Kunde A mit Version X arbeiten, und für Kunde B mit Version Y?
    Dann kommst du nicht drumrum, dir entweder
    - für jede Version ein Verzeichnis anzulegen, in dem NUR die Dateien enthalten sind, die mit Version X arbeiten, oder

    -eine art "Datenbank" die anhand des Dateinamens ermittelt welcher Kunde bzw welche Version zum Öffnen/bearbeiten verwendet wird. Die Datenbank kann auch eine einfache Textdatei sein...

    • Offizieller Beitrag

    Ja, und ich habe sogar bewiesen das es geht. :) Einen Post später
    Dabei musst dann natürlich immer manuell entscheiden, welche Version des Programms gestartet werden soll bzw. genutzt werden soll um die Datei auf die du einen Doppelklick gemacht zu öffnen.

    Edit : Sprich

    1) Doppelklick auf deine Datei
    2) Autoit Skript GUI poppt auf mit Auswahl
    3) Auswahl getroffen
    4) Das ausgewählte startet mit der Datei

  • EDIT:
    Nein mit dem Script hatte es nicht funktioniert! Vielleicht ein Hinweis, dass ich Win7 verwende!? Da gibt es den Eintrag "Shell" nicht sondern nur "shellex" zum Beispiel. Also sind dort ja schon Unterschiede.

    Ich habe dieses herausgefunden:

    Spoiler anzeigen


    DWGs werden mit dem Standardprogramm "AutoCAD Application" geöffnet.
    In der Regedit fand ich den Verweis auf:

    HKEY_CURRENT_USER\Software\Classes\AutoCAD.Application
    dort ist drin:
    HKEY_CURRENT_USER\Software\Classes\AutoCAD.Application\CurVer
    Zeichenfolge:
    (Standard) : AutoCAD.Application.18

    HKEY_CURRENT_USER\Software\Classes\AutoCAD.Application.18\CLSID
    Zeichenfolge:
    (Standard) : {6D7AE628-FF41-4CD3-91DD-34825BB1A251}

    HKEY_CURRENT_USER\Software\Classes\CLSID\{6D7AE628-FF41-4CD3-91DD-34825BB1A251}\LocalServer32
    Zeichenfolge:
    (Standard) : C:\Program Files\Autodesk\ACADM 2011\acad.exe /Automation
    Irgendwo muss ja die Verweiskette anfangen.

    Ich habe beim Rechtsklick auf die DWG bei der Auswahl des Standardprogramms auf eine EXE umgebogen, die einfach nur eine MSGBOX ausgibt.
    Als Test, dass es funktiniert. Und das tut es. MSGBOX wird angezeigt. Und nun kann ich doch die Abfrage erstellen und je nach Auswahl wird der Regeintrag gewählt, der dann die richtige Version öffnet. Klingt doch gut oder?
    Nachdem ich auch das mit dem Standardprogramm gemacht habe, hatte sich auch absolut nix bei dem Eintrag:
    HKEY_CLASSES_ROOT\.dwg geändert.

    Ich habe nach der Exe gesucht, die ich angegeben habe und sie taucht nun hier auf:
    HKEY_CLASSES_ROOT\Applications\test.exe
    HKEY_CLASSES_ROOT\Applications\test.exe\shell\open\command
    und
    HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\Shell\MuiCache

    6 Mal editiert, zuletzt von Xethria (22. April 2010 um 17:11)

  • "Siehe zwei Beiträge vorher"

    Ich weiß nicht, wo die Reg-Verweiskette beginnt. Möchte ja nur was "zwischen setzen".

    Einmal editiert, zuletzt von Xethria (22. April 2010 um 17:11)

  • Also ich kapiers nicht...
    Bei Doppelklick auf ein *.dwg öffnet sich das AutoItscript, soweit sollte es klappen.
    Dann eine Auswahlliste in der sämtliche AutoCad-Versionen stehen, click auf die Version startet per shellexecute AutoCadX im entsprechenden Verzeichnis mit der *.dwg als Parameter...
    Somit startet AutocadX aus dem Verzeichnis von AutoCadX. Was in der Registry steht ist somit uninteressant, da sämtliche relevanten Informationen (Version usw) aus der AutoCad.exe bzw aus dem Programmverzeichnis kommen.
    Die Registry ist doch nur dann interessant, wenn "in irgendeinem Verzeichnis" ein *.dwg angeklickt wird. Dann sucht Windows in der Registray nach dem Verweis und startet das entsprechende Programm.

    Habe das eben mit einigen Programmen durchgespielt, sobald ich ins Programmverzeichnis wechsele und das Programm mit dem Parameter PfadZurDatei.xyz starte, wird auch genau diese Programmversion gestartet....

  • Also auf Windows Vista und Xp funktioniert es so auf jeden Fall, wies jetzt bei 7 aussieht, weiss ich nicht, sollte aber auch genau so funktionieren. (nach dem regeintrag ist evtl ein neustart nötig, und das script braucht adminrechte, also #requireadmin)
    Aber es muss doch irgendwie möglich sein, die Version zu erkennen..
    Oder warum machst dus nicht eigentlich einfach so, dass du in dem Dateinamen direkt die Version speicherst, zB KundeXY_Version1.ext
    edit: also mir gehts jetzt darum, dass er automatisch erkennt, welche version er nehmen soll.

    Einmal editiert, zuletzt von qon (22. April 2010 um 17:52)

  • Die Windowsversion ist völlig egal...

    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_outfile=c:\notepad.exe
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    msgbox(0,"Notepad.exe","Hallo, ich bin Notepad.exe")

    [/autoit]

    Programm compilieren, erstellt eine notepad.exe in c:\

    Eingabeaufforderung öffnen (irgendein Verzeichnis), notepad eingeben, enter drücken, notepad startet (Windows sucht im PATH bzw in der Registry und öffnet Notepad.exe im Windowsverzeichnis)
    dann in der Eingabeaufforderung cd c:\ eingeben, enter drücken, aktuelles Verzeichnis ist c:\
    notepad eingeben, enter drücken und die Msgbox "unseres" neuen Notepads erscheint.....

    Es wird immer zuerst die Programmversion im aktuellen Verzeichnis gestartet bevor die Registry ins Spiel kommt!

    /EDIT/ da die Pfade zu den einzelnen Programmversionen sowieso bekannt sind, setzt man auch gleichzeitig das @WorkingDir