josken69
Goto Top

Unterverzeichnisse finden und umbenennen und Dateien verschieben

Hallo Batch-Experten

ich hab folgende Aufgabe:
Unterverzeichnisse der 3. Ebene umbenennen und Dateien daraus in ein anderes Unterverzeichnis verschieben. Also konkret am Beispiel
Verzeichnis: C:\Alles
      • Unterverzeichnis A1
              • Unterverzeichnis 5_7_Plana
              • Unterverzeichnis 5_8_Planb
      • Unterverzeichnis B1
              • Unterverzeichnis 5_7_Plana
              • Unterverzeichnis 5_8_Planb
Also ich möchte im Verzeichnis Alles starten, Dann dort alle Unterverzeichnisse durchlaufen und on diesem Unterverzeichnis das Unterverzeichnis 5_7_Plana finden. Alle Dateien von dort in das Unterverzeichnis 5_8_Planb verschieben und anschliessend das Unterverzeichnis 5_7_Plana ind 5_7_XYZ umbenennen. So soll das gesamte Vezeichnis C:\Alles durchlaufen werden und entsprechend die Verzeichnis bearbeitet werden.
Habe mir schon verschiedene Beispiele mit move und rename hier angesehen, bekomme es aber aufgrund mangelnder Batch-Programmier-Kenntnisse einfach nicht hin- Wie wechsel ich am besten in die entsprechenden Unterverzeichnisse, suche nach dem Verzeichnis, das mit 5_7_ anfängt und verschiebe von dort in das Verzeichnis 5_8 des selben Zweigs?
Vielen Dank
Gruß Josh
Kommentar vom Moderator Biber am Nov 19, 2009 um 19:59:10 Uhr
Auch im Sourcecode wird der running gag counter natürlich hochgepusht...
wscript.echo K & ": Bennene " & NeuPfad(k) & " um in: " & NeuPfadNeu

Merke: ich bennene um, du bennenst um, er/sie/es bennent um...
#rgc = 627

Content-Key: 129458

Url: https://administrator.de/contentid/129458

Printed on: April 19, 2024 at 19:04 o'clock

Member: TsukiSan
TsukiSan Nov 18, 2009 at 06:39:26 (UTC)
Goto Top
hallo josken69,

gesetz dem Fall, deine Ordnerstruktur bleibt wie besagt und die Namen der Ordner ist ähnlich dann müsste folgendes Script in VBS bei dir funktionieren:
Dim Pfadangabe, Ordner, NeuPfad(10000), I

