Mehrere Ordner erstellen aus vordefinierten Pfaden (.bat?)

German support forum

Moderators: white, Hacker, Stefan2

Post Reply
User avatar
tuska
Power Member
Power Member
Posts: 3755
Joined: 2007-05-21, 12:17 UTC

Mehrere Ordner erstellen aus vordefinierten Pfaden (.bat?)

Post by *tuska »

Hallo,
ich möchte von vordefinierten Pfaden -> diverse Ordner <- erstellen - TC wird portabel verwendet.
Damit soll ermöglicht werden, auf einem anderen PC diese Ordner rasch anzulegen.

Beispiel:
D:\aaa
D:\bbb\123
D:\ccc\123\ddd
usf.
In der Praxis handelt es sich jedoch großteils um wesentlich längere Pfade.

Meine Vorstellung geht in diese Richtung:
@ECHO OFF
REM Diverse Ordner erstellen
md D:\Daten\Programme\TotalCommander\TCD_USB-Stick\TC32-64USB\Tools\Everything\
md D:\Videos\
Ja/Nein - Abfrage als Schutz vor Überschreibung
usf.

Für mich wäre ideal
1- wenn diese Pfade in einer Batchdatei (.bat) abgespeichert und ggf. schnell geändert werden könnten UND
1- wenn diese Batchdatei einen Schutz vor Überschreibung (Ja/Nein - Abfrage) beinhalten würde(!)
2- wenn es eine zweite Batchdatei gäbe, welche dann die zuvor angelegten Ordner wieder löscht

Ich habe etwas recherchiert, jedoch nichts passendes gefunden.
Gruß,
Karl
User avatar
Stefan2
Power Member
Power Member
Posts: 4153
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Post by *Stefan2 »

Du bist schon auf dem richtigen Weg.

Wo ist jetzt noch dein Problem?

Denke nur an Anführungszeichen.

Ein "Überschreiben" gibt es bei MD nicht,...
.es kommt einfach eine Fehlermeldung wenn das Verzeichnis bereits existiert.
Hast du es noch nicht ausprobiert?
Um diese Meldung zu unterdrücken, verwende ' 2>NUL'

Zum Löschen verwende 'RD /S /Q'


Ich hab' das gerade mal getestet:

Code: Select all

@ECHO OFF
REM Diverse Ordner erstellen , hier mit relative Pfade im aktuellen Ordner


SET Befehl=MD
rem SET Befehl=RD /S /Q
rem SET Befehl=%1


%BEFEHL% 1Dies 2ist 3ein 4Ordner 2>NUL

%BEFEHL% "5Dies ist ebenfalls ein Ordner"
%BEFEHL% "6Und noch" "7Ein Ordner"

PAUSE


Benötigst du noch etwas anderes?



- - -


Checke immer die Anleitung der Befehle in einer DOS-Box:
MD /?
RD /?

- - -

2> ist die Umleitung von StdError
1> oder > ist die Umleitung von StdOut

Hilfe dazu findest du in alten Anleitungen aus dem letztem Jahrtausend bezüglich dem Schreiben von DOS-Batch'es.





 
User avatar
tuska
Power Member
Power Member
Posts: 3755
Joined: 2007-05-21, 12:17 UTC

Post by *tuska »

Danke für Deine Hilfe -> zur Selbsthilfe ;-)
Dein Code funktioniert übrigens bestens!

Bei mir funktioniert hingegen nur die Anlage von Ordnern:

Code: Select all

@ECHO OFF
REM Diverse Ordner erstellen - Pfade in dieser Batchdatei eintragen

SET Befehl=MD
rem SET Befehl=RD /S /Q
rem SET Befehl=%1

%BEFEHL% D:\aaa 
%BEFEHL% D:\bbb\123 
%BEFEHL% D:\ccc\123\ddd
Beim Löschen wird hingegen nur der Ordner D:\aaa gelöscht und alle anderen Ordner bleiben vorhanden:

Code: Select all

