Dateien nach Code verschieben

German support forum

Moderators: Hacker, Stefan2, white

User avatar
Kerstin83
Senior Member
Senior Member
Posts: 341
Joined: 2007-11-25, 10:18 UTC
Location: Hannover

Dateien nach Code verschieben

Post by *Kerstin83 »

Liebes Forum, :D :D

jetzt kommt mal eine echte Herausforderung an den TC. Geht wahrscheinlich nicht, aber wer weiß, der TC ist ja immer für eine positive Überraschung gut.

Also ich habe Ordner die mit einem 4-Stelligen Code (Jobnummern) beginnen. Und ich habe Dateien, die zu diesen Jobs gehören und ebenfalls mit diesem 4stelligen Code beginnen. Die Ordner sind alle in der gleichen Ebene der Ordnerstruktur.
Und alle Dateien sind auch in der gleichen (aber anderen) Ebene.

Gibt es mit dem TC die Möglichkeit, die Dateien in die Ordner zu verschieben, dass also jede Datei in den entsprechenden Ordner verschoben wird?
Beispiel:
Dateien:
1234 Datei 1
1234 Datei 2
1411 Datei 3
1411 Datei 4
1411 Datei 5

Ordner:
1234 Ordner A
1411 Ordner B

Es sollen die Dateien 1 und 2 in den Ordner A und die Dateien 3, 4 und 5 in den Ordner B verschoben/kopiert werden.

Wäre für mich eine echte Hilfe.

Mal sehen, obs sowas gibt, bin sehr gespannt.

Viele liebe Grüße

Von Kerstin
Last edited by Kerstin83 on 2017-01-06, 23:38 UTC, edited 1 time in total.
Ich hasse Leute, die Sätze nicht zuende
User avatar
HolgerK
Power Member
Power Member
Posts: 5411
Joined: 2006-01-26, 22:15 UTC
Location: Europe, Aachen

Post by *HolgerK »

Wenn ich mal annehme, dass die Ordner existieren und immer mit dem Schema "Nummer Name" im gleichen Pfad liegen wie die Dateien.
Zusätzlich, "Nummer" variabel aber immer vierstellig ist und "Name" -entgegen deinem Beispiel- immer identisch:

- Dateien -> MUT <Strg+M>
- Umbenennenmaske: Dateiname

Code: Select all

[N1-4] Ordner#!#[N]
- Erweiterung:

Code: Select all

[E]
- Suchen nach:

Code: Select all

#!#
- Ersetzen durch:

Code: Select all

/
- [start]

"#!#" ist eine beliebige Zechenfolge, die aus für Dateinamen gültigen Ziffern besteht, die weder im Dateinamen noch Ordernamen vorkommen.

Gruß
Holger
User avatar
Kerstin83
Senior Member
Senior Member
Posts: 341
Joined: 2007-11-25, 10:18 UTC
Location: Hannover

Post by *Kerstin83 »

Hallo Holger,

vielen Dank, sieht interessant aus. Die Voraussetzung ist allerdings leider nicht so.
Die Nummer ist zwar bei allen Dateien und Ordnern vierstellig, aber der Name ist sowohl bei Ordnern als auch bei den Dateien völlig unterschiedlich. Geht das dann auch irgendwie?
Ich hasse Leute, die Sätze nicht zuende
User avatar
HolgerK
Power Member
Power Member
Posts: 5411
Joined: 2006-01-26, 22:15 UTC
Location: Europe, Aachen

Post by *HolgerK »

Nein, mit TC-Mitteln alleine nicht.
Dazu wäre ein Script notwendig, der den Zielordner anhand der Nummer aus dem Dateisystem rauspickt (nur eindeutig, falls der Namensbestandteil "Nummer" in der Liste der Zielordnernamen denn auch immer nur einmalig vorkommt).
Wenn ich heute Abend mal Zeit habe, schau ich mal ob ich einen meiner VB-Scripte dahingehend umbauen kann.

Gruß
Holger
User avatar
Kerstin83
Senior Member
Senior Member
Posts: 341
Joined: 2007-11-25, 10:18 UTC
Location: Hannover

Post by *Kerstin83 »

Hallo Holger, also die 4stellige Nummer kommt immer nur einmal vor.
Ich hasse Leute, die Sätze nicht zuende
User avatar
HolgerK
Power Member
Power Member
Posts: 5411
Joined: 2006-01-26, 22:15 UTC
Location: Europe, Aachen

Post by *HolgerK »

Okay. Here we go:

- Den folgende Code markieren, per Copy&Paste in einem Textedior einfügen, und als "MoveFiles2SubFolder(matching).vbs" in einem Unterverzeichnis "Scripts" des TC-Programmverzeichnis abspeichern:

