Ordnernamen in Variable schicken

  • Hallo liebe Community,

    in meinem Script kann man mit dem Befehl:

    AutoIt
    Local $sUrsprungsordner = FileSelectFolder($sMessa, "")
    
    If @error Then
    	Local $bfehler = True
    Else
    	MsgBox($MB_SYSTEMMODAL, "", "Der Ursprungsordner ist:" & @CRLF & $sUrsprungsordner)
    EndIf

    einen Ordner auswählen. Dabei ist es mir wichtig das ich den Pfad des Ordner und den Namen des Ordners in zwei verschiedene Variablen geschickt bekomme. Das geht so wie es jetzt da ist wird aber nur der Pfad in die Variable $sUrsprungsordner eingetragen. Der bloße Ordnername fehlt.

    Kann mir bitte jemand helfen?

    Vielen Dank im Voraus!

    Einmal editiert, zuletzt von SOLVE-SMART (18. Februar 2025 um 19:53)

  • Keine Ahnung obs ne besser Möglichkeit gibt aber ich würde es so machen:

    AutoIt
    $sFolder = Stringsplit($sUrsprungsordner, '\')[Stringsplit($sUrsprungsordner, '\')[0]]
  • Mir würde zwar was anderes einfallen, das ist aber keinesfalls eleganter:klatschen:

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Frei nach Albert Einstein)

  • Moombas kannst du mir die Schreib-/ und Wirkweise deiner Zeile erklären?
    Mir ist diese Form der Verkettung neu.

    Mutet mir an wie die "|" Pipe in Powershell ^^

    MfG Schnuffel

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

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ausführbares Script ("as is"), dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

    Man möge mir verzeihen, wenn ich nicht perfekten und ideal lesbaren Code zur Verfügung stelle.
    Ich möchte Hilfe zur Selbsthilfe leisten und denke dass eine gewisse Transferleistung erwartet werden kann.

  • Schnuffel Es ist nur Zweimal der gleiche Befehl (StringSplit). Beim ersten StringSplit wird auf den Index zugegriffen, der bei dem zweiten StringSplit im ersten Feld steht.
    Bei StringSplit wird (, meiner Meinung nach nervigerweise, ) die Anzahl der Elemente im Array in den ersten Index geschrieben, was hier genutzt wird.

    Ich würde sagen: Es tut was es soll, sorgt aber für schlechtere Performance, nur um alles in eine Zeile zu bekommen. Der String wird 2x in alle Teile zerlegt, nur um beim 2ten mal die Anzahl der Teile zu nehmen und den Rest wegzuwerfen...

  • was die Zeile macht ist mir klar, aber dass die Zeile ohne "Verbindungszeichen" einfach nacheinander abgearbeitet wird habe ich nicht verstanden ;)

    MfG Schnuffel

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

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ausführbares Script ("as is"), dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

    Man möge mir verzeihen, wenn ich nicht perfekten und ideal lesbaren Code zur Verfügung stelle.
    Ich möchte Hilfe zur Selbsthilfe leisten und denke dass eine gewisse Transferleistung erwartet werden kann.

  • okay, meine Lösung wäre RegExp:

    AutoIt
    $sFolder = StringRegExp($sUrsprungsordner, '.*\\(.*)', 2)[1]

    MfG Schnuffel

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

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ausführbares Script ("as is"), dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

    Man möge mir verzeihen, wenn ich nicht perfekten und ideal lesbaren Code zur Verfügung stelle.
    Ich möchte Hilfe zur Selbsthilfe leisten und denke dass eine gewisse Transferleistung erwartet werden kann.

  • Hi zusammen 👋 ,

    wie heißt es so schön: "Alle Wege führen nach Rom".
    Am Ende ist es sicherlich Geschmackssache, auf welchem Wege man zum Ziel kommt und ob man RegEx mag oder nicht.
    Ich tue es, daher habe ich Schnuffels Variante aufgegriffen und hier zur Vollständigkeit des Beispiels einfach nochmal dargestellt:

    Viele Grüße
    Sven

  • Ist halt Geschmackssache Schnuffel und Kanashius.

    Ich wollte es nur simpel halten und ja schöner ist es erst das Array per Stringsplit zu erzeugen und dann den entsprechenden Eintrag zu generieren (wäre dann immernoch ein 2 Zeiler):

    AutoIt
    $sFolder = Stringsplit($sUrsprungsordner, '\')
    $sFolder = $sFolder[$sFolder[0]]

    Ob bei solch einer simplen Abfrage man wirklich noch auf Performance schauen muss, hängt davon ab wie oft dies durchgeführt wird.
    RegEx wollte ich auch erst machen, habe nur gedacht das der TE das noch weniger verstehen würde und wäre mir da bei der herangehensweise nicht zu 100% sicher gewesen.
    Edit: Ich würde dein RegEx auch um /b ergänzen zu .*\\(.+)\b das Sollte dann auch Pfade mit \ am Ende entsprechend nutzbar machen.

    Aber wie gesagt das ist Geschmackssache und ich verwende RegEx in der Regel nur bei Sachen, wo alles andere sonst total Umständlich bis zu unmöglich wäre es anders zu lösen ;)

    Achja.: OT ich selber bevorzuge 1 basierte Arrays Kanashius ;) Auch wenn deine Begründung Stichhaltig ist, so erspart es einem doch die Länge des Arrays (immer wieder) auszulesen oder in einer separaten Variable zu speichern (wenn man es mehrfach braucht). Für mich gehört es zu den Daten dazu. Auch wenns vielleicht kein perfektes Beispiel ist: Wie bei einem Buch mit Seite 1 (bzw. 0) als Inhaltsverzeichnis und jede Seite ist eindeutig einem Index zugeordnet (durch nummeriert).

    2 Mal editiert, zuletzt von Moombas (19. Februar 2025 um 08:51)

  • na dann verusuche ich hiermit mal alle mir gerade einfallenden und übernommen Eventualitäten mit abzufangen und in eine kleine Funktion zu packen:

    AutoIt
    ConsoleWrite("Prüfung C:\Test : " & _LastFolderofPath("C:\Test") & @CRLF)
    ConsoleWrite("Prüfung \\Server\Test : " & _LastFolderofPath("\\Server\Test") & @CRLF)
    ConsoleWrite("Prüfung C:\ : " & _LastFolderofPath("C:\") & @CRLF)
    ConsoleWrite("Prüfung \\Server :" & _LastFolderofPath("\\Server") & @CRLF)
    
    Func _LastFolderofPath($sPath)
    	$sFolder = StringRegExp($sPath, '([[:alpha:]]:.*\\|\\{2}.*\\)(.*)\b', 1)
    	If $sFolder = 0 Then Return SetError(1,0,"")
    	Return $sFolder[1]
    EndFunc

    Damit werden alle Pfade die einen Laufwerksbuchstaben haben in der Form (C:\Ordner) wie auch Netzwerkpfade erfasst (\\Server\Ordner)

    MfG Schnuffel

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

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ausführbares Script ("as is"), dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

    Man möge mir verzeihen, wenn ich nicht perfekten und ideal lesbaren Code zur Verfügung stelle.
    Ich möchte Hilfe zur Selbsthilfe leisten und denke dass eine gewisse Transferleistung erwartet werden kann.

    2 Mal editiert, zuletzt von Schnuffel (19. Februar 2025 um 10:02)

  • Es muss tatsächlich nicht immer RegEx sein aber damit könnte man etwas flexibler arbeiten und auf weitere Fälle ausdehnen. Z.B. ein abschließender Slash. Das kommt z.B. vor wenn man mit FileSelectFolder den Root-Ordner eines Laufwerkes auswählt.
    Mit RegEx könnte man das einfach mit behandeln - die anderen Lösungen hier würden da Probleme bekommen.

    Des Weiteren gibt es ja aber auch noch die Funktion _PathSplit(), welche eventuell leichter zugänglich ist (hierbei darf dann aber kein Punkt im Namen des Ordners vorkommen).

    Wenn man hingegen dennoch kein _PathSplit() oder RegEx nehmen möchte, dann muss es - wie Kanashius bereits andeutete - nicht unbedingt StringSplit sein. Es würde auch folgendes den gleichen Effekt erzielen:

    AutoIt
    $sFolder = StringTrimLeft($sUrsprungsordner, StringInStr($sUrsprungsordner, "\", 1, -1))


    Edit: Schnuffel Ein Errorhandling wäre vielleicht noch gut mit aufzunehmen. Ich denke da an FileExists() und FileGetAttrib() um herauszufinden ob wirklich ein existierender Ordnerpfad übergeben wurde oder eben doch etwas anderes. Und ein optionaler abschließender Slash/Backslash wäre auch gut, denn damit kann ein Ordnerpfad ja auch enden. Und überhaupt sind in Windows sowohl Slashes als auch Backslashes erlaubt - man müsste also noch die Slashes ebenfalls mit aufnehmen.

  • AspirinJunkie Hatte ich überlegt, aber man kann ja durchaus Pfade angeben, die gerade nicht erreichbar sind.

    MfG Schnuffel

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

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ausführbares Script ("as is"), dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

    Man möge mir verzeihen, wenn ich nicht perfekten und ideal lesbaren Code zur Verfügung stelle.
    Ich möchte Hilfe zur Selbsthilfe leisten und denke dass eine gewisse Transferleistung erwartet werden kann.

  • final:

    MfG Schnuffel

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

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ausführbares Script ("as is"), dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

    Man möge mir verzeihen, wenn ich nicht perfekten und ideal lesbaren Code zur Verfügung stelle.
    Ich möchte Hilfe zur Selbsthilfe leisten und denke dass eine gewisse Transferleistung erwartet werden kann.

  • verstehe ich nicht ^^

    C: ist ein MountPoint, der Ordnername nach dem ersten "\" ist demzufolge leer

    C:/ ist nach meinem Verständnis keine korrekte Pfadangabe für Ordner im Filesystem von Windows

    MfG Schnuffel

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

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ausführbares Script ("as is"), dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

    Man möge mir verzeihen, wenn ich nicht perfekten und ideal lesbaren Code zur Verfügung stelle.
    Ich möchte Hilfe zur Selbsthilfe leisten und denke dass eine gewisse Transferleistung erwartet werden kann.

  • Doch doch - Slashes sind genauso in Pfadangaben von Windows erlaubt:

    AutoIt
    ConsoleWrite(FileExists("C:/Windows") & @CRLF)


    C: ist ein MountPoint, der Ordnername nach dem ersten "\" ist demzufolge leer

    Wie ich sagte: Darüber lässt sich diskutieren.
    Für die Definition als "Ordner" spricht dessen Bezeichnung: "root directory" - also "Stammordner"

    Einmal editiert, zuletzt von AspirinJunkie (19. Februar 2025 um 10:46)

  • hängt wohl von der Sichtweise des Betrachters ab. ;)

    "/" ist aus der UNIX Welt und wird in Windows lediglich "übersetzt"

    filesystem "root" ist aus Sicht des Filesystems ein MountPoint und kein Ordner.

    Aus Sicht des Kernel ist C: ein Ordner, wie manch andere auch (Geräte, Registry und das Filesystem als solches)

    Da im Explorer ein Ordnername aber folgende Zeichen nicht beinhalten darf ist es schwierig den root-Ordner korrekt als Ordnername zurückzugeben ;)

    MfG Schnuffel

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

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ausführbares Script ("as is"), dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

    Man möge mir verzeihen, wenn ich nicht perfekten und ideal lesbaren Code zur Verfügung stelle.
    Ich möchte Hilfe zur Selbsthilfe leisten und denke dass eine gewisse Transferleistung erwartet werden kann.

  • Naja wenn stringlänge <= 3 dann root (also X:\), sonst dein regex (du Perfektionist :P ).

    Sprich deine Funktion minimal erweitert:

    AutoIt
    Func _LastFolderofPath($sPath)
    	If Length($sPath) <= 3 Then
    		Return StringLeft($sPath, 1) & ':\'
    	Else
    		$sFolder = StringRegExp($sPath, '([[:alpha:]]:.*\\|\\{2}.*\\)(.*)\b', 1)
    		If $sFolder = 0 Then Return SetError(1,0,"")
    		Return $sFolder[1]
    	Endif
    EndFunc
  • "/" ist aus der UNIX Welt und wird in Windows lediglich "übersetzt"

    Das ändert was? Pfade können überall in Windows mit Slash statt Backslash angegeben werden.
    Für deine Funktion, welche den Anspruch hat diesen Pfad korrekt zu zerlegen müssen ergo die Slashes ebenso beachtet werden.

    Da im Explorer ein Ordnername aber folgende Zeichen nicht beinhalten darf ist es schwierig den root-Ordner korrekt als Ordnername zurückzugeben ;)

    Dann müsstest du überlegen ob du folgenden Fall bei dir noch entsprechend anders behandeln möchtest (folgendes ist ein korrekter UNC-Pfad):

    AutoIt
    _LastFolderofPath("\\.\C:\")
  • ich stelle fest es gibt Menschen, die sehen Lösungen und teilen ihre Idee der Umsetzung und es gibt Menschen, die suchen Fehler geben aber keine Hilfestellung. Eine der beiden Seiten ist hilfreich.

    Nachdem der TO mit FileSelectFolder einen Ordnernamen haben möchte, ist eine Diskussion über was wäre wenn… nicht zielführend.

    Daher habe ich meinen Teil beigetragen.

    Den Rest überlasse ich den wahren Perfektionisten.

    Moombas Danke

    MfG Schnuffel

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

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ausführbares Script ("as is"), dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

    Man möge mir verzeihen, wenn ich nicht perfekten und ideal lesbaren Code zur Verfügung stelle.
    Ich möchte Hilfe zur Selbsthilfe leisten und denke dass eine gewisse Transferleistung erwartet werden kann.