@ECHO OFF 
REM Diverse Ordner löschen  - Pfade in dieser Batchdatei eintragen

SET Befehl=RD /S /Q 
rem SET Befehl=RD /S /Q 
rem SET Befehl=%1 

%BEFEHL% D:\aaa
%BEFEHL% D:\bbb\123
%BEFEHL% D:\ccc\123\ddd
Auch dieser Versuch hat nichts gebracht - es wird nur der Ordner D:\aaa gelöscht:

Code: Select all

@ECHO OFF 
REM Diverse Ordner löschen  - Pfade in dieser Batchdatei eintragen

RD /S /Q D:\aaa
RD /S /Q D:\bbb\123
RD /S /Q D:\ccc\123\ddd
Was hat es eigentlich mit -> rem SET Befehl=%1 auf sich?

Bitte um weiteren Ratschlag. Danke!
User avatar
Stefan2
Power Member
Power Member
Posts: 4153
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Post by *Stefan2 »

Ah, ja! Logisch, sorry, es wird ja der '123'- und der 'ddd'-Ordner zum Löschen angegeben.

Ich denk mir mal 'was aus... geht natürlich besser mit VBS oder PoSh (die haben bessere Befehle dafür)...



- - -


Das %1 ist ein dezenter Hinweis auf die Möglichkeit
der Batch einen Parameter zu übergeben,
und somit die "Richtung" im TC-Button anzugeben.





 
User avatar
Stefan2
Power Member
Power Member
Posts: 4153
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Post by *Stefan2 »

Sorry, zu wenig Zeit zum Testen....

Aber ich habe mal was gebastelt, habe es aber nur mit
relativen Ordnern getestet, noch nicht mit ':' für Laufwerk.


Aber bei Pfaden wie 'D:\aaa' wird mangels Backslash der Ordner 'aaa' nicht erkannt.
(Für die Funktion um nicht stumpf das komplette 'D:' -Laufwerk zu löschen)





Nur mal als Idee, aber noch mit Fehlern:

Code: Select all

@ECHO OFF
REM Diverse Ordner erstellen - Pfade in dieser Batchdatei eintragen

rem SET Befehl=MD
SET Befehl=CALL :_DEL 
rem SET Befehl=%1


REM Ordnerliste:
REM %BEFEHL% D\aaa
REM %BEFEHL% D\bbb\123
REM %BEFEHL% D\ccc\123\ddd


REM TEST
CALL :_DEL D\ccc\123\ddd
CALL :_DEL D:\ccc\123\ddd
CALL :_DEL D:\aaa
CALL :_DEL D\aaa



GOTO :EOF
:_DEL
REM Mit 'RD' muss man den obersten Ordner löschen.
REM Don't delete whole 'D:'
REM If ':' is found use next level folder instead
ECHO %1 | Find ":" >NUL
If %ERRORLEVEL%==1 (SET _tok=1) Else (SET _tok=2)

REM Delete the found top level folder:
for /f "delims=\ tokens=%_tok%" %%f in ("%1") Do (
    ECHO onPath: %1
    ECHO Delete: %%f  
    ECHO ---
   rem RD /S /Q %%f 
)



Mein Testergebnis:
C:\temp\batch\3>z.cmd
onPath: D\ccc\123\ddd
Delete: D
---
onPath: D:\ccc\123\ddd
Delete: ccc
---
onPath: D:\aaa
Delete: aaa
---
onPath: D\aaa
Delete: D
---

C:\temp\batch\3>echo komisch, jetzt funktioniert es doch wie es soll?





  :roll:
User avatar
tuska
Power Member
Power Member
Posts: 3755
Joined: 2007-05-21, 12:17 UTC

Post by *tuska »

Stefan2 wrote:Sorry, zu wenig Zeit zum Testen....

Nur mal als Idee, aber noch mit Fehlern:

