_pathSplit Leerzeichen Problem im Dateinamen

  • Leerzeichen im Dateinamen werden nicht erkannt...
    Beispiel:
    der Pfad Lautet: x:\Bla\mein langes File.xyz
    wenn ich über

    [autoit]

    $path = _PathSplit($file, $szDrive, $szDir, $szFName, $szExt)

    [/autoit]


    die Datei

    [autoit]

    $szFName & $szExt

    [/autoit]


    Anzeigen will erhalte ich nur den ersten Teil "mein" der Datei...
    ich möchte das nicht mit Unterstrichen lösen.
    Gibts da nen Trick.

  • Hall Parry Hotter,

    also _PathSplit funktioniert bei mir (WinXP SP3) einwandfrei. Mit diesem Skript getestet:

    [autoit]

    #include <File.au3>
    #include <array.au3>
    Local $szDrive, $szDir, $szFName, $szExt
    $file = "x:\Bla\mein langes File.xyz"
    $path = _PathSplit($file, $szDrive, $szDir, $szFName, $szExt)
    _ArrayDisplay($path)
    MsgBox(0,"",$szFName & $szExt)

    [/autoit]

    Edit: falls du nur den Dateinamen möchtest kannst du es auch so machen:

    [autoit]

    $file = "x:\Bla\mein langes File.xyz"
    $path = StringSplit($file,"\")
    MsgBox(0,"",$path[$path[0]])

    [/autoit]

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (19. Januar 2011 um 02:58)

    • Offizieller Beitrag

    Hier noch ein paar Varianten:

    [autoit]


    $string = 'x:\Bla\mein langes File.xyz'

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

    $filename = StringSplit($string, '\')
    ConsoleWrite(' StringSplit: "' & $filename[$filename[0]] & '"' & @CR)

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

    $filename = StringMid($string, StringInStr($string, '\', 0, -1) + 1)
    ConsoleWrite(' StringMid: "' & $filename & '"' & @CR)

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

    $filename = StringTrimLeft($string, StringInStr($string, '\', 0, -1))
    ConsoleWrite(' StringTrimLeft: "' & $filename & '"' & @CR)

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

    $filename = StringRegExpReplace($string, '.+\\(.+)', '$1')
    ConsoleWrite(' StringRegExpReplace: "' & $filename & '"' & @CR)

    [/autoit]
  • Ha, super Forum, schnelle Antworten, Danke :thumbup:
    Ich habe jetzt alle hier vertredenden Varianten getestet, leider kein Erfolg.
    Was hab ich getan oder was will ich eigentlich ?:
    Ich habe Eure Vorschläge mal gesammelt und als EXE Kompiliert, Ausgabe über msgBox()

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <File.au3>
    #include <WindowsConstants.au3>

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

    Dim $szPath, $szDrive, $szDir, $szFName, $szExt, $Test_FILE, $file, $path

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

    For $i = 1 To $CmdLine[0]
    $file = $CmdLine[1]
    $path = _PathSplit($file, $szDrive, $szDir, $szFName, $szExt)
    $Test_FILE = $szFName & $szExt
    Next

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

    ;~ von autoBert :
    $path = StringSplit($Test_FILE,"\")
    MsgBox(0,"autoBert",$path[$path[0]])

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

    ;~ Alle Varaitionen von Oscar:
    $filename = StringSplit($Test_FILE, '\')
    ConsoleWrite(' StringSplit: "' & $filename[$filename[0]] & '"' & @CR)
    MsgBox(0, "Oscar", "StringSplit: " & $filename[$filename[0]])

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

    $filename = StringMid($Test_FILE, StringInStr($Test_FILE, '\', 0, -1) + 1)
    ConsoleWrite(' StringMid: "' & $filename & '"' & @CR)
    MsgBox(0, "Oscar", "StringMid: " & $filename)

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

    $filename = StringTrimLeft($Test_FILE, StringInStr($Test_FILE, '\', 0, -1))
    ConsoleWrite(' StringTrimLeft: "' & $filename & '"' & @CR)
    MsgBox(0, "Oscar", "StringTrimLeft: " & $filename)

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

    $filename = StringRegExpReplace($Test_FILE, '.+\\(.+)', '$1')
    ConsoleWrite(' StringRegExpReplace: "' & $filename & '"' & @CR)
    MsgBox(0, "Oscar", "StringRegExpReplace: " & $filename)

    [/autoit]


    Zum Ansteuern dieser Exe (per rechtclick-Kontextmenü) hab ich in der Registry einen Eintrag für z.B. icons gesetzt. Der Auszulesende Name währe in dem Beispiel
    "x:\Bla\mein langes File.ico"

    PHP
    [HKEY_CLASSES_ROOT\icofile\shell\TEST]
    "Icon"=""
    [HKEY_CLASSES_ROOT\icofile\shell\TEST\command]
    @="X:\\irgendwo\\Test.exe %1"


    Das ansteuern per Kontextmenü funktioniert soweit.
    ABER bei Allen Ausgaben bekomm ich leider nur den ersten Teil des Namens "mein" gefolgt von .....nichts......
    UND um das verkürzen von langen Dateinamen zu verhindern hab ich zusätzlich in der Registry folgende Werte verändert:

    PHP
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
    "NtfsDisable8dot3NameCreation"=dword:00000001


    Und nu häng ich fest.............

  • lass dir einmal alle Element von CMDLine ausgeben

    [autoit]

    _ArrayDisplay($CmdLine)

    [/autoit]

    danach sollte dir klar sein wo das Problem liegt. Abhilfe $CmdLineRaw verwenden,

    mfg autoBert

  • was kamm denn beim _arrayDisplay als Ausgabe? Bzw. was kommt bei ConsoleWrite($CmdLineRaw & @crlf) als Scite-Konsolenausgabe? Ich vermute nämlich, dass das Problem schon in der CmdLine existiert.

    mfg autoBert

  • Dann kannst du daraus doch wieder einen langen ungekürzten Dateinamen machen.
    Mit FileGetLongName().

    Was ansonsten AutoBert dir sagen möchte ist, dass du mal das CmdLine-Array ausgeben sollst damit du siehst das dir dort schon die Pfade zerteilt werden da sie nicht in Anführungsstrichen übergeben werden.
    Einfach mal ein #include <Array.au3> an den Anfang und die Zeile, welche AutoBert dir schrieb einfügen und du wirst sehen warum dir PathSplit gar nix anderes zurückgeben kann.

  • Na da siehst du doch schon was das Problem ist.
    Parameter werden per Leerzeichen getrennt(!) an ein Programm übergeben.
    In $CmdLine[1] steht also logischerweise alles bis zum ersten Leerzeichen.
    PathSplit kann dir also mit diesem Wert als Übergabe gar nicht den ganzen Dateinamen liefern weil es den Rest des Dateinamens nie zu Gesicht bekommt.
    Wenn man allerding will das ein Parameter mit enthaltenen Leerzeichen als ein Parameter behandelt wird so muss man ihn in Anführungsstriche setzen.
    Also hast du 2 Möglichkeiten:
    Entweder mit CmdLineRaw arbeiten (gegebenenfalls ein FileGetLongName dazu) oder gleich die Übergabe in der Registry richtig regeln:

    Code
    [HKEY_CLASSES_ROOT\icofile\shell\TEST\command]
    @="X:\\irgendwo\\Test.exe" "%1"