Code: Select all

If WScript.arguments.Count < 1 Then
  WScript.Echo "Parameter missing!"& VbCrLf & VbCrLf &_
      "Command   : MoveFiles2SubFolders(matching).vbs"& VbCrLf &_
      "Parameters: ""%L"" -4"& VbCrLf &_
      "Tooltip   : move all marked files into matching (first 4 characters) subfolders"& VbCrLf & VbCrLf &_
      " # first parameter: %L :Name of a list file with long file names including the complete path"& VbCrLf & VbCrLf &_
      " # second parameter (opt): 4 :number of characters to match"& VbCrLf &_
      "   negative value to supress expected messages ""Destination File exists (skipped)!"" "
  WScript.Quit 
End If

Const FOR_READING = 1
Const cNotFound = "Not Found!"
nLength = 4
sFileList = WScript.arguments.Item( 0 )
bSilent = false
If WScript.arguments.Count > 1 Then
  If WScript.arguments.Item( 1 ) < 0 Then bSilent = true
  nLength = abs( WScript.arguments.Item( 1 ) )
End If

Set oFSO = CreateObject( "Scripting.FileSystemObject" )

If  oFSO.FileExists(sFileList) Then

  Set oTextStream = oFSO.OpenTextFile( sFileList, FOR_READING )
  Do Until oTextStream.AtEndOfStream

  sFilePathName = oTextStream.ReadLine
  If  oFSO.FileExists( sFilePathName ) Then

    sPath = oFSO.GetParentFolderName( sFilePathName )
    sName = oFSO.GetBaseName( sFilePathName )
    sExtension = oFSO.GetExtensionName( sFilePathName )

    sMatchingFolder = MatchingFolder(sPath, Left( sName, nLength ))

    If Not sMatchingFolder = cNotFound Then

      sNewFilePathName = sMatchingFolder & "\" & sName & "." & sExtension
      If Not oFSO.FileExists( sNewFilePathName ) Then
        oFSO.MoveFile  sFilePathName, sNewFilePathName
      ElseIf Not bSilent Then
        WScript.Echo "Destination File exists (skipped)!: " & VbCrLf & sNewFilePathName
      End If

    ElseIf Not bSilent Then
       WScript.Echo "No matching Destination Folder found!" & VbCrLf & sFilePathName
	End if

  End If

  Loop
 
  oTextStream.Close
 
Else

  WScript.Echo "Input file list " & sFileList & " not found."
 
End If

dim sLastPath
dim oSubFolders

Function MatchingFolder(sPath,sPattern)

  If Not sPath = sLastPath Then
    set oFolder =  oFSO.GetFolder(sPath)
    set oSubFolders = oFolder.SubFolders
    sLastPath = sPath 
  End If

  For Each oFolder in oSubFolders 
    If left(oFolder.name,nLength) = sPattern Then
      MatchingFolder = sPath & "\" & oFolder.Name
      Exit Function
    End If
  Next   
  
  MatchingFolder = cNotFound

End Function
- Die Datei "MoveFiles2SubFolder(matching).vbs" auf eine leere Stelle der Buttonbar ziehen.

- Kontextmenu des neu erzeugten Button öffnen und "Ändern..." auswählen.

- Unter "Parameter:" Folgendes eintragen:

Code: Select all

"%L" 4
- Mit Beispieldaten zuerst ausprobieren ob der Script das leistet was du wolltest, bevor du den Script auf wichtige Daten loslässt:
- Dateien markieren
- Button drücken

Unter Parameter kann auch eine negative Zahl angegeben werden:

Code: Select all

"%L" -4
dann werden einige Fehlermeldungen wie:
"Kein passendes Unterverzeichnis gefunden!" / "Zieldatei existiert bereits!"
nicht ausgegeben.

Gruß
Holger
User avatar
norfie²
Power Member
Power Member
Posts: 1038
Joined: 2006-02-10, 07:27 UTC

Post by *norfie² »

Unter der Vorraussetzung, dass zwischen den Zahlen und den restlichen Namensbestandteilen ein Leerzeichen steht, funktioniert auch folgender Button.
Dazu untenstehenden "Code" in die Zwischenablage kopieren und als Button in eine Buttonbar einfuegen (rechte Maustaste ueber Buttonbar "Einfuegen")

Code: Select all

TOTALCMD#BAR#DATA
cmd /k@for /d %a in (*.*) do @for /f %b in ("%a") do @
move "%T"%%b*.* "%%a"
totalcmd.exe,3
Jobnummer-Datein in Jobnummer-Ordner verschieben


