Probleme mit $CmdLine[$CmdLine[0]] in Script für Kontextmenü

  • Hallo,
    Ich bin neu hier im Forum und bis auf einige wenige Scripte, die ich schon geschrieben habe auch ein autoit Anfänger.

    Ich versuche, ein Script zu schreiben, das über das Kontextmenü von Windows eine Textatei in einem angeklickten Ordner erstellt. Die Textdatei soll den gleichen Namen wie der Ordner erhalten.

    Mein Problem ist, immer wenn ich im Script versuche über "$CmdLine[$CmdLine[0]]" den Ordnernamen auszulesen, der über den Kontextmenüaufruf übergeben wird, so wird die Datei zwar richtig benannt, aber nicht im gewünschten Ordner erstellt, sondern im Pfad einen Ordner drüber.
    Wenn ich einen festen Dateinamen vergebe, dann funktioniert alles. Das heißt die Datei wird im angeklickten Ordner erstellt.
    Hat jemand eine Idee, wo das Problem liegt, bzw. wie ich mein Ziel erreichen kann?

    Vielen Dak für Eure Hilfe!

    Einmal editiert, zuletzt von kamizoli (25. Dezember 2010 um 20:56)

  • Hab das ganze mal etwas verbessert. Probier mal jetzt ob es geht:

    Spoiler anzeigen
    [autoit]

    Opt('MustDeclareVars', 1)

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

    Local $notename, $text, $handle
    $notename = $CmdLine[$CmdLine[0]]
    $text = ClipGet()
    $handle = FileOpen($notename & ".txt", 2)
    FileWrite($handle, $text)
    FileClose($handle)
    ShellExecuteWait('notepad.exe', $notename & ".txt")

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Hallo Chip,
    dein Script ist zwar etwas schlanker, hat aber den gleichen Fehler. Die Textdatei wird nicht im angeklickten Ordner erstellt sondern einen Ordner darüber im Ordnerbaum.
    Wie schon gesagt, die "$CmdLine[$CmdLine[0]]" Funktion scheint etwas durcheinander zu bringen. Wenn man stattdessen einen festen Dateinamen angibt, ihn also nicht ausliest, dann funtioniert es. Habe schon ein paar andere ähnliche Scripte im Kontextmenü, die funktionieren, die erstellen aber Dateien und Ordner mit festen Namen.
    Das auslesen des Ordnernamens bringt irgendwie den Pfad durcheinander. Man müßte den Pfad also anders auslesen oder nach dem Auslesen mit "$CmdLine[$CmdLine[0]]" den Pfad für die Textdatei noch ändern.

    In dem Zusammenhang habe ich noch eine Frage."$CmdLine" überträgt nur 63 Zeichen, wenn mein Pfad länger ist, wo wird er dann abgeschnitten, am Anfang oder Ende? Kann es also sein, daß ich meinen Ordnernamen verliere?
    Müßte ich "$CmdLineRaw" nehmen? Wie könnte ich daraus meinen Orndernamen auslesen?

    Vielen Dank!

  • Lass dir doch einfach mal den Inhalt von $CmdLine[$CmdLine[0]] per Msgbox ausgeben. Dann sieht ja was drin steht.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Hallo Chip,
    der Inhalt von $CmdLine[$CmdLine[0]] ist der Name des markierten Ordners im Explorer. So weit stimmt es, da die Datei mit dem richtigen Namen erstellt wird, aber nicht im richtigen Ordner. Sie soll im markierten Ordner erstellt werden, aber sobald ich den Ordnernamen mittels $CmdLine[$CmdLine[0]] auslese, wird die Datei nicht mehr im markierten Ordner sondern in der Ordnerhirarchie eins über dem markiertem Ordner erstellt.
    Die Funktion ändert also etwas an dem übergebenen Pfad. Wie läßt sich das verhindern, bzw. wie kann ich den Ordnernamen auslesen und wenn nötig zum erstellen meiner Textdatei wieder in meinen gewünschten Ordner zurückspringen?
    Das Script scheint also zuerst im markierten Ordner ausgeführt zu werden, springt dann aber einen Ordner höher, nachdem ich $CmdLine[$CmdLine[0]] benutzt habe.

  • Hallo,

    ich denke es Liegt daran das du deinen Dateinamen nicht richtig aufgebaut hast du hast an das Verzeichnis einfach nur ein .txt an gehangen und nicht nicht & "\" & Verzeichnisnamen & ".txt"

    ich hab dir das mal aufgebaut

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    Opt('MustDeclareVars', 1)

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

    Local $DirName, $notename, $text, $handle,$szDrive, $szDir, $szFName, $szExt

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

    ;Der Ordnername wird definiert
    $DirName = StringSplit($CmdLine[$CmdLine[0]], "\")
    ;Dateiname wird Ordnernamen gleichgesetzt
    $notename = $CmdLine[$CmdLine[0]] & "\" & $DirName[$DirName[0]] & ".txt"
    ;Zwischenablage wird in die Variabel $text geschrieben
    $text = ClipGet()
    ;Die Beschreibungstextdatei ($notename.txt) wird erstellt
    $handle = FileOpen($notename, 2)
    FileWrite($handle, $text)
    FileClose($handle)
    ShellExecuteWait('notepad.exe', $notename)
    Exit

    [/autoit]
  • Super! So klappt es. Danke Dir Tigger1975!

    bis zu eine Pfadlänge von 169 Zeichen funktioniert es.
    Ich habe aber noch ein paar Verständnisprobleme. Warum benutzt Du "#include <File.au3>" so wie ich es sehe hast du nur standard Funktionen im Script.
    Warum ist es nötig mit "StringSplit" zu arbeiten, wo doch "$CmdLine[$CmdLine[0]]" alleine den Ordnernamen schon richtig ausgibt.

    Wofür sind die Variablen "$szDrive, $szDir, $szFName, $szExt" declared, ich finde sie später im Script nicht mehr. Oder hat das was mit dem Auflösen des "$CmdLine" Arrays zu tun?

    Finde es aber insgesamt seltsam, daß ich eine z.B. eine Datei info.txt in einem markierten Ordner über das Kontextmenü erstellen kann, ohne den Pfad anzugeben. Hier ein Beispiel von mir:

    Spoiler anzeigen
    [autoit]

    ;Script erstellt eine info.txt und eine .nfo Datei. Der Inhalt der Zwischenablage wird ausgelsen und als Text in die info.txt eingefügt und zum Bearbeiten geöffnet.
    ;der geänderte Text wird in die nfo Datei kopiert und die erste Textzeile wird der Dateinamen der nfo Datei.

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

    Opt('MustDeclareVars', 1)

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

    Local $text, $handle, $titel, $textn

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

    ;Zwischenablage wird in die Variabel $text geschrieben
    $text = ClipGet()

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

    ;info.txt
    $handle = FileOpen("info.txt", 2)
    FileWrite("info.txt", $text)
    FileClose($handle)
    ShellExecuteWait('notepad.exe', "info.txt")
    ;Die erste Textzeile wird extrahiert, um $titel für die .nfo Datei zu erstellen, danach wird der gesamte Text in $textn kopiert, um in die nfo Datei eingefügt zu werden.
    $handle = FileOpen("info.txt", 0)
    $titel = FileReadLine("info.txt", 1)
    $textn = FileRead("info.txt")
    FileClose($handle)

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

    ;.nfo Datei wird erstellt mit der ersten Zeile von $text als Titel und dem geänderten $textn von info.txt
    $handle = FileOpen($titel&".nfo", 2)
    FileWrite($titel&".nfo", $textn)
    FileClose($handle)
    Exit

    [/autoit]


    Genauso konnte mein Script oben eine Textdatei mit dem fest definierten Namen "Test" als "$DirName" bzw. "$notename" im markierten Ordner erstellen. Und über "$CmdLine[$CmdLine[0]]" habe ich den Ordnernamen richtig auslesen können. Verstehe also nicht ganz, warum durch den Gebrauch von "$CmdLine[$CmdLine[0]]" der Ordnerpfad beinflußt wird, in den meine Textdatei geschrieben wird.

    Hat dazu jemand eine Idee, ich würde es gerne verstehen.

    Danke!

    Einmal editiert, zuletzt von kamizoli (17. Dezember 2010 um 22:44)