Ordner = InputBox("Bitte Pfad eingeben","...","D:\Alles\")  

set fs = createobject("Scripting.FileSystemObject")  

I = 0

Listordner Ordner

Sub ListOrdner(ordner)
	Set ordner = fs.getfolder(ordner)

	'On Error resume next  

	For Each file In ordner.files
		Pfadangabe =File.path
		PfadNeu = split(Pfadangabe , "\")  
		If Ubound(PfadNeu) = 4 then
		DateiName = PfadNeu(Ubound(PfadNeu))
		PfadNeuF = PfadNeu(0) & "\" & PfadNeu(1) & "\" & PfadNeu(2) & "\" & Left(PfadNeu(3),len(PfadNeu(3))-1) & "b\" & Dateiname  
		'wscript.echo Pfadangabe & " verschoben nach --> " & PfadNeuF  
		FS.MoveFile Pfadangabe , PfadNeuF
		End If
	Next
	

	For Each Unterordner In Ordner.subfolders
		PfadNeu = split(Pfadangabe , "\")  
		If Ubound(PfadNeu) = 4 then
		NeuPfad(i) = PfadNeu(0) & "\" & PfadNeu(1) & "\" & PfadNeu(2) & "\" & PfadNeu(3)  
		I = I + 1
		End if

		Pfadangabe = unterordner.path
		Listordner unterordner
	next
End Sub


for k = 0 to I - 1
	NeuPfadNeu = neupfad(k)
	NeuPfadNeu = Left(NeuPfadNeu,Len(NeuPfadNeu) - 1) & "xyz"  
	
	'wscript.echo K & ": Bennene " & NeuPfad(k) & " um in: " & NeuPfadNeu  
		
	FS.MoveFolder NeuPfad(k) , NeuPfadNeu
	k = k + 1
next


msgbox "Fertig"  
Zum Testen hatte ich mir folgende Ordnerstruktur angelegt:
C:\Alles\
Unterordner1\
Plan_a\
Plan_b\
Unterordner2\
Plan_a\
Plan_b\
Unterordner3\
Plan_a\
Plan_b\
Unterordner4\
Plan_a\
Plan_b\
usw. In jeweils der Ordner "Plan_a" habe ich mehrere verschiedene Dateien abgelegt.
Das Script verschiebt alle Dateien vom Ordner Plan_a nach Plan_b und bennent nur den Ordner Plan_a nach Plan_xyz um.
Du kannst dir das Script noch anpassen.

Gruss
Tsuki

Ps.: es ist egal, wie die beiden Ordner der Ebenen 1 und 2 heißen! Wichtig ist nur, das die 2 Ordner in Ebene3 als erstes der ordner mit den dateien kommt und als 2tes der leere Ordner. Habe mich an deine Vorgabe gehalten!
Member: josken69
josken69 Nov 19, 2009 at 09:07:55 (UTC)
Goto Top
Hallo Tsuki,
vielen Dank für die Hilfe. Ich habe Dein Script als Grundlage genommen und es auf meine Bedürfnisse angepasst, aber irgendwie bekomme ich es nicht zum fliegen.
Nochmal zur Spezifizierung der Aufgabe. In den Unterordnern die du ín deinem Script mit 1-4 durchnummeriert hast liegen sehr viele Unterordner. Bei mir sollen nur die mit 5_7_ und 5_8_ behandelt werden. Deswegen habe ich in meinem Script noch eine Abfrage darauf gemacht. Zusätzlich soll ein Verzeichnis 5_9_Uebersichtsplan erzeugt werden.
Was wunderbar funktioniert ist das Verschieben der Dateien aus den Unterordnern 5_7_ nach 5_8_. Auch das neue Verzeichnis wird korrekt erzeugt.
Was aber überhaupt nicht funktioniert ist das Umbennen der Verzeichnisse 5_7_ und 5_8_ danach. Hier habe ich arge Probleme mit den For-Schleifen. Entweder wird der letzte Eintrag verschluckt (s. Kommentar im Script), sodaß meine Variable Neupfad nicht alle zu verarbeitenden Verzeichniss enthät oder aber die Schleife läuft nicht in Einer-Schritten ab, sodaß nicht alle Verzeichnisse in der Variable Neupfad umbenannt werden.
Was mache ich hier noch falsch??
Vielen Dank
Dim Pfadangabe, Ordner, NeuPfad(), I, NeuFolder, Suchzeichen, Pos1,  Suchzeichen2, Pos2
SuchZeichen = "5_7_"  
SuchZeichen2 = "5_8_"  
Ordner = InputBox("Bitte Pfad eingeben","...","C:\Alles\")  

set fs = createobject("Scripting.FileSystemObject")  
i = -1

Listordner Ordner

Sub ListOrdner(ordner)
	Set ordner = fs.getfolder(ordner)
'Dieser Teil funktioniert  
	For Each file In ordner.files
		Pfadangabe =File.path
		PfadNeu = split(Pfadangabe , "\")  
		If Ubound(PfadNeu) = 4 then
			If Left(PfadNeu(3),4) ="5_7_" Then  
			DateiName = PfadNeu(Ubound(PfadNeu))
			PfadNeuF = PfadNeu(0) & "\" & PfadNeu(1) & "\" & PfadNeu(2) & "\" & "5_8_Abwasser_Absperrplan\" & Dateiname  
			FS.MoveFile Pfadangabe , PfadNeuF
			End If
		End If
	next
	
	
'Dieser Teil funktioniert nicht korrekt, da der letzte zu verarbeitende subfolder nciht mehr verarbeitet wird  
	For Each Unterordner In Ordner.subfolders
		PfadNeu = split(Pfadangabe , "\")  
				
		If Ubound(PfadNeu) = 4 then
		Pos1 = InStrRev(Pfadangabe, SuchZeichen)  
		Pos2 = InStrRev(Pfadangabe, SuchZeichen2)
				
			if Pos1 <> 0 Or Pos2 <> 0 Then
				i = i + 1
				Redim Neupfad(i)
				NeuPfad(i) = PfadNeu(0) & "\" & PfadNeu(1) & "\" & PfadNeu(2) & "\" & PfadNeu(3)  
				strNewpath = PfadNeu(0) & "\" & PfadNeu(1) & "\" & PfadNeu(2) & "\5_9_Uebersichtsplan"  
				
					If Not fs.FolderExists(strNewpath) then 
						strNewpath = fs.CreateFolder(strNewpath)
					End if
							
			End if
		End if
		
		Pfadangabe = unterordner.path
		Listordner unterordner
		
	Next
	
End Sub

'Dieser Teil funktioniert überhaupt nicht, da immer in 2er Sprüngen verarbeitet wird  
k=0
For k = lbound(neupfad) To ubound(neupfad) Step 1 

   	NeuPfadNeu = neupfad(k)
	Pos1 = InStrRev(NeuPfadNeu, SuchZeichen)  
	Pos2 = InStrRev(NeuPfadNeu, SuchZeichen2)  
		if Pos1 <> 0 Then
			NeuPfadNeu = Left(NeuPfadNeu,Pos1-1) & "5_7_Linienpläne"  
			wscript.echo K & ": Bennene " & NeuPfad(k) & " um in: " & NeuPfadNeu  
			FS.MoveFolder NeuPfad(k) , NeuPfadNeu
		End if
		if Pos2 <> 0 Then
			NeuPfadNeu = Left(NeuPfadNeu,Pos2-1) & "5_8_Energie_Abwasser_Absperrplan"  
			wscript.echo K & ": Bennene " & NeuPfad(k) & " um in: " & NeuPfadNeu  
			FS.MoveFolder NeuPfad(k) , NeuPfadNeu
		End if
			k = k + 1
	
next

msgbox "Fertig"  
Member: TsukiSan
TsukiSan Nov 19, 2009 at 12:59:22 (UTC)
Goto Top
Hallo josken69,

"die Kuh holen wir vom Eis" face-wink
Ich schau mir das mal an und mache mir ein paar Skizzen.

Bis spaeter.Muss nochmal wech.

Gruss
Tsuki
Member: TsukiSan
TsukiSan Nov 20, 2009 at 05:29:41 (UTC)
Goto Top
Hallo josken69,

berichtige mich, wenn ich deinem Gedankengang immer noch nicht ganz gefolgt bin.
Hier nochmal meine Version deiner Ausgangssituation:
1) Ein Hauptordner (in deinem Beispiel: C:\Alles)
2) Hauptordner hat mehrere Unterordner (2.Ebene)
3) Die Ordner 2. Ebene haben jeweils 2 Ordner (3.Ebene {5_7_etc und 5_8_etc)
4) Es sollen alle Dateien (falls vorhanden) von Ordner 5_7_etc nach 5_8_etc verschoben werden
5) Ordner 5_7_ und Ordner 5_8_ sollen jeweils umbenannt werden
6) In alle Ordner von Ordner 2. Ebene sollen neue Ordner nach dem Muster 5_9_etc erstellt werden.

Nach diesen Gedankengang und im Zusammenschluss unserer beiden vorhergehenden Scripte habe ich folgendes
zusammengefasst:
Dim Ordner
Dim NeuPfad()
Dim PfadBisEbeneZwei(100) , IPfade2
Dim PfadBisEbeneDrei(100) , IPfade3
Dim PfadKomplett(100,1)
Dim Pfad5_7_Anhaengsel , Pfad5_8_Anhaengsel
Dim NeuOrdner5_9_Neu
Dim SucheStrA , SucheStrB
Dim PfadAngabe

Ordner = InputBox("Bitte Pfad eingeben","...","C:\Alles\")  
Pfad5_7_Anhaengsel = "5_7_LinienPlaene"  
Pfad5_8_Anhaengsel = "5_8_Energie_Abwasser_Absperrplan"  
SucheStrA = "5_7_"  
SucheStrB = "5_8_"  



set fs = createobject("Scripting.FileSystemObject")  
IPfade2 = 1
IPfade3 = 1

Listordner Ordner
Sub ListOrdner(ordner)
	Set ordner = fs.getfolder(ordner)

	For Each file In ordner.files
		'Pfadangabe =File.path  
		
	next
	

	For Each Unterordner In Ordner.subfolders
		Pfadangabe = unterordner.path

		PfadNeu = split(Pfadangabe , "\")  

		If Ubound(PfadNeu) = 3 then
			Temp1 = InStr(Pfadangabe,SucheStrA)
			If Not Temp1 = 0 then 
				PfadBisEbeneDrei(IPfade3) = Pfadangabe
				IPfade3 = IPfade3 + 1
			End If
			
			Temp2 = InStr(Pfadangabe,SucheStrB)
			If Not Temp2 = 0 then 
				PfadBisEbeneDrei(IPfade3) = Pfadangabe
				IPfade3 = IPfade3 + 1
			End If
'50:  
			Temp = PfadNeu(0) & "\" &  PfadNeu(1) & "\" & PfadNeu(2) & "\"		  
			If Not Temp = PfadBisEbeneZwei(IPfade2 -1) Then
				PfadBisEbeneZwei(IPfade2) = TemP
				IPfade2 = IPfade2 + 1
			End If
				
		End if
		
		Listordner unterordner
	Next
	
End Sub

For m = 0 to UBound(PfadBisEbeneDrei)
	If not PfadBisEbeneDrei(m) = "" Then  
		PfadKomplett(m,0) = PfadBisEbeneDrei(m)
		PfadKomplett(m,1) = PfadBisEbeneDrei(m + 1)
		Set Ordner = fs.GetFolder(PfadKomplett(m,0))
		For Each file In ordner.files
		Pfadangabe = File.path
		PfadNeu = split(Pfadangabe , "\")  
		DateiName = PfadNeu(Ubound(PfadNeu))			
			WScript.Echo "Verschiebe Datei:" & PfadKomplett(m,0) & "\"  & DateiName &  "  nach: " & PfadKomplett(m,1) & "\"  & DateiName  
			'FS.MoveFile PfadKomplett(m,0) & "\"   & DateiName , PfadKomplett(m,1) & "\"  & DateiName  
		Next
		Pfadangabe = PfadBisEbeneDrei(m)
		PfadNeu = split(Pfadangabe , "\")  
			PfadKomplettNeu = PfadNeu(0) & "\" & PfadNeu(1) & "\" & PfadNeu(2)& "\" & Pfad5_7_Anhaengsel  
			WScript.Echo "Benenne Pfad: " & PfadKomplett(m,0) & "  um nach: " & PfadKomplettNeu  
			'FS.MoveFolder PfadKomplett(m,0) , PfadKomplettNeu  
			PfadKomplettNeu = PfadNeu(0) & "\" & PfadNeu(1) & "\" & PfadNeu(2)& "\" & Pfad5_8_Anhaengsel  
			WScript.Echo "Benenne Pfad: " & PfadKomplett(m,1) & "  um nach: " & PfadKomplettNeu  
			'FS.MoveFolder PfadKomplett(m,1) , PfadKomplettNeu  
		m = m + 1
		End If
Next


For l = 0 to UBound(PfadBisEbeneZwei)
	If not PfadBisEbeneZwei(l) = "" Then  
		NeuOrdner5_9_Neu = PfadBisEbeneZwei(l) & "5_9_Uebersichtsplan"   
		If Not fs.FolderExists(NeuOrdner5_9_Neu) then
			WScript.Echo "Erstelle Neuen Ordner:" & NeuOrdner5_9_Neu  
			'NeuOrdner5_9_Neu = fs.CreateFolder(NeuOrdner5_9_Neu)  
		End if
	End If
Next



WScript.Echo "Fertig"  

Die "Aktionen" (also verschieben, Ordner anlegen etc.) habe ich erst einmal auskommentiert und es werden nur Meldungen ausgegeben, was gemacht werden würde (2.Stufe Konjunktiv face-wink )
Zum Testen speichere doch bitte mal den Script in eine VBS-File (.z.Bsp.: Josken.vbs)
Dann lege dir in dem gleichen Pfad wie das Script eine Batchdatei an mit folgendem Inhalt:
Echo %Date% >Log.txt
CScript Josken.vbs >>Log.txt
Diese läßt den Script im "Trockenlauf durchfahren und legt dir eine Logdatei an.
In dieser Logdatei kannst du erst einmal nachsehen, ob das Script im groben das machen würde, was es soll.
Wenn dem so sein sollte, dann nimm die "Kommentare" weg ( " ' " ) vor den "Aktionen" und teste das Script mal
durch.
Achtung, damit du nicht soviel "OK" drücken musst, kommentiere alle "WScript.Echos" aus!

Warte auf dein Feedback

Gruss
Tsuki
Member: josken69
josken69 Nov 20, 2009 at 16:47:04 (UTC)
Goto Top
Hallo Tsuki,
super Arbeit. vielen Dank. Das sieht super aus. Eine Kleinigkeit gibt es noch zu verbessern, aber das krieg ich jetzt hoffentlich auch selber hin. Es gibt im Hauptordner auch verschiedene Ordner der Ebene 2, die keine entsprechenden Unterordner 5_7 und 5_8 der Ebene 3 enthalten und in denen soll dabb auch kein neuer Ordner 5_9 angelegt werden.
Vielen lieben Dank auf jeden Fall schon mal für Deine Hilfe und Mühe.
Wünsche Dir ein schönes Wochenende.
Gruß Josh
Member: TsukiSan
TsukiSan Nov 23, 2009 at 02:58:23 (UTC)
Goto Top
Gerne doch!
Scripten macht Spass.
Wenn du noch Anregungen brauchst, einfach posten.
Noch einen Hinweis: Folgender Fall ist in dem Script nicht abgefangen:
Im Ordner 5_8_etc. existiert schon eine Datei mit dem gleichen Namen aus Ordner 5_7_etc.
Dann bricht das Script ab.
Falls du diesen Fall haben solltest, dann könnte dies mit einer Fehlerauswertung abgefangen werden
und zum Beispiel die schon existierende Datei gnadenlos überschrieben werden, wie folgt
Zeile 73 bis 75 so verändern:
On error resume next
			WScript.Echo "Verschiebe Datei:" & PfadKomplett(m,0) & "\"  & DateiName &  "  nach: " & PfadKomplett(m,1) & "\"  & DateiName  
			FS.MoveFile PfadKomplett(m,0) & "\"   & DateiName , PfadKomplett(m,1) & "\"  & DateiName  
		
		If Err.Number <> 0 Then 'Fuer den Fall, dass Zieldatei schon exisitiert!  
  			Wscript.Echo "******************Fehler****************** Start "  
			Wscript.Echo "Datei: " & Dateiname & " existiert in " & PfadKomplett(m,1) & " schon."   
  			Err.Clear
			Set objFileCheck = fs.GetFile(PfadKomplett(m,1) & "\"  & DateiName)  
			Wscript.Echo "Loesche: " & PfadKomplett(m,1) & "\"  & DateiName  
			objFileCheck.Delete ()
			WScript.Echo "Verschiebe Datei:" & PfadKomplett(m,0) & "\"  & DateiName &  "  nach: " & PfadKomplett(m,1) & "\"  & DateiName  
			FS.MoveFile PfadKomplett(m,0) & "\"   & DateiName , PfadKomplett(m,1) & "\"  & DateiName  
			Wscript.Echo "******************Fehler****************** Ende "  
 		End If

Melde dich einfach, wenn noch was ist.

Gruss
Tsuki
Member: josken69
josken69 Nov 23, 2009 at 09:53:54 (UTC)
Goto Top
Hallo Tsuki.
läuft jetzt alles perfekt. Habe auch meine erweiterte Prüfung noch eingebaut, sodaß jetzt nur in den richtigen Ordnern der neue Ordner 5_9 angelegt wird.
Ich danke Dir nochmals herzlich für Deine Hilfe. Jetzt muss ich dein Script nur noch komplett verstehen, damit ich auch was daraus lerne. Werd mich mal genauer mit dem Code beschäftigen.
Gruß Josh
Member: TsukiSan
TsukiSan Nov 24, 2009 at 01:34:26 (UTC)
Goto Top
Hallo josken69,

keine Ursache!
Gut zu wissen, dass es funktioniert und macht, was du möchtest.

Wenn du noch Fragen hast, du kannst ja eine Nachricht direkt an mich schreiben, ohnen einen neuen Thread aufzumachen.
Dann kann ich etwaige Schritte in meinem Script noch näher erklären.
Ich bin im Scripten auch nicht perfekt - ehr ein beginner.

Gruss
Tsuki