-1
im TCmd:
Links in das Verzeichnis mit den ganzen Dateien gehen
Rechts in das Verzeichnis mit den Verzeichnissen gehen
Fokus auf Rechts (Cursor in das Verzeichnis mit den Verzeichnissen).
Button klicken und Ende abwarten.
User avatar
Kerstin83
Senior Member
Senior Member
Posts: 341
Joined: 2007-11-25, 10:18 UTC
Location: Hannover

Post by *Kerstin83 »

wow :D :D , klappt beides super. Welche Methode nehme ich denn nun? :? Wer die Wahl hat... :?

Was visualbasic alles kann, ich glaube ich muss das auch mal lernen. Damit sind ja Sachen möglich, an die ich gar nicht zu denken wage. Ist VB schwer? Und womit macht man das am besten?

Wäre es auch möglich, nicht vorhandene Ordner automatisch zu erstellen? Nur die Nummer. In dem Beispiel also die Ordner 1234 und 1411, falls nicht vorhanden.

Ist so aber schon total super, vielen, vielen Dank. Und hat wieder sofort auf Anhieb geklappt.

Liebe Grüße

Kerstin
Ich hasse Leute, die Sätze nicht zuende
User avatar
norfie²
Power Member
Power Member
Posts: 1038
Joined: 2006-02-10, 07:27 UTC

Post by *norfie² »

Wäre es auch möglich, nicht vorhandene Ordner automatisch zu erstellen?
Ja.

Warnung: es sollten nur Dateien nach obigen Schema (Zahl, Leerzeichen, beliebiger Text) existieren!

Button

Code: Select all

TOTALCMD#BAR#DATA
cmd /k@for %a in (*.*) do @for /f %b in ("%a") do @
if not exist "%T"%%b*.* md "%T"%%b
totalcmd.exe,3
fehlende Jobnummer-Ordner erstellen


-1
im TCmd:
Links in das Verzeichnis mit den ganzen Dateien gehen
Rechts in das Verzeichnis mit den Verzeichnissen gehen
Fokus auf Links (Cursor in das Verzeichnis mit den Dateien).
Button klicken und Ende abwarten
User avatar
HolgerK
Power Member
Power Member
Posts: 5411
Joined: 2006-01-26, 22:15 UTC
Location: Europe, Aachen

Post by *HolgerK »

norfie² wrote:Warnung: es sollten nur Dateien nach obigen Schema (Zahl, Leerzeichen, beliebiger Text) existieren!
Nette Lösung.
Da sag mal noch einer das Leerzeichen in Dateien unnütz sind :wink:

Gruß
Holger
User avatar
HolgerK
Power Member
Power Member
Posts: 5411
Joined: 2006-01-26, 22:15 UTC
Location: Europe, Aachen

Post by *HolgerK »

Kerstin83 wrote:Ist VB schwer?
Eigentlich nicht. Ist halt Basic(*). Obwohl das auch manchmal seine Tücken haben kann.
Und womit macht man das am besten?
Also ich benutze dazu Notepad++ als Editor.
Es gibt bestimmt auch geeignetere Entwicklungsumgebungen, allerdings schreibe ich keine aufwändigen VB-Scripte die so was benötigen würden.
Alles was absehbar länger als 2 Bildschirmseiten wird oder aufwändige Userdialoge benötigt, gehört (außer es is seeehr einfach strukturiert) imho nicht mehr in einen Script.

Hilfreich, als offline-Nachschlagwerk, ist übrigens die Windows Script 5.6 Documentation.
Ansonsten ist das Internet voll mit Seiten die sich nur um Scripte drehen:
z.B. Script Center
Wäre es auch möglich, nicht vorhandene Ordner automatisch zu erstellen? Nur die Nummer. In dem Beispiel also die Ordner 1234 und 1411, falls nicht vorhanden.
Kein Problem.
Unterhalb der Zeile

Code: Select all

    sMatchingFolder = MatchingFolder(sPath, Left( sName, nLength ))
folgendes einfügen:

Code: Select all

    If sMatchingFolder = cNotFound Then
	  answer = MsgBox ( "No matching Destination Folder found!" & VbCrLf & sFilePathName& VbCrLf &_
						"Do You want to create a new Folder?" & VbCrLf & Left( sName, nLength )_
						, vbYesNo + vbQuestion )
	  If answer = vbYes Then
		sMatchingFolder = sPath & "" & Left( sName, nLength )
		oFSO.CreateFolder( sMatchingFolder )
      End If
    End If
Gruß
Holger

