merkwürdiges Verhalten von Run[Wait] und ShellExecute[Wait] mit Parameter für WorkingDir

  • Hallo Scripter,

    wenn ich unter Windows7x64 bei Run oder ShellExecute ein WorkingDir als Parameter angebe, funktioniert Run überhaupt nicht mehr und ShellExecute ignoriert ihn schlicht und einfach, stattdessen wird das system32 Verzeichnis benutzt. Wird aber das WorkingDirectory vorher via FileChangeDir und der entsprechende Parameter bei beiden Funktionen auf "" gesetzt, abeiten beide Funktionen korrekt.

    Läuft da bei mir irgendetwas falsch oder ist das ein Bug?

    Ich benutze die aktuellen AutoIt/Scite Versionen, kompiliert wird mit AutoIt3_x64, obwohl das Problem auch in der 32bit Version besteht.

  • Ich meine in etwa sowas:

    Spoiler anzeigen
    Code
    Run(@ComSpec & " /c mklink /j " & chr(34) & "Startmenü" & chr(34) & " " & chr(34) & "C:\ProgramData\Microsoft\Windows\Start Menu" & chr(34), "C:\", @SW_HIDE)
    RunWait(@ComSpec & " /c mklink /j " & chr(34) & "Startmenü" & chr(34) & " " & chr(34) & "C:\ProgramData\Microsoft\Windows\Start Menu" & chr(34), "C:\", @SW_HIDE)
    ShellExecute(@ComSpec, "/c mklink /j " & chr(34) & "Startmenü" & chr(34) & " " & chr(34) & "C:\ProgramData\Microsoft\Windows\Start Menu" & chr(34), "C:\", $SHEX_OPEN, @SW_HIDE)
    ShellExecuteWait(@ComSpec, "/c mklink /j " & chr(34) & "Startmenü" & chr(34) & " " & chr(34) & "C:\ProgramData\Microsoft\Windows\Start Menu" & chr(34), "C:\", $SHEX_OPEN, @SW_HIDE)
  • Funktioniert bei mir problemlos.

    Die Verknüpfung zum Startmenü wird korrekt auf C:\ erstellt.
    Mal davon abgesehen, dass es bisschen umständlich hingeschrieben wurde.
    So wird es sicherlich etwas übersichtlicher:

    AutoIt
    Run(@ComSpec & ' /c mklink /j "Startmenü" "C:\ProgramData\Microsoft\Windows\Start Menu"', "C:\", @SW_HIDE)

    Wenn du das (und wirklich nur das!) ausführst - wird der Link tatsächlich woanders als in "C:\" erstellt?
    Das würde tatsächlich nach einem Bug riechen.
    Spontan vermute ich allerdings, dass dein Skript etwas umfangreicher ist und der Fehler an einer anderen Stelle zu suchen ist.
    Also mal wirklich nur ein Skript mit dieser einen Zeile ausführen und schauen was passiert.

    Kannst ja vielleicht nochmal folgende Ausgabe testen:

    AutoIt
    #include <AutoItConstants.au3>
    
    
    $dPID = Run(@ComSpec & " /c dir", "C:\", @SW_HIDE, $STDOUT_CHILD)
    ProcessWaitClose($dPID)
    ConsoleWrite(StdoutRead($dPID) & @CRLF)


    Wenn das Working-Dir korrekt angenommen wird sollte als Ergebnis die Datei/Verzeichnisliste von C:\ ausgegeben werden.

  • Ehhm ja.

    Jetzt bin ich etwas ratlos. Nachdem ich dein Testscript in der IDE und als EXE ausprobiert hatte und dort alles einwandfrei lief, habe ich jetzt auch noch mal eines meiner obigen Beispiele direkt ausgeführt - mit dem gleichen Resultat. Funktioniert problemlos.

    Demzufolge habe ich mir den Fehler also vorher beim Zusammenbasteln eingefangen. Die einzelnen Parameter kommen aus einem Array, welches die Maskierung mit chr(34) für die Pfade und den Linknamen schon besitzt, daher das etwas umständliche Aussehen im Beispiel. ;)

    Komischerweise hatte ich es ebenfalls mit direkter Anweisung, wie im Beispiel oben ausprobiert und da wollte es auch nicht.

    Gut, dann weiß ich jetzt zumindest wo ich zu suchen habe.

    Vielen Dank für deine Hilfe. :thumbup:

  • Deswegen nerv ich immer so mit dem Minimalbeispiel.
    Im Normalfall würde schon beim Erstellen eines Solchen auffallen, dass der Fehler doch woanders lauert als man ihn eigentlich vermutet hat.

    Hoffe mal du hast deine Fehlerquelle gefunden.

  • Ich hatte auch schon mit dem Gedanken gespielt, mal schnell ein Skript ausschließlich mit dieser einen Code-Zeile zu erstellen und separat zu testen. Keine Ahnung, warum ich das nicht gemacht habe.

    Inzwischen habe ich festgestellt, was die Ursache des Problems ist.

    Run[Wait]: Im Gegensatz zum ersten Parameter, darf der Pfad beim zweiten Parameter (WorkingDir) nicht maskiert sein! - er scheint hier implizit maskiert zu werden.
    ShellExecute[Wait]: Hier betrifft es den dritten Parameter(WorkingDir)