Hier kann z.B. auch ein regulärer Ausdruck verwendet werden :
$target = @ScriptDir & '\' & StringRegExpReplace($sFileName, '(.*)\..*', "$1") & '\'
Wenn ich das verwende erstellt er brauchbare Ordner, aber er verschiebt die Datei nicht hinein
Hier kann z.B. auch ein regulärer Ausdruck verwendet werden :
$target = @ScriptDir & '\' & StringRegExpReplace($sFileName, '(.*)\..*', "$1") & '\'
Wenn ich das verwende erstellt er brauchbare Ordner, aber er verschiebt die Datei nicht hinein
Wenn ich das verwende erstellt er brauchbare Ordner, aber er verschiebt die Datei nicht hinein
Ich habe in das Skript von Moombas mal den regulären Ausdruck eingebaut :
Opt('MustDeclareVars', 1)
#include <MsgBoxConstants.au3>
CreateStructure()
Func CreateStructure()
Local $sFileName = "", $iResult = 0, $target
Local Const $hSearch = FileFindFirstFile("*.*")
If $hSearch = -1 Then
MsgBox($MB_SYSTEMMODAL, "", "Error: No files/directories matched the search pattern.")
Return False
EndIf
While 1
$sFileName = FileFindNextFile($hSearch)
If @error Then ExitLoop
If ($sFileName <> @ScriptName) Then
$target = @ScriptDir & '\' & StringRegExpReplace($sFileName, '(.*)\..*', "$1") & '\'
If Not FileExists($target) Then DirCreate($target)
FileMove(@ScriptDir & '\' & $sFileName, $target & $sFileName)
EndIf
WEnd
FileClose($hSearch)
EndFunc ;==>CreateStructure
Alles anzeigen
In meiner Teststruktur wird alles korrekt verschoben (Ausnahme, wie gesagt, der Sonderfall, dass Dateien ohne Extension vorhanden sind).
Bei meinen Test erstellt er die Ordner korrekt, eine .au3 Datei verschiebt er in den Ordner aber ohne Extension,
eine .mp4 verschiebt od. kopiert er gar nicht in die erstellten Ordner
Bei meinen Tests erstellt er die Ordner korrekt, eine .au3 Datei verschiebt er in den Ordner aber ohne Extension, eine .mp4 verschiebt od. kopiert er gar nicht in die erstellten Ordner
Das kann ich nicht nachvollziehen.
Verwendest Du wirklich das o.a. Skript, oder hast Du Teile davon in dein eigenes übernommen ?
Ich habe den Eindruck, dass wir es hier mit dem häufig (von z.B. Andy ) beschriebenen https://de.wikipedia.org/wiki/XY-Problem zu tun haben.
Meine Gedanken dazu (die alle nicht das beschriebene Problem betreffen):
Ansonsten schlage ich in die selbe Kerbe wie Musashi : Um das zu debuggen musst du uns das komplett unangetastete Skript zeigen, welches den Fehler erzeugt und die tatsächlichen (keine anonymisierten) Namen der Dateien in dem Ordner auflisten.
Opt('MustDeclareVars', 1)
#include <MsgBoxConstants.au3>
CreateStructure()
Func CreateStructure()
Local $sFileName = "", $iResult = 0, $target
Local Const $hSearch = FileFindFirstFile("*.*")
If $hSearch = -1 Then
MsgBox($MB_SYSTEMMODAL, "", "Error: No files/directories matched the search pattern.")
Return False
EndIf
While 1
$sFileName = FileFindNextFile($hSearch)
If @error Then ExitLoop
If ($sFileName <> @ScriptName) Then
$target = @ScriptDir & '\' & StringRegExpReplace($sFileName, '\.[^\.]+$', '') & '\'
If Not FileExists($target) Then DirCreate($target)
FileMove(@ScriptDir & '\' & $sFileName, $target & $sFileName)
EndIf
WEnd
FileClose($hSearch)
EndFunc ;==>CreateStructure
Alles anzeigen
Verwende dieses Script, da macht er alles mit .au3 Dateien richtig, aber die .mp4 Dateien will er nicht in den erstellten Ordner verschieben.
Vielleicht hat es was mit der größe der Dateien zu tun, hab da keine Ahnung.
Verwende ich dieses Script, da macht er alles mit .au3 Dateien richtig, aber die .mp4 Dateien will er nicht in den erstellten Ordner verschieben.
Vielleicht hat es was mit der Größe der Dateien zu tun, hab da keine Ahnung.
Mit der Größe hat es nichts zu tun.
Ich habe in meine Teststruktur eine .mp4-Datei mit 1GB eingefügt, und die wird problemlos in den erstellten Ordner verschoben. Generell gibt es keinen Grund, warum Dateien mit der Extension .au3 funktionieren, .mp4-Dateien hingegen nicht.
Kopiere bitte mal folgendes Skript in den Ordner wo deine Dateien liegen und führe es aus.
Opt('MustDeclareVars', 1)
#include <File.au3>
#include <Array.au3> ; nur zur Testanzeige mit _ArrayDisplay
Global $g_aFileList, $iError, $sErrorMsg
$g_aFileList = _FileListToArray(@ScriptDir & "\" , "*", 1, True) ; 1 = nur Dateien
$iError = @error
If Not $iError Then
_ArrayDisplay($g_aFileList)
Else
Switch $iError
Case 1
$sErrorMsg = "1 = Folder not found or invalid"
Case 2
$sErrorMsg = "2 = Invalid $sFilter"
Case 3
$sErrorMsg = "3 = Invalid $iFlag"
Case 4
$sErrorMsg = "4 = No File(s) Found"
Case Else
$sErrorMsg = "unbekannter Fehler"
EndSwitch
MsgBox(BitOR(4096, 16), "Fehler : ", $sErrorMsg & @CRLF)
EndIf
Alles anzeigen
Anschließend poste einen Screenshot des Arraydisplay-Fensters.
Nein - die Klammern sind überhaupt nicht dein Problem.
Das Problem ist das Leerzeichen vor dem Punkt.
Ordnernamen dürfen nicht auf Leerzeichen enden, deswegen wird ein Ordner ohne abschließendes Leerzeichen erzeugt aber der FileMove-Befehl schläg fehl, da dort das Leerzeichen noch drin steht.
Diesen Fall muss man also bei der Erzeugung des Zielordnernamens noch mit beachten:
Global $sFileName = "", $sDir
Global $hSearch = FileFindFirstFile(@ScriptDir & "\*")
If $hSearch = -1 Then Exit MsgBox(4096, "", "Error: No files/directories matched the search pattern.")
Do
$sFileName = FileFindNextFile($hSearch)
If @error Then ExitLoop
If @extended Or ($sFileName = @ScriptName) Then ContinueLoop
$sDir = @ScriptDir & '\' & StringRegExpReplace($sFileName, '\h*\.[^.]+$', '') & '\' & $sFileName
FileMove(@ScriptDir & '\' & $sFileName, $sDir, 9)
Until 0
FileClose($hSearch)
Alles anzeigen
Und jetzt verstehst du hoffentlich auch mal warum wir ganz konkret nach den tatsächlichen Dateinamen fragen.
Wir fragen nicht zum Spaß.
Vielen Dank für die Hilfe, jetzt läuft das Perfekt.
Worauf man nicht alles achten muss, allein hätte ich das nicht gefunden.
Gruß Abraham
Und bei meinenm Beispiel Code war die Prüfung ob ein Ordner existiert bereits drin (sonst wird eben keiner erstellet, nur verschoben; Zeile 21).
Aber das man vor dem . ein Leerzeichen haben könnte habe ich in der Tat nicht bedacht...auf so eine Idee würde ich nie kommen
Danke an die Anderen, dass sie sich dessen angenommen haben
Und bei meinenm Beispiel Code war die Prüfung ob ein Ordner existiert bereits drin (sonst wird eben keiner erstellet, nur verschoben; Zeile 21).
War das an mich adressiert?
Mein Punkt war, dass eben diese ganze Zeile gar nicht notwendig ist, da FileMove() diese Funktionalität gleich mitbringt.
Einfach eine 8 als 3. Parameter eintragen und fertig.
Das würde auch ein weiteres Randphänomen in deinem Skript mit beseitigen:
Erstelle mal einen Ordner (keine Datei) mit dem Namen Mein.Ordner und schau was mit der DirCreate-Zeile daraus gemacht wird.
Aber das man vor dem . ein Leerzeichen haben könnte habe ich in der Tat nicht bedacht...auf so eine Idee würde ich nie kommen
Ich ebenso niemals. Deshalb hab ich ja so auf die konkreten Namen gedrängt.
Man versucht ja immer jeden Randfall gleich mit zu bedenken aber es wird immer Fälle geben, an die man eben nicht gedacht hat.
Daher kommt kein Programm ohne anschließende Testung aus.
Das würde auch ein weiteres Randphänomen in deinem Skript mit beseitigen:
Erstelle mal einen Ordner (keine Datei) mit dem Namen Mein.Ordner und schau was mit der DirCreate-Zeile daraus gemacht wird.
Also als ich das mit einer Datei als basis mit 2 Punkten im Namen gestestet (da_block.png.test) habe (der Ordnername hat dann zwangsläufig auch einen: da_block.png), lief das Einwandfrei.
Was macht es denn deiner Meinung nach (lerne gerne wieder was dazu ;))?
Ordner - nicht Datei.
Wenn du einen Ordner mit dem Namen Mein.Ordner im Verzeichnis hast (z.b. bei einem erneuten Durchlauf), dann wird ein leerer Ordner namens Mein erzeugt.
Umgehen kann man dies, wie oben vorgeschlagen, durch einen Extra-Check ob Ordner gefunden wurden oder auch durch das Weglassen der DirCreate-Zeile und stattdessen dem Parameter bei FileMove.
Ich hab das schon verstanden, die Datei ist ja nur Quelle als Namensgeber, mehr nicht.
Beispiel:
Dateiname: da_block.png.test
Resultierender Ordnername: da_block.png
Das kann ich nicht nachvollziehen mit meinem Skript (dort ist die Prüfung ja drin ob der entsprechende Ordner bereits existiert).Wenn ich jedoch, wie von dir angegeben, "$FC_CREATEPATH" in Filemove verwende (und das dircreate auskommentiere), wird kein Ordner erstellt. > Slashes richtig rum gedreht und geht, war mein Fehler, nachvollziehen kann ich deine obige Aussage jedoch nicht.
Ich hab das schon verstanden, die Datei ist ja nur Quelle als Namensgeber, mehr nicht.
Beispiel:
Dateiname: da_block.png.test
Resultierender Ordnername: da_block.pngDas kann ich nicht nachvollziehen mit meinem Skript (dort ist die Prüfung ja drin ob der entsprechende Ordner bereits existiert).
[...] nachvollziehen kann ich deine obige Aussage jedoch nicht.
Bis hierhin ist ja wie gesagt auch alles korrekt so wie es sein soll. Bis hierhin hast du ja keine Ordner mit Punkten im Namen drin.
Nun nach Skriptausführung hast du jedoch einen Ordner(!) namens "da_block.png" im Verzeichnis.
Nun führe dein Skript erneut aus.
Resultat: Nun wird ein Ordner "da_block" erzeugt und es kommt folgendes Phänomen von FileMove() zum Tragen:
Werden als Quelle und Ziel zwei vorhandene Ordnernamen angegeben, dann werden alle Dateien aus dem Quellordner in den Zielordner verschoben.
Das heißt: Nun hast du einen Ordner namens "da_block", in welchem die Datei da_block.png.test liegt. Zusätzlich hast du einen leeren Ordner namens da_block.png.
Stattdessen war das gewünschte Ziel: Ein Ordner namens da_block.png in welchem die Datei da_block.png.test liegt.
Um das zu lösen musst du wie mehrmals gesagt, Ordner von der Prozessierung ausschließen.
Edit: Vielleicht verstehe ich langsam worauf du hinausmöchtest: Nur allein mit dem 3. FileMove-Parameter löst man das Problem tatsächlich nicht. Es bedarf zusätzlich der Abfrage ob es sich um einen Ordner handelt (siehe mein Skript oben).
Möp, jetzt weiß ich warum ich das nicht nachvollziehen konnte.
Ich hatte die vorhandene da_block.png erweitert und getestet.
Den Ordner "da_block" gab es daher schon (ebenso die entsprechende Datei) und daher auch keine Probleme.
Ja, schon blöd und du hast recht
Man sollte die Testumgebung halt frei von solchen Möglichkeiten halten.
Und auch hier wieder: Ich habe das nicht vorhergesehen.
Erst mit komischen Testdaten stößt man auf solche Besonderheiten.