Mein Testergebnis:
C:\temp\batch\3>z.cmd
onPath: D\ccc\123\ddd
Delete: D
---
onPath: D:\ccc\123\ddd
Delete: ccc
---
onPath: D:\aaa
Delete: aaa
---
onPath: D\aaa
Delete: D
---

C:\temp\batch\3>echo komisch, jetzt funktioniert es doch wie es soll?
  :roll:
Jetzt hast Du mich etwas verunsichert.
Weiß nicht, ob ich den Code testen soll? Habe jedenfalls ein gutes Backup von Laufwerk D ...

EDIT:
Zeit spielt übrigens überhaupt keine Rolle!
Bitte nur keinen Stress!
Last edited by tuska on 2018-01-30, 20:56 UTC, edited 1 time in total.
JOUBE
Power Member
Power Member
Posts: 1471
Joined: 2004-07-08, 08:58 UTC

Post by *JOUBE »

Ich bitte darum, diese Kinder Kacke nicht im TC Forum breit zu treten, sondern da, wo sie hingehört, in irgendeinem Windows Forum in den Weiten des Internets.

JOU“ die armen - für Banalitäten missbrauchten - Umgebungsvariablen drehen sich ja im Grabe rum“BE
User avatar
tuska
Power Member
Power Member
Posts: 3755
Joined: 2007-05-21, 12:17 UTC

Post by *tuska »

2JOUBE
Bad vibrations?
User avatar
Stefan2
Power Member
Power Member
Posts: 4153
Joined: 2007-09-13, 22:20 UTC
Location: Europa

VBScript: Erstelle oder Lösche Ordner

Post by *Stefan2 »

tuska wrote: Weiß nicht, ob ich den Code testen soll? Habe jedenfalls ein gutes Backup von Laufwerk D ...
Schau dir das Skript an und versuche es zu verstehen.
Du wirst sehen, dass der Löschbefehl "RD" auskommentiert ist:
rem RD /S /Q %%f

Somit kannst du es ruhig mal ausprobieren.

- - -

Wie gesagt, eine Batch ist mir für solche Aufgaben zu unstabil (Syntax, Möglichkeiten, Fehleranträchtig..)

Lieber wäre mir ein VBScript (oder JS, oder PoSh oder AHK ...)

Hier mal ein Versuch in VBS:

(Hier ist ebenfalls 'WSO.run auskommentiert, es werden nur MsgBox-es angezeigt)

Code: Select all

'---------------------------------------
REM VBScript zum Erstellen bzw. Löschen von Ordnern
REM Found at https://ghisler.ch/board/viewtopic.php?p=337473#337473
REM Ändere -'WSO.run- zu -WSO.run- zum scharfschalten.
'---------------------------------------
SET WSO = WScript.CreateObject("WScript.Shell")
myARR = Array()
'// INFO: Zeilen mit ' sind nur Kommentar 
'   und werden nicht als Befehl ausgeführt.
'---------------------------------------



'---------------------------------------
'--------------------------------------- USER SETTINGS
'---------------------------------------
'//-- Zeige MessageBox zur Information( TRUE=Ja ; FALSE=Nein )
bShowMsg = True
'---------------------------------------
'//-- Befehl mit nötigen Leerzeichen:
' MD erstellt Ordner:
' strCommand="MD "
' RD löscht Ordner:
strCommand="RD /S /Q "
'---------------------------------------
'//-- List of Paths (use "", not "/"!)
myARR = AddItem(	"D\aaa"		)
myARR = AddItem("D\bbb\123")
myARR = AddItem( "D\ccc\123\ddd" )
myARR = AddItem("E:\EEE")
myARR = AddItem("E:\Fff\456")
myARR = AddItem("E:\GGG\789\hhh")





'---------------------------------------
'--------------------------------------- THE CODE
'---------------------------------------
' Execute user command:
strPWD = WSO.CurrentDirectory
For i = 0 To UBound(myARR) 
    'MsgBox myARR(i)
    sItem = replace(myARR(i),"/","") '// I will handle '\'s only!
    If(Left(sItem,1) = "") Then sItem = Mid(sItem,2) '// no leading '\'s please!

    If(InStr(UCase(strCommand),"MD")>0) Then
		If(bShowMsg) Then Msg "Create " & sItem
		WSO.run "cmd /c " & strCommand & sItem,0,True
	End If

	If(InStr(UCase(strCommand),"RD")>0) Then
		arrPath = split(sItem,"")
		If(InStr(sItem,":")>0) Then
			'// Beispiel: "E:\GGG\789\hhh" mit Doppelpunkt :, somit absoluter Pfad.
			'// Vorkehrung, um nicht das gesamte 'E:' Laufwerk zu löschen.
			'// Mein Pfad zum Löschen ist hier 'E:\ErsterOrdner', also  hier "E:\GGG"
			If(bShowMsg) Then Msg sItem & vbLF & "So delete " & arrPath(0)&""&arrPath(1)
			'WSO.run "cmd /c " & strCommand & arrPath(0)&""&arrPath(1),0,True
		Else
			'// Beispiel: "D\ccc\123\ddd" ohne Doppelpunkt, relativer Pfad im aktuellem Ordner.
			'// Mein Pfad zum Löschen ist hier 'ErsterOrdner', also hier "D"
			If(bShowMsg) Then Msg sItem & vbLF & "So delete " & strPWD & "" & arrPath(0)
			'WSO.run "cmd /c " & strCommand   & strPWD & "" & arrPath(0),0,True
		End If
	End If
Next 
'---------------------------------------
'--------------------------------------- Helper functions
'---------------------------------------
' add item to array
Function AddItem(val)
    ReDim Preserve myARR(UBound(myARR) + 1)
    myARR(UBound(myARR)) = val
    AddItem = myARR
End Function
Function msg(strText)
	MB = MsgBox(strText, vbOKCancel+vbQuestion,"VBScript") 
		If (MB = vbCancel) Then WScript.Quit
End Function 'msg(strText)
'---------------------------------------
'--------------------------------------- THIS IS THE END my friend,...
'---------------------------------------








 
User avatar
tuska
Power Member
Power Member
Posts: 3755
Joined: 2007-05-21, 12:17 UTC

VBScript zum Erstellen bzw. Löschen von Ordnern | Gelöst!

Post by *tuska »

2Stefan2
Zunächst besten Dank für Deine Bemühungen!
Das 'VBScript zum Erstellen bzw. Löschen von Ordnern' ist für mich die Lösung!

Hier noch eine Zusammenfassung der diversen Detailergebnisse:
1-- .bat Diverse Ordner erstellen, hier mit relativen Pfaden im aktuellen Ordner
1-- diese Batchdatei kann mE im Anlaßfall gute Dienste leisten und ich denke, es gibt dabei keine Probleme

2-- .bat Diverse Ordner erstellen - Pfade in dieser Batchdatei eintragen
2-- diese Batchdatei sollte mE nicht mehr verwendet werden, denn wenn zB zwei Laufwerkspfade angegeben werden (D:, J: ) ,
2-- 3x D:, 3x J:, dann werden auf J: insgesamt 6 Ordner mit Lfw. J: angelegt, obwohl Stk. 3 als Lfw.Buchst. D: sein sollten
3-- .bat Diverse Ordner löschen - Pfade in dieser Batchdatei eintragen -> würde ich jetzt nicht verwenden (da .vbs Lösung perfekt)
3.1 .bat viewtopic.php?p=337442&sid=a41041f51510ecaaa2e555a5b4657797#337442 nicht getestet

4-- VBScript: Erstelle oder Lösche Ordner
4.1 Bei Verwendung von Pfaden und Laufwerksbuchstaben OHNE Doppelpunkt ':', zB D\aaa
4.1 sind die MessageBox'en mE nicht optimal und die Ordner bleiben nach Abschluß der .vbs Durchführung bestehen(!)
4.2 Aus diesem Grund habe ich für mich den Block "Else .. '// Beispiel: "D\ccc\123\ddd" ohne Doppelpunkt, relativer Pfad im aktuellem Ordner."
4.2 aus Deinem Code entfernt. D.h. sämtliche Pfade müssen mit ':' Doppelpunkt angegeben werden, zB J:\EEE
4.3 WICHTIG: Sollten sich in irgendeinem der vordefinierten Ordner zB Dateien befinden, dann werden diese OHNE Rückfrage gelöscht!

Die fertigen Lösungen (schon "scharfgeschalten") sehen für mich so aus:

VBScript zum ERSTELLEN von Ordnern.vbs

Code: Select all

'--------------------------------------- 
REM VBScript zum Erstellen bzw. Löschen von Ordnern 
REM Found at https://ghisler.ch/board/viewtopic.php?p=337473#337473 
REM Ändere -'WSO.run- zu -WSO.run- zum scharfschalten. 
'--------------------------------------- 
SET WSO = WScript.CreateObject("WScript.Shell") 
myARR = Array() 
'// INFO: Zeilen mit ' sind nur Kommentar 
'   und werden nicht als Befehl ausgeführt. 
'--------------------------------------- 

'--------------------------------------- 
'--------------------------------------- USER SETTINGS 
'--------------------------------------- 
'//-- Zeige MessageBox zur Information( TRUE=Ja ; FALSE=Nein ) 
bShowMsg = True 
'--------------------------------------- 
'//-- Befehl mit nötigen Leerzeichen: 
' MD erstellt Ordner: 
' strCommand="MD " 
' RD löscht Ordner: 
strCommand="MD " 
'--------------------------------------- 
'//-- List of Paths (use "\", not "/"!) 
myARR = AddItem("D:\aaa") 
myARR = AddItem("D:\bbb\123") 
myARR = AddItem("D:\ccc\123\ddd" ) 
myARR = AddItem("J:\EEE") 
myARR = AddItem("J:\Fff\456") 
myARR = AddItem("J:\GGG\789\hhh")

'--------------------------------------- 
'--------------------------------------- THE CODE 
'--------------------------------------- 
' Execute user command: 
strPWD = WSO.CurrentDirectory 
For i = 0 To UBound(myARR) 
    'MsgBox myARR(i) 
    sItem = replace(myARR(i),"/","\") '// I will handle '\'s only! 
    If(Left(sItem,1) = "\") Then sItem = Mid(sItem,2) '// no leading '\'s please! 

    If(InStr(UCase(strCommand),"MD")>0) Then 
      If(bShowMsg) Then Msg "Create " & sItem 
      WSO.run "cmd /c " & strCommand & sItem,0,True 
   End If 

   If(InStr(UCase(strCommand),"RD")>0) Then 
      arrPath = split(sItem,"\") 
      If(InStr(sItem,":")>0) Then 
         '// Beispiel: "J:\GGG\789\hhh" mit Doppelpunkt :, somit absoluter Pfad. 
         '// Vorkehrung, um nicht das gesamte 'J:' Laufwerk zu löschen. 
         '// Mein Pfad zum Löschen ist hier 'J:\ErsterOrdner', also  hier "J:\GGG" 
         If(bShowMsg) Then Msg sItem & vbLF & "So delete " & arrPath(0)&"\"&arrPath(1) 
         WSO.run "cmd /c " & strCommand & arrPath(0)&"\"&arrPath(1),0,True 
      Else 
         '// Beispiel: "D\ccc\123\ddd" ohne Doppelpunkt, relativer Pfad im aktuellem Ordner. 
         '// Mein Pfad zum Löschen ist hier 'ErsterOrdner', also hier "D" 
         If(bShowMsg) Then Msg sItem & vbLF & "So delete " & strPWD & "\" & arrPath(0) 
         WSO.run "cmd /c " & strCommand   & strPWD & "\" & arrPath(0),0,True 
      End If 
   End If 
Next 
'--------------------------------------- 
' add item to array 
Function AddItem(val) 
    ReDim Preserve myARR(UBound(myARR) + 1) 
    myARR(UBound(myARR)) = val 
    AddItem = myARR 
End Function 
Function msg(strText) 
   MB = MsgBox(strText, vbOKCancel+vbQuestion,"VBScript") 
      If (MB = vbCancel) Then WScript.Quit 
End Function 'msg(strText) 
'--------------------------------------- 
'--------------------------------------- THIS IS THE END my friend,... 
'---------------------------------------


VBScript zum LÖSCHEN von Ordnern.vbs

Code: Select all

'--------------------------------------- 
REM VBScript zum Erstellen bzw. Löschen von Ordnern 
REM Found at https://ghisler.ch/board/viewtopic.php?p=337473#337473 
REM Ändere -'WSO.run- zu -WSO.run- zum scharfschalten. 
'--------------------------------------- 
SET WSO = WScript.CreateObject("WScript.Shell") 
myARR = Array() 
'// INFO: Zeilen mit ' sind nur Kommentar 
'   und werden nicht als Befehl ausgeführt. 
'--------------------------------------- 

'--------------------------------------- 
'--------------------------------------- USER SETTINGS 
'--------------------------------------- 
'//-- Zeige MessageBox zur Information( TRUE=Ja ; FALSE=Nein ) 
bShowMsg = True 
'--------------------------------------- 
'//-- Befehl mit nötigen Leerzeichen: 
' MD erstellt Ordner: 
' strCommand="MD " 
' RD löscht Ordner: 
strCommand="RD /S /Q " 
'--------------------------------------- 
'//-- List of Paths (use "\", not "/"!) 
myARR = AddItem("D:\aaa") 
myARR = AddItem("D:\bbb\123") 
myARR = AddItem("D:\ccc\123\ddd" ) 
myARR = AddItem("J:\EEE") 
myARR = AddItem("J:\Fff\456") 
myARR = AddItem("J:\GGG\789\hhh")

'--------------------------------------- 
'--------------------------------------- THE CODE 
'--------------------------------------- 
' Execute user command: 
strPWD = WSO.CurrentDirectory 
For i = 0 To UBound(myARR) 
    'MsgBox myARR(i) 
    sItem = replace(myARR(i),"/","\") '// I will handle '\'s only! 
    If(Left(sItem,1) = "\") Then sItem = Mid(sItem,2) '// no leading '\'s please! 

    If(InStr(UCase(strCommand),"MD")>0) Then 
      If(bShowMsg) Then Msg "Create " & sItem 
      WSO.run "cmd /c " & strCommand & sItem,0,True 
   End If 

   If(InStr(UCase(strCommand),"RD")>0) Then 
      arrPath = split(sItem,"\") 
      If(InStr(sItem,":")>0) Then 
         '// Beispiel: "J:\GGG\789\hhh" mit Doppelpunkt :, somit absoluter Pfad. 
         '// Vorkehrung, um nicht das gesamte 'J:' Laufwerk zu löschen. 
         '// Mein Pfad zum Löschen ist hier 'J:\ErsterOrdner', also  hier "J:\GGG" 
         If(bShowMsg) Then Msg sItem & vbLF & "So delete " & arrPath(0)&"\"&arrPath(1) 
         WSO.run "cmd /c " & strCommand & arrPath(0)&"\"&arrPath(1),0,True       
      End If 
   End If 
Next 
'--------------------------------------- 
' add item to array 
Function AddItem(val) 
    ReDim Preserve myARR(UBound(myARR) + 1) 
    myARR(UBound(myARR)) = val 
    AddItem = myARR 
End Function 
Function msg(strText) 
   MB = MsgBox(strText, vbOKCancel+vbQuestion,"VBScript") 
      If (MB = vbCancel) Then WScript.Quit 
End Function 'msg(strText) 
'--------------------------------------- 
'--------------------------------------- THIS IS THE END my friend,... 
'---------------------------------------


Vielen Dank nochmals für Deine Bemühungen.

Gruß
Karl
Post Reply