Aus Dateipfad, Ordnerpfad machen

  • Hi zusammen

    Ich habe in einer variablen einen Pfad zu einer Datei.
    Jetzt brauche ich für die Weiterverarbeitung aber nur den Pfad zum Ordner.
    Ich habs zwar hinbekommen, aber ich kann es nicht glauben das es nicht einfacher geht...
    Gibt es keinen direkten befehl wie 'lösche alle Zeichen von rechts bis zum \'?

    Hier was ich gebastelt habe.

    [autoit]

    #include <Constants.au3>
    #include <String.au3>
    $pfadimg='D:\TEMP\abc\xyz\IMG.jpg'
    $ordner=StringTrimRight($pfadimg,StringInStr(_StringReverse($pfadimg),'\')-1)
    ConsoleWrite($ordner); Die Ausgabe ist genau was ich brauche: D:\TEMP\abc\xyz\

    [/autoit]


    Edit, so ist es ein bischen verständlicher:

    [autoit]

    #include <Constants.au3>
    #include <String.au3>
    $pfadimg='D:\TEMP\abc\xyz\IMG.jpg'
    $temp1=StringInStr(_StringReverse($pfadimg),'\')
    $temp2=StringTrimRight($pfadimg,$temp-1)
    ConsoleWrite($temp2)

    [/autoit]

    4 Mal editiert, zuletzt von Sayen (27. März 2009 um 16:59)

  • Perfekt :rock:

    Wusste nicht dass man bei StringInString von rechts aus suchen konnte.
    Es ist so zwar nur ein biischen kürzer, aber cool das ich was neues weis :D

    Vielen Dank :thumbup:

  • Es ginge auch noch mit StringRegExpReplace:

    [autoit]


    $pfad='D:\TEMP\abc\xyz\IMG.jpg'
    $pfad = StringRegExpReplace($pfad, '(.*\\).*\..*', '$1')
    MsgBox(0,0, $pfad)

    [/autoit]

    Boa, der ist noch geiler, aber ich versteh den einfach nicht ?(

  • Es ginge auch noch mit StringRegExpReplace:

    [autoit]


    $pfad='D:\TEMP\abc\xyz\IMG.jpg'
    $pfad = StringRegExpReplace($pfad, '(.*\\).*\..*', '$1')
    MsgBox(0,0, $pfad)

    [/autoit]


    Passiert für $pfad= "C:\Programme\Toller.Ordner\ABC.txt" nicht folgendes:
    "C:\Programme":?:
    Da scheint mir die vorige Lösung sicherer (und leichter zu durchschauen...;))

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

    • Offizieller Beitrag

    Hier mal mit Kommentar:

    [autoit]


    $pfad='D:\TEMP\abc\xyz\IMG.jpg'
    $pfad = StringRegExpReplace($pfad, '(.*\\).*\..*', '$1')
    ; der . steht für ein beliebiges Zeichen
    ; der * dahinter bedeutet: 0 bis x mal, also beliebig oft
    ; dann folgt ein Backslash, der hat bei StringRegExp aber eine besondere Bedeutung,
    ; muss also maskiert werden (das geschieht mit einem Backslash) ergibt \\
    ; diese Gruppe ist in Klammern eingeschlossen, dass bedeutet, das man darauf verweisen kann (mit dem '$1' im Ersetzen-Parameter)
    ; danach folgt wieder .* was wieder für beliebig viele Zeichen steht
    ; dann folgt ein maskierter Punkt \. damit wird nach einem Punkt in der Zeichenkette gesucht
    ; und nach dem Punkt dürfen dann wieder beliebig viele Zeichen stehen .*
    ;
    ; wenn man der ersten Gruppe (.*\\) kein Fragezeichen ? hinzufügt, dann verhält sich StringRegExp
    ; sehr "gefrässig", schnappt sich also alles vom ersten Zeichen bis zum letzten Backslash
    ; das ist hier so gewollt, deshalb kein Fragezeichen
    ; anders wäre es, wenn man das so schreibt: (.*?\\)
    ; dann würde nur der Teil bis zum ersten Backslash ausgewählt werden.
    MsgBox(0,0, $pfad)

    [/autoit]
  • denke das passt grad hier^

    Wie bekommt man den "Namen" einer datei von heraus?

    Beispiel: D:\TEMP\abc\xyz\Name1.jpg
    =Name1

    mir fällt jetzt nur Stringleft ein^^ aber wie gehts dann weiter?

    bb team2way

  • nachdem mir persönlich der Vorschlag von Xeno am Besten gefallen hat würde ich das so machen:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    Dim $szDrive, $szDir, $szFName, $szExt
    $path = _PathSplit("D:\TEMP\abc\xyz\Name1.jpg", $szDrive, $szDir, $szFName, $szExt)
    MsgBox(0, '', $path[3])

    [/autoit]

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    über mich...

    ich habe meine Erfahrungen hauptsächlich gesammelt in (grobe Übersicht):

    - RibbonBar Automation
    - MySQL Nutzung
    - GUIs in vielerlei Ausprägung
    - Nutzung von Powershell / Batch in AutoIt
    - Windows Automatisierung

    außerhalb von AutoIt:

    - Sprachen: PS, Batch, php, html(5), javascript, (perl eingeschränkt), vbs
    - Powershell (AD, WPF inkl. Multi-Threading, ...)
    - Deployment-Automatisierung ohne SCCM
    - Office-Nutzung mit COM-Object (AutoIt, PowerShell)
    - ActiveDirectory und alles was damit zusammenhängt
    - Hyper-V Clustering (Converged / Hyper Converged)
    - Serverhardware (Konfiguration, Aufbau, Architektur, Betrieb)

    Lieblingsthema:

    günstige Automatisierung von Vorgängen, für die andere Firmen viel Geld nehmen

    more to come ...

  • [autoit]


    $path = "D:\TEMP\abc\xyz\Name1.jpg"
    $string = stringsplit($path, "\")
    $string2 = stringsplit($string[UBound($string)-1], ".")
    MsgBox(1, "", $string2[1])

    [/autoit]

    So gehts ohne #include.
    Keine Ahnung wie sinnvoll das ist - hab grad langeweile :D

  • Ich hab es mir noch ein wenig genauer angeschaut.

    Um einfach den Ordnerpfad rauszukriegen interessiert mich ja eigentlich der letzte Punkt, bzw. der Dateiname nicht.
    Also müsste ich doch einfach nur bis zum letzten backslash suchen oder?
    Also sollte das reichen?:

    [autoit]

    $pfad='D:\TEMP\a.b c\xyz\I M.G.jpg'
    $pfad = StringRegExpReplace($pfad, '(.*\\).*', '$1')
    MsgBox(0,0, $pfad)

    [/autoit]

    und um nur den Dateinamen rauszukriegen?:

    [autoit]

    $pfad='D:\TEMP\a.b c\xyz\I M.G.jpg'
    $pfad = StringRegExpReplace($pfad, '.*\\', '')
    MsgBox(0,0, $pfad)

    [/autoit]

    Es geht mir jetzt nicht drum es noch ein paar zeichen kürzer zu machen, sondern damit ich es besser verstehe ;)