Dateipfad der im Windowsexplorer markierten Datei auslesen

  • Hallochen allerseits, ist es möglich den Pfad einer bereits im Windowsexplorer markierten Datei in einer Variablen zu speichern? Also ohne "FileOpenDialog" zu verwenden?

    Danke

    Stefan

  • Habe ich vor langer Zeit mal erstellt:

  • ...und ich bin begeistert.... in D-Opus ->neue Symbolleiste einfügen ->Schalter anlegen -> mit *.exe verknüpfen -> fertig und läuft :)

    ein schönes Wochenende

    Stefan

    Einmal editiert, zuletzt von Schleifchen (28. August 2021 um 11:44)

  • Bitte beachten:

    Diese Funktion setzt voraus, dass der Datei Explorer im Moment der Abfrage das aktive Fenster ist. Den Aufruf müsstest Du dann z. B. auf einen Hotkey legen in einem AutoIt Skript, das im Hintergrund dümpelt. ;)

    Hier mal noch eine Version, in der der Datei-Explorer nicht aktiv sein muss! Es wird das topmost Explorerfenster verwendet:

    EDIT: Eine Besonderheit von Windows muss man aber selbst beachten. Hat man im Explorerfenster im Tree einen Bibliotheksnamen ausgewählt, liefert Windows nicht den Speicherpfad, da es sich hier um eine Verlinkung handelt. Man bekommt stattdessen einen Leerstring. Hat man die Standardoption mit Ordneranzeige gewählt, erhält man dann einen Backslash und Dateinamen. Wählt man jedoch im Tree den unterhalb des Bibliotheksnamens stehenden Ordner, läuft alles wie gewollt.

  • Nachtrag:

    In der Version im vorigen Post hatte ich die Reihenfolge der Fenster aus WinList ausgelesen, musste nun aber feststellen, dass WinList diese Liste ungeordnet erstellt. Somit wurde bei gleicher Klasse immer auf das zuerst erstellte Fenster zugegriffen.

    Habe ich in dieser Version korrigiert. Zusätzlich noch einen Fehler beim Auslesen aus Rootlaufwerken (Backslash wurde als Pfad mit übernommen).

  • Hallo BugFix

    gibt es von dieser Funktion auch eine Version, die das aktuell im Fokus befindliche Explorerfenster verwendet?

    Das Tool, was ich gerade schreibe, nutzt deinen Code um rekursiv nach bestimmten Dateitypen zu suchen.

    Ich Rechtsklicke auf einen Ordner und dann geht´s los. Es funktioniert alles einwandfrei, bis der Moment kommt, dass ein neues Explorerfenster aufgemacht wird, um irgendwas zu tun. Wechsle ich dann zum vorherigen Fenster zurück, und rechtsklicke dann auf den Ordner, gibt deine Funktion den Ordnerpfad aus dem zuletzt geöffneten, also dem falschen Explorerfenster zurück.

  • Ich hatte mal eine ähnliche Funktion.
    Hab die mal schnell erweitert, so dass man die Rückgabe je nach gewünschtem Attribut sortiert zurückerhält:

    Damit kann man selbst festlegen ob man nach dem z-index sortiert haben möchte um die Fenster entsprechend ihrer Darstellungsreihenfolge anzuzeigen oder doch eher nach deren Erstellreihenfolge um die ältesten bzw. jüngsten Fenster zu verwenden.

  • Hi zusammen, hi AspirinJunkie 👋 ,

    diese Variante funktioniert wunderbar und finde ich sehr gut verwendbar, Danke.
    Heißt nicht automatisch das die anderen Ansätze und Vorschläge nicht auch gut sind, die gezeigte passt mir einfach am besten 😁 .

    Bin gespannt was Lottich so bereichtet.
    Eine erfolgreiche Woche euch allen, bis später.

    Viele Grüße
    Sven

  • Moin Lottich, wie wäre es mit dieser Version?

    Hallo Velted , diese Funktion hab ich auch schon probiert, mit dem gleichen Resultat. Es gibt das Ergebnis aus dem zuletzt geöffneten Explorerfenster.

    so hab ich es getestet:
    ich öffne den Explorer und navigiere zum Ordner, den ich rechtsklicken will. Dann öffne ich eine neue Instanz vom Explorer, markiere einen anderen Ordner. Danach switche ich zurück zur 1. Instanz mit meinem gewünschten Ordner.

    Dann markiere ich ihn und starte das Script, um den Pfad meines Wunschordners zu bekommen. Aber es gibt mir den Pfad des anderen Ordners zurück.


    AspirinJunkie Das ist ja cool. Das ist diese Maps-Geschichte?! Habe noch nie mit sowas gearbeitet. Das 1. ArrayDisplay gibt mir direkt den Pfad meines Wunschordners aus, selbst wenn ich mehrere Explorer Instanzen geöffnet habe. Allerdings im Anschluss auch Infos aus allen anderen geöffneten Instanzen. Das liegt sicherlich an "For... In..." in Zeile 8. Kann man das umbauen, sodass nur der 1. Wert ($mExplWin["path"]) zurück kommt, ohne die Info´s der anderen Instanzen?

    Wenn ich versuche mir direkt $mExplWin["path"] auszugeben, schimpft Scite, dass ich die Variable nicht deklariert habe. Wenn ich das richtig verstehe, wird $mExplWin erst mit Werten in der For-In-Schleife befüllt und gültig. Dann hört´s aber auch schon auf mit meinem Verstehen, sofern das überhaupt korrekt ist.
    Ist genauso wie bei der Funktion von BugFix . Das ist so viel höher als mein eigener AutoIt Skill, dass ich mir den Code zwar anschauen kann, aber nur einen Bruchteil davon verstehe. Ich bin was Programmieren angeht nur ein Hobbybastler und manchmal kann ich fremde Funktionen für meine Bedürfnisse anpassen. Aber das hier übersteigt mein Können bei weitem. Und ich bin alt genug, dass ich das zugeben kann :whistling:

  • Kann man das umbauen, sodass nur der 1. Wert ($mExplWin["path"]) zurück kommt, ohne die Info´s der anderen Instanzen?

    $aExplorerWindows ist ein Array.
    Die Werte des Arrays sind einzelne Maps mit Infos zu den einzelnen Explorer-Fenstern.
    Momentan werden diese nach dem z-index sortiert.
    Daher ist das Fenster im Vordergrund bei dir das erste Element.
    Das erste Element eines AutoIt-Arrays liegt im Index [0].
    Sprich du musst $mExplWin = $aExplorerWindows[0] setzen, dann beinhaltet $mExplWin die Infos zum obersten Explorer-Fenster.

  • ohhh, ich wusste nicht wie ich die Maps auswerten muss. hab mir das auch schon mit arraydisplay ausgeben lassen. 3 offene Explorerfenster -> 3 Einträge im Array, alle mit dem Namen {Map[5]} ... da ist das 1. mal der D-Zug durch den Bahnhof gerauscht :D

    AutoIt
    Global $aExplorerWindows = _getSelectExplorerFiles(True, "z-index")
    Global $mExplWin = $aExplorerWindows[0]
    MsgBox(0,0,($mExplWin["selected"])[0])

    So klappt endlich die Ausgabe des markierten Ordners. Hat eine Weile gedauert, bis ich verstanden habe, dass $mExplWin["selected"] nochmals in Klammern gesetzt werden muss. Wäre ja sonst ein 2D Array, was ein Fehler wäre.

    Ich hatte schon befürchtet, dass ich mein Tool umschreiben muss. Vielen Dank AspirinJunkie Das sollte ich jetzt so in mein Tool übernehmen können.

  • Moin Lottich,

    wenn ich Deine Anforderungen lese und das Skript von AspirinJunkie immer in ($mExplWin["selected"])[0] den von Dir gewünschten Pfad liefert, heißt das für mich, Du suchst den Pfad des von Dir in einem aktuell aktiven Explorerfenster auf der rechten Seite markierten /selektierten Eintrags.

    Wenn das so ist, sollte die folgende Methode 'geradeaus' zum Ziel führen:

  • Stimmt, das funktioniert auch. Das erscheint auf den 1. Blick auch einfacher/simpler als die Funktionen von AspirinJunkie und BugFix

    Doch auch das hätte ich selber nicht hinbekommen. DLLCalls & Objekte... Davon hab ich keine Ahnung. Ich schustere mir meine Scripts mit der AutoIt-Hilfe zusammen und wenn ich da nicht weiter komme, frage ich die Gemeinschaft.

    Und ich bin dankbar für jedwede Unterstützung, die mir gewährt wird. Mein aktuelles Script dient dem "Aufräumen" meiner Mediensammlung. Mit einer Quick&Dirty-Lösung (weil ich mit cURL nicht klar komme). Euch würde schlecht werden, wenn ihr den Code seht :D

    Aber hey, es ist für mich und ein paar Freunde und es macht letztendlich was es soll. Kein Desktoplink nötig, es startet per Rechtsklick auf einen Ordner aus dem Kontextmenü heraus, aber auch nur dann, wenn alle Voraussetzungen dazu erfüllt sind. Deshalb ist gerade diese Funktion hier so wichtig dafür.


    Danke für eure Unterstützung :theke:

    Anmerkung für alle Leser:
    alle 3 Funktionen von AspirinJunkie , BugFix und auch die von Velted funktionieren.

  • Ich schustere mir meine Scripts mit der AutoIt-Hilfe zusammen und wenn ich da nicht weiter komme, frage ich die Gemeinschaft.

    So soll es auch sein, ist doch super wenn dein Anwendungsfall erfüllt ist, egal ob besonders elegant gelöst oder nicht. Am Ende soll es funktionieren und meist hat man privat auch gar nicht so den Skalierungs- und Erweiterbarkeitsbedarf - daher alles fein.

    Mit einer Quick&Dirty-Lösung (weil ich mit cURL nicht klar komme).

    Rein aus Interesse: was wolltest du denn mit cURL in deinem Kontext machen? Verstehe nicht so ganz wie dir cURL überhaupt helfen hätte können, für das was du beschreibst 😅 .

    alle 3 Funktionen von AspirinJunkie , BugFix und auch die von Velted funktionieren.

    Danke auch für dieses Feedback. Sowas finde ich immer schön. Zum einen ist das Wertschätzung den Leuten die Helfen gegenüber, zum anderen ist es für Leute die über dieses Thema stolpern gut zu wissen, dass für den Anwendungsfall alle drei Funktionen eine Option wäre. Meist bleibt so ein Feedback aus und dann weiß man i.d.R. nicht, wo die richtige Lösung ist (da wir sie hier nicht markieren oder so). Naja ... egal, wollte einfach Danke sagen das du Lottich sinnvoll Kontext und Feedback gibst 👌.

    Viele Grüße
    Sven

  • Rein aus Interesse: was wolltest du denn mit cURL in deinem Kontext machen? Verstehe nicht so ganz wie dir cURL überhaupt helfen hätte können, für das was du beschreibst 😅 .

    Es wird eine Abfrage an eine Online-DB gestartet. in den meisten Fällen geht das nur per cURL. Musste schon etwas länger suchen um eine DB zu finden, die das mit "normaler" URL macht UND auch den deutschen Inhalt angibt. Ich lade die gefundene HTML Quellcode runter, in ein Array und gehe das dann letzendlich mit stringbetween durch.

  • Danke für die Erklärung Lottich 👍 . Dennoch verstehe ich es nicht genau, da cURL erstmal nur ein HTTP Client ist und HTTP requests auch von etlichen anderen Clients (auch AutoIt kann als Client dienen) gesendet werden kann. Des Weiteren ist dies ...

    [...] etwas länger suchen um eine DB zu finden, die das mit "normaler" URL macht [...]

    ... auch nicht so viel sagend 😅 . Was soll eine normale URL sein usw.

    Aber egal, du hast dein Problem gelöst, gut ist. Ich möchte nicht zu viele (kind of) Off-Topic Fragen stellen, um den Thread hier nicht vom eigentlichen Thema abzulenken.
    Falls du Interesse hast und dich etwas tiefer austauschen möchtest, dann kannst du gern den AutoIt Commnity Discord Server dafür nutzen. Dies machen einige wenige hier ebenfalls, wenn bspw. die Shoutbox nicht ausreicht oder es sich nicht gleich lohnt, einen eigenen Thread zu öffnen.

    Viele Grüße
    Sven