Edit: (*) Fundstück: Nettes Zitat von C. A. R. Hoare zum 60ten Geburtstag von Niklaus Wirth:
Recently, I took a look at the very popular programming language called VISUAL BASIC. Well, it's quite nice, but - forget about the BASIC. It's Pascal!
User avatar
norfie²
Power Member
Power Member
Posts: 1038
Joined: 2006-02-10, 07:27 UTC

Post by *norfie² »

Da sag mal noch einer das Leerzeichen in Dateien unnütz sind
Es geht so einfacher. Mittels "batch" lassen sich mittlerweile auch Teilstrings bearbeiten oder das Trennzeichen variieren. Dann wird es leicht aufwendiger. Meine Loesungen sind nur quick&dirty. Da wird nix abgeprueft, sondern auch im "Fehlerfall" stur alles abgearbeitet. Im ersten Fall (verschieben) ist es nicht weiter dramatisch, im zweiten Fall (Verzeichnisse erstellen) hat man danach vielleicht tausende Verzeichnisse neu erstellt. :roll: :mrgreen:
User avatar
Kerstin83
Senior Member
Senior Member
Posts: 341
Joined: 2007-11-25, 10:18 UTC
Location: Hannover

Post by *Kerstin83 »

Hallo, :D

ganz vielen Dank :D :D :D

Beide Versionen klappen super. Vielen Dank

Die Version mit dem Code TOTALCMD#BAR#DATA ... (wie heißt diese Art der Programme?) hat den kleinen Schönheitsfehler, dass das andere Modul die Ordner nicht erkennt. Wahrscheinlich, weil in den Ordnernamen kein Leerzeichen existiert.

Vielen Dank und ganz liebe Grüße

Kerstin
Ich hasse Leute, die Sätze nicht zuende
User avatar
norfie²
Power Member
Power Member
Posts: 1038
Joined: 2006-02-10, 07:27 UTC

Post by *norfie² »

Code TOTALCMD#BAR#DATA ... (wie heißt diese Art der Programme?)
Das ist nur der Inhalt der Zwischenablage eines Buttons ;)
Darin "versteckt" sind Befehle der Eingabeaufforderung aka Kommandozeilenbefehle, Batchprogramme, Scripte ...
dass das andere Modul die Ordner nicht erkennt.
Was ist "das andere Modul"?
weil in den Ordnernamen kein Leerzeichen
Es laesst sich auch fuer andere Trennzeichen modiifzieren.
Beispiel

Code: Select all

@for /d %a in (*.*) do @for /f "delims==ABCDEFGHIJKLMNOPQRSTUVWXYZÖÄÜabcdefghijklmnopqrstuvwxyzöäü-_+~.%,;#'°^´`'.()[]{} " %b in ("%a") do @echo %b
User avatar
Kerstin83
Senior Member
Senior Member
Posts: 341
Joined: 2007-11-25, 10:18 UTC
Location: Hannover

Post by *Kerstin83 »

Hallo nochmal, :D :D

und meinen Dank noch einmal. Das Modul erspart mir wirklich jede Menge Zeit. :D Ich habe mich für das VB Modul entschieden, weil es 1 Button ist, und dann alles automatisch abläuft. Ausserdem kann man das auch auf ganz andere Situationen anwenden, wenn man mehr als die ersten 4 Zeichen nehmen will.

Und da es so schön allgemein ist, hätte ich es gerne noch ein bisschen allgemeiner. :) :)
Wäre es irgendwie möglich, den Namen der Ordner nicht am Anfang des Dateinamens starten zu lassen sondern bei einem festgelegten späteren Zeichen Zeichen?

Ein ähnliches Beispiel wie am Anfang. Hier wäre das festgelegte spätere Zeichen an der Stelle nach Nummer1... also an Stelle 9:

Nummer1 123456 beliebiger Text A
Nummer2 123456 beliebiger Text B
Nummer3 141166 beliebiger Text D
Nummer4 141166 beliebiger Text E
Nummer6 141166 beliebiger Text F

(Nummer1 bis Nummer 6 haben alle die gleiche Ziffernlänge)

Diese Dateien sollen in Ordner Verschoben werden:

123456 beliebiger Text
141166 beliebiger Text

und die Ordner sollen wieder erstellt werden, wenn sie nicht existieren (dann kein beliebiger Text hinter die Ordnernummer)

Ich hoffe, das war verständlich.

Das wäre absolut super. :D
Ich habe das mal in dem Programm versucht und ein paar Parameter geändert, so einfach geht das aber leider nicht... :(

Liebe Grüße

Kerstin
Ich hasse Leute, die Sätze nicht zuende
Post Reply