Keine Leerzeichen im ungültigen Verknüpfungszielpfad

  • Hallo liebe Leute,

    entweder hat Windows 7 SP1 x64 oder FileCreateShortcut() in AutoIt 3.3.16.1 einen Bug, denn in der englischen sowie deutschen Hilfe steht:

    Zitat

    FileCreateShortcut() benötigt kein gültiges Ziel …, um die .lnk-Datei "erfolgreich" anzulegen.

    Erstelle ich eine Verknüpfung mit einem gültigen Zielpfad, der Leerzeichen enthält, wird der gesamte Pfad in doppelte Anführungszeichen gesetzt, ebenso beim Arbeitsverzeichnis. So weit so gut.

    Erstelle ich eine Verknüpfung mit einem ungültigen Zielpfad, der Leerzeichen enthält, jedoch auf ein eingebundenes Laufwerk verweist, wird der gesamte Pfad ebenfalls in doppelte Anführungszeichen gesetzt. Auch das ist in Ordnung.

    Erstelle ich eine Verknüpfung mit einem ungültigen Zielpfad, der Leerzeichen enthält, jedoch auf ein nicht eingebundenes Laufwerk verweist, wird der Pfad nicht mehr in doppelte Anführungszeichen gesetzt und alle Leerzeichen durch Unterstriche ersetzt. Das ist ein Fehler, den ich nicht beheben kann, weder mit im Zielpfad übergebenen doppelten Leerzeichen noch mit angehängtem \nul.ext, weil ich eigentlich nur ein Zielverzeichnis verknüpfen will.

    Hier ein Beispielskript fürs Verständnis und einfacherem Nachvollziehen:

    Kann jemand dieses Verhalten bestätigen und mir vielleicht sogar eine Lösung präsentieren oder falls es ein Bug von AutoIt ist, diesen bitte den Entwicklern mitteilen?

    Wenn sich jemand fragt, wozu ich dieses Szenario brauche:
    Ich wechsele hin und wieder meine Laufwerke, wovon jedes einen anderen Laufwerksbuchstaben zugewiesen bekommt, jedoch die betreffende Pfadstruktur auf all diesen Laufwerken dieselbe ist. Durch eine der Verknüpfungen kann ich schnell in den gewünschten Pfad springen und muss nur noch die nach dem Laufwerk benannte passende Verknüpfung anklicken. Ist das Laufwerk nicht eingebunden, so ist die Verknüpfung vorübergehend ungültig. Weil ich aber dieselbe Verknüpfung für alle Laufwerksbuchstaben haben möchte, schrieb ich mir ein AutoIt-Skript, mit dem ich nicht erst alle Laufwerksbuchstaben belegen muss.
    Ich könnte auch mit dem Programm Visual Subst alle Laufwerksbuchstaben nacheinander einem bestehenden Verzeichnis virtuell zuweisen und so alle gewünschten Verknüpfungen erstellen, aber dann könnte ich auch das Ausfüllen der Eingabefelder im Eigenschaftendialog von Windows händisch erledigen und bräuchte kein Skript mehr. Außerdem wäre mir dann dieser Fehler nicht aufgefallen. ;)

    Gruß, fee

    Einmal editiert, zuletzt von fee (31. Oktober 2024 um 05:19)

  • Kann jemand dieses Verhalten bestätigen

    Ich kann das Verhalten bei mir nicht reproduzieren (AutoIt: v. 3.3.16.1, Windows: v. 11 H24H2)
    Die Pfade werden korrekt eingetragen (mit Anführungszeichen ohne Ersetzung mit Unterstrichen)

    Das Problem hängt mit großer Sicherheit nicht auf AutoIts Seite, sondern wurde von mehreren Leuten berichtet, welche die zugrundeliegende API-Funktion IShellLink verwenden: >>Link1<<, >>Link2<<, >>Link3<<

    Hintergrund ist wohl, dass die Funktion Informationen benötigt, welches Dateisystem auf dem Ziellaufwerk verwendet wird.
    Dann kann sie entscheiden ob Leerzeichen im Pfad erlaubt sind oder mehr als die 8.3-Notation geht usw.
    Wenn das Ziellaufwerk aber nicht existiert fehlen diese wichtigen Informationen und die Funktion geht einfach vom schlimmsten aus - nämlich, dass das Dateisystem dort keine Leerzeichen im Pfad unterstützt.
    Ich vermute daher stark, wenn dein Zieldateiname mehr als 8 Zeichen hat und die Endung mehr als 3, dann würde in diesem Fall auch auf 8.3-Format hin abgeschnitten - kannst du ja mal testen.
    Ein wirklicher Bug ist es daher auch nicht, da das Verhalten begründet ist.

    Aktuelle, supportete Windows-Versionen scheinen das Verhalten geändert zu haben.

  • Ich denke mit

    Zitat

    FileCreateShortcut() benötigt kein gültiges Ziel …, um die .lnk-Datei "erfolgreich" anzulegen.

    ist eher gemeint, das die Zieldatei auf dem erstellenden System nicht existieren muss, anders als wenn man es manuell macht. Denn ansonsten lässt Windows einen das nämlich nicht abspeichern.

  • Erst mal vielen Dank für eure Antworten und vor allem an AspirinJunkie für deine Recherchen und die gute Erklärung. :thumbup:


    Moombas

    Das weiß ich ja auch, hehe, deshalb das Skript. ;) Man könnte zumindest die deutsche Hilfe vielleicht so ergänzen:

    Zitat

    FileCreateShortcut() benötigt im Gegensatz zum Windows-Explorer kein gültiges Ziel …, um die .lnk-Datei "erfolgreich" anzulegen. Das Laufwerk zum Ziel sollte jedoch erreichbar sein, um eine mögliche Verfälschung der Zeichenfolge zum Verknüpfungsziel zu vermeiden.


    AspirinJunkie

    Der Grund für dieses Verhalten seitens Windows ist bis auf dessen Änderung bei derzeit unterstützten Versionen nun auch für mich nachvollziehbar.

    Was auch immer dahinter stecken mag, ich habe deine Links gelesen, übersetzt, selbst weitergesucht, getestet und probiert, wobei im Wesentlichen das Nachfolgende herauskam.


    @Alle:
    Ich führte die nachfolgenden Skripte auf Windows 7 SP1 x64 (Win7) mit AutoIt 3.3.16.1 und auf Windows XP SP3 x86 (WinXP) mit AutoIt 3.3.14.5 aus, wobei auf beiden Betriebssystemen weder der Pfad vorhanden noch das Laufwerk eingebunden war. Auf einigen der nachfolgenden Bilder habe ich das Feld zur Anzeige des Verknüpfungszieles verbreitert, damit der vollständige Pfad sichtbar ist.


    Das erweiterte Skript zum Testen auf Beschneidung der Zielzeichenfolge:

    … erzeugte diese Verknüpfungen in Win7 und WinXP:

    Wie in den rot umrandeten Bereichen zu sehen ist, wäre es für Windows wohl zu altmodisch, einfach ganz auf MS-DOS-Beschränkung zu setzen. Deshalb erlaubt Win7 als Ziel ziemlich lange Pfade und Dateinamen, jedoch wird die Erweiterung auf die ersten drei Buchstaben abgeschnitten und die Leerzeichen durch Unterstriche ersetzt. WinXP beschneidet zusätzlich sowohl den Pfad als auch den Dateinamen auf acht Zeichen. Beide Betriebssysteme erlauben sogar Umlaute und benutzen wegen der beschränkten Pfade keine doppelten Anführungszeichen fürs Ziel.


    Dann habe ich nach langem Probieren dieses Skript erarbeitet:

    … und endlich das gewünschte Verknüpfungsziel sowohl auf Win7 als auch auf WinXP hinbekommen:

    Diese Variante sollte zuverlässig in allen Windows-Versionen funktionieren, die den Konsolenbefehl subst installiert haben, sofern sich deren Art und Weise, Meldungen auszugeben, nicht zu stark voneinander unterscheiden.


    Trotz dieses Erfolges verfolgte ich noch meine frühere Idee, das Verknüpfungsziel als passend kodierte file-URL anzugeben. Nachdem ich über die entsprechende WinAPI-Funktion stolperte und mein Skript aus dem ersten Block dieses Beitrags in dieses abwandelte:

    … gelangte ich in Win7 ebenso ans gewünschte Verknüpfungsziel, in WinXP jedoch nicht:

    Kann das jemand neugierdehalber auch für andere (neuere) Versionen von Windows bestätigen?


    Weil ich sah, dass AutoIt die WideChar-Variante der Funktion _WinAPI_URLCreateFromPath() verwendet, wollte ich wissen, ob WinXP mit der ANSI-Variante arbeiten kann:

    Und siehe da, in Win7 wird die Zielzeichenfolge teilweise sogar chinesisch während in WinXP das Ziel auch damit leer bleibt:

    Falls es jemanden interessiert: den chinesischen Teil 楦敬娺 übersetzt Google mit Letzter Jing’a (Jing-A Brewing Co. ist eine Mikrobrauerei in Peking) und DeepL mit Letzter Königstag. Jetzt weiß ich, woher Windows insgeheim wirklich kommt oder zumindest, warum es sich so seltsam verhält. 8o


    Bei meiner Recherche ist mir noch WScript.Shell über den Weg gelaufen. Obwohl an anderer Stelle stand, dass auch damit die von AspirinJunkie bereits erwähnte WinAPI-Funktion IShellLink genutzt wird, musste ich das ausprobieren und ersetzte die Funktion FileCreateShortcut() durch:

    Das Ergebnis war genauso ernüchternd wie mit FileCreateShortcut() und _WinAPI_URLCreateFromPath() in den obigen Skripten, jedenfalls auf Win7. Meine WinXP-Kiste wollte ich für diesen letzten Test nicht nochmal extra anschmeißen.


    Gruß, fee

    2 Mal editiert, zuletzt von fee (2. November 2024 um 23:28)