shell.dll streikt, wenn die Gesamtlänge der Befehlszeile > 270 Zeichen ist.​

  • Da ich mein SciTE auf UTF-8 umgestellt habe, rufe ich via Ownhotkeys ein Script auf, dass mir das Script, das in SciTE im aktuellen Tab angezeigt wird, nach UTF-8 konvertiert.

    Gestern ist mir aufgefallen, dass die shell.dll (File/Product version : 1.5.0.0 / 1.5.0.0), die ich zum Starten des Scripts benutze, das Script nicht findet, wenn der Pfadname länger als 141 Zeichen ist, bzw. die Gesamtlänge der Befehlszeile > 270 Zeichen ist.

    sCmd = "C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /AutoIt3ExecuteScript "f:\AutoIt\AutoIt3_Tools\_ConvertFileToUTF8.au3" "M:\Temp\Test_01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234.au3"

    shell.exec(sCmd) -- funktioniert nicht, weil sCmd > 270 Zeichen!

    sCmd = "C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /AutoIt3ExecuteScript "f:\AutoIt\AutoIt3_Tools\_ConvertFileToUTF8.au3" "M:\Temp\Test_0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123.au3"

    shell.exec(sCmd) -- funktioniert, weil sCmd <= 270 Zeichen!


    Ich habe zwei Versionen der shell.dll, die allerdings beide File/Product version : 1.5.0.0 / 1.5.0.0 haben:

    shell_1.zip 133.120 KB

    shell_2.zip 35.328 KB

    Leider ist der Link zur shell.dll und auch zum Quellcode nicht mehr aktuell... und hier wird auch nur die Version 1.2 angezeigt: https://scite-ru.bitbucket.io/pack/tools/LuaLib/shell.html

    Hat evtl. jemand den Quellcode der shell.dll?

  • Bitnugger 28. Juni 2020 um 22:10

    Hat den Titel des Themas von „shell.dll streikt, wenn der Pfadname länger als 141 Zeichen ist.​“ zu „shell.dll streikt, wenn die Gesamtlänge der Befehlszeile > 270 Zeichen ist.​“ geändert.
  • Älterer Thread, aber ist das Problem gelöst?

    Dein Konvertier-Script könnte das zu konvertierende Original-Script in einen kurzen Pfad kopieren und dort konvertieren. Dann das Original-Script im langen Pfad umbenennen in "Original-Name-Bak.au3" und das konvertierte Script vom kurzen Pfad an die Stelle des ursprünglichen Scripts in den langen Pfad kopieren. Ich denke, SciTe übernimmt das konvertierte Script automatisch.

    Prof Bernd.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Älterer Thread, aber ist das Problem gelöst?

    Nein, ist es nicht.

    Der Vorteil an shell.exec() ist, dass so kein DOS-Fenster aufpoppt, was bei os.execute() leider der Fall ist. Zur Not könnte ich also os.execute() verwendenden und das Problem wäre gelöst...

    Dein Konvertier-Script könnte das zu konvertierende Original-Script in einen kurzen Pfad kopieren und dort konvertieren.

    Sorry, aber das ist quatsch... so weit komme ich mit shell.exec() ja gar nicht...

    PS: Habe meinen rechten Arm in Gips und kann nur mit links tippen... war drei Monate krank, wegen Knochenabsplitterung im Lendenwirbelbereich (Unfall), dann acht Tage arbeiten, und jetzt wieder für mindestens drei bis vier Monate krank (Unfall), weil mein Handgelenk Bekanntschaft mit dem Sägeblatt unserer Steinschneidemaschine gemacht hat... zum heulen...

  • so weit komme ich mit shell.exec() ja gar nicht...

    Verstehe. Das war auch nicht als fertige Lösung gedacht, sondern als Denkanstoß. :D

    Andere Idee. Mit welcher Sprache nutzt du shell.exec()? Ich vermute LUA!? Schreibe den Pfad in eine temp Text-Datei, die vom Au3-Script eingelesen wird.

    sCmd = "C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /AutoIt3ExecuteScript "f:\AutoIt\AutoIt3_Tools\_ConvertFileToUTF8.au3" "M:\Temp\Path.txt"


    shell.exec(sCmd)

    PS: Habe meinen rechten Arm in Gips und kann nur mit links tippen... war drei Monate krank, wegen Knochenabsplitterung im Lendenwirbelbereich (Unfall), dann acht Tage arbeiten, und jetzt wieder für mindestens drei bis vier Monate krank (Unfall), weil mein Handgelenk Bekanntschaft mit dem Sägeblatt unserer Steinschneidemaschine gemacht hat...

    Das ist hammerhart! =O Ich wünsche dir gute Genesung und dass du zukünftig von solchen Unfällen verschont bleibst!

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    • Offizieller Beitrag

    Habe bisher noch nicht so lange Pfade gehabt.

    Alternative:

    Hardlink auf einen kurzen Pfad erstellen (Partitionsbeschränkung beachten). Belegt keinen zusätzlichen Speicher, da defacto nur eine Datei, kann man auch nicht vergessen Änderungen zu übertragen.

    Geht natürlich nur, wenn deine Datenträger das unterstützen (USB Stick mit einer FAT - Variante fällt dann aus).

    • Offizieller Beitrag

    Auch wenn es dir nicht wirklich hilft, kann ich dir zumindest den (wahrscheinlichen) Grund dafür nennen.

    ShellExecuteA verwendet den Parameter LPCSTR lpFile,

    ShellExecuteW den Parameter LPCWSTR lpFile.

    Es ist davon auszugehen, dass in der Dll dieser Parameter qualifiziert wird, durch den Aufruf von GetFullPathNameA/W und diese wiederum ist limitiert durch MAX_PATH (256).

    Für den Unicode-Aufruf läßt sich das umgehen durch das Präfix "\\?\", also z.B. \\?\C:\path\file.ext, MAX_PATH wird dann auf 32.767 Zeichen erweitert.
    Kannst ja mal testen, ob das mit dieser Dll-Version auch möglich ist.

  • Für den Unicode-Aufruf läßt sich das umgehen durch das Präfix "\\?\"

    Mit \\?\ bzw. \\\\?\\ funktioniert es auch nur (shell und os), wenn die max. erlaubte Anzahl der Zeichen nicht überschritten wird.

    Als Workaround gefällt mir das Bsp. zu Test 2 am besten...

    shell = require "shell"

    os = require "os"

    -- Syntax: shell.exec (strCommand, [strOperation], [boolNoShow], [bWaitOnReturn])

    -- Syntax: os.execute([command])

    local sRepChar = 'x'

    --~ print(sRepChar:rep(10))

    -- Test 1 - shell.exec

    sCmd = '"C:\\Program Files (x86)\\AutoIt3\\SciTE\\..\\autoit3.exe" /AutoIt3ExecuteScript "f:\\AutoIt\\AutoIt3_Tools\\_ConvertFileToUTF8.au3" "M:\\Temp\\Test_0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123.au3"'

    shell.exec(sCmd) -- sCmd darf max. 268 Zeichen lang sein.

    --~ print("+ shell.exec("..sCmd:len()..") = ", shell.exec(sCmd), sCmd,'\n')

    -- Test 2 - shell.exec

    sCmd = '"f:\\AutoIt\\AutoIt3_Tools\\_ConvertFileToUTF8.au3" "M:\\Temp\\Test_'..sRepChar:rep(191)..'.au3"'

    shell.exec(sCmd, 'run') -- sCmd darf max. 259 Zeichen lang sein.

    --~ print("+ shell.exec("..sCmd:len()..") = ", shell.exec(sCmd, 'run'), sCmd,'\n')

    -- Test 3 - os.execute

    sCmd = 'cmd.exe /C ""C:\\Program Files (x86)\\AutoIt3\\SciTE\\..\\autoit3.exe" /AutoIt3ExecuteScript "f:\\AutoIt\\AutoIt3_Tools\\_ConvertFileToUTF8.au3" "M:\\Temp\\Test_'..sRepChar:rep(8003)..'.au3""'

    os.execute(sCmd) -- sCmd darf max. 8160 Zeichen lang sein.

    --~ print("+ os.execute("..sCmd:len()..") = ", os.execute(sCmd), sCmd,'\n')