Anzeige

Am Puls von Microsoft

Anzeige

[gelöst] Erstellen einer ggf. mehrstufigen Verzeichnisstruktur mithilfe einer Batch-File

Dau47

kennt sich schon aus
Hallo Forum,

Ausgangsbasis ist ein Verzeichnis mit jeweils weiteren Unterverzeichnissen. Der volle Pfadname ist gegeben. jetzt wird ein weiteres Verzeichnis benötigt, welches sich auf demselben Laufwerk befindet. Allerdings ist für die erste Index-Stufe ein fester Name vorgegeben. Zusätzlich wird noch eine letzte Index-Stufe mit dem Namen das aktiven Users benötigt.

Leider habe ich bisher keine Möglichkeit gefunden, die Struktur oder die noch fehlenden Teile davon mit einem einzigen Command (MKDIR) zu erstellen. Somit bleibt m. E. nur die Möglichkeit, den bisherigen Pfad-Namen in Einzelteile zu zerlegen und danach zur prüfen, ob es das neue (Sub)Verzeichnis schon gibt, um es bei Bedarf zu erstellen.

Leider reichen meine Kenntnisse nicht aus, dies in einer Batch-Umgebung zu lösen.

Wer kann helfen?


Vorhandener Pfad: C:\S1\S2\S3\S4\S5\S6\S7

neuer Pfad: C:\C1\S2\S3\S4\S5\S6\S7\Username

Erschwerend kommt hinzu, dass es keine Regel gibt, wieviele Sub-Verzeichnisse vorhanden sind. Ist der Name der letzten Stufe identisch mit dem Username, dann ist alles ok. Das kann bereits heute mit "if exist(pfad)" geprüft werden.

Wer kann mir ein lauffähiges Beispiel bereitstellen, dass den alten Pfad-Namen zerlegt, und dann prüft, ob der neue Pfad-Name bereits besteht und ggf. fehlende Unteverzeichnisse erstellt

Im Voraus besten Dank.

Werner
 
Anzeige
Das wirst du kaum lösen können per Software, und schon gar nicht mit Batch. Dein Beispiel ist leider zu unspezifisch, vor allem, was C1 angeht - ist das fix, oder ändert sich das, soll das in einer Eingabe vorzugeben sein. Allein die Quelle mit c:\xyz\ ist schon mit Problemen behaftet, weil man a) auf c niemals Daten ablegt und b) irgendwo kontrollieren muss, dass sich kein Systemverzeichnis mit in den Queue mogelt. Ansonst ist c:\ ganz schlecht für dein Beispiel gewählt.

Insgesamt dürfte deine Anfrage sehr zeitintensiv sein, für ein Freizeitprojekt für sich selbst ok, aber für andere hat das eher kommerziellen Charakter und da sollte man schon bedenken, dass in qualifizierte Hände zu geben, was dann auch mit Kosten verbunden ist. Aber - in dem Moment sind Risiken mit einbezogen, privat würde ich niemals mir aufbürden wollen, Datenverluste sind kein Kavaliersdelikt.
 
Hallo .Bernd,

danke für Deine Antwort. Natürlich lege ich keine Nutzerdaten auf das C-Laufwerk. Die dargestellte Struktur war lediglich ein Beispiel.

Natürlich habe ich im Internet auch schon etwas gefunden:

for /f "tokens=1 delims=" %%a in ("%MeinPfad%") do @set var1=%%a
for /f "tokens=2 delims=" %%a in ("%MeinPfad%") do @set var2=%%a
for /f "tokens=3 delims=" %%a in ("%MeinPfad%") do @set var3=%%a
for /f "tokens=4 delims=" %%a in ("%MeinPfad%") do @set var4=%%a
for /f "tokens=5 delims=" %%a in ("%MeinPfad%") do @set var5=%%a
for /f "tokens=6 delims=" %%a in ("%MeinPfad%") do @set var6=%%a
for /f "tokens=7 delims=" %%a in ("%MeinPfad%") do @set var7=%%a

@echo %var1%
@echo %var2%
@echo %var3%
@echo %var4%
@echo %var5%
@echo %var6%
@echo %var7%

Mein Problem damit: ich kenne zuvor nicht die Anzahl der Unterverzeichnisse, Also ist mir auch nicht bekannt, wieviele %var ich für die neue Struktur verwenden muss. Und ungeklärt ist damit auch die Frage, ob das letzte Unterverzeichnis bereits den Namen des Benutzers trägt.

Die Auswertung des alten Pfades müsste deshalb mit einer Loop geschehen, und danach müsste in einer weiteren Loop - unter Berücksichtigung der von mir genannten "Eingriffe" -der neue Namen aufgebaut werden.

Hallo skorpion68.

Auch Dir danke für Deine Antwort. Ich hatte bei meinen Tests bisher immer "MKDIR" benutzt. Doch damit lassen sich keine Verzeichnis-Strukturen aufbauen; das habe ich durch Deine Antwort erkannt. Trotzdem bleibt mein Problem weiterhin bestehen. Siehe dazu meine Antwort an .Bernd von 15:07.
 
Zuletzt bearbeitet von einem Moderator:
Grob skizziert ohne Anspruch auf Schönheit in der Powershell sähe es manuel so aus:

$d = dir "C:\S1" -Recurse Verzeichnisobjekt $d C:\S1\S2\S3\S4\S5\S6\S7
$v =$d[$d.count-1].FullName String $v C:\S1\S2\S3\S4\S5\S6\S7
$v.Replace("S1","C1") C:\C1\S2\S3\S4\S5\S6\S7
$v = $v -split "C:" C1\S2\S3\S4\S5\S6\S7
$v = -join($v, "", $username) C1\S2\S3\S4\S5\S6\S7\username
# Dieser Befehl erstellt das Verzeichnis C:\C1\S2\S3\S4\S5\S6\S7\username
New-Item -Path "C:" -Name $v -ItemType "directory"

Das kann man auch als Skript nehmen
 
Hallo wori,

auch Dir vielen Dank für Deine Antwort.

Von Powershell habe ich überhaupt keine Ahnung und verstehe deshalb nicht, was in Deinem Beispiel abläuft, und wo ich wie eingreifen müsste, um etwas zu modifizfieren
 
Ich muss nochmal nachhaken - geht es lediglich ums Kopieren einer Ordnerstruktur in ein neues Ziel oder hängen da auch Daten mit dran?
Die Ordnerstruktur zu übertragen ist einfach, es ist dabei auch unerheblich, ob das Ziel dann auch schon besteht, wenn MD genutzt wird. Komplizierter wird es, den %username% anzuhängen, weil Parent und Child-Suche - unabhängig von der Verzeichnistiefe.

Nicht umsonst fragte ich nach Details, erweitert im die Frage, ob S1 bis S7 immer vorhanden sind oder vorhanden sein können, dass zB nicht die komplette Pfadtiefe wie in deinem beispiel vorhanden wäre.

Vielleicht denke ich evtl komplizierter als es ist, aber als Hobby-Coder (weder Batch noch PS) hat man ganz andere Denkweisen.
 
Wie gesagt es war eine grobe Skizze wie man das machen kann.
Es fehlt der Check ob der Name des letzten Directorys gleich
dem Usernamen ist.
Eingaben wären Stammverzeichnis, Benutzer, Zielstammverzeichnis

$Stammverzeichnis aus Deinem Beispiel ist C:\S1
$Zielstammverzeichnis C1
$Benutzer Username

Die Kommentare beschreiben die Ergebnisse der Befehle anhand Deines Beispiels

# das Holt das Verzeichnisobjekt zu C:\S1\S2\S3\S4\S5\S6\S7
# speichert es in $d
$d = dir $Stammverzeichnis -Recurse
# $d hat den kompletten Verzeichnisbaum inklusive Dateien
# besitzt für jedes Subverzeichnis einen Eintrag

# Holt den letzten Verzeichnisnamen
# $d[1] = S1, $d[2] = S2, usw.
#Speichert diesen als String
$v =$d[$d.count-1].FullName

# ersetzt den Stammverzeichnisnamen S1 durch C1
# C:\S1\S2\S3\S4\S5\S6\S7 -> C:\C1\S2\S3\S4\S5\S6\S7
$v.Replace($d[0].FullName,$Zielstammverzeichnis)

#Trennt Laufwerkskennung ab "C:"
# -> C1\S2\S3\S4\S5\S6\S7
$v = $v -split "C:"

# baut den neuen Pfadnamen
# C1\S2\S3\S4\S5\S6\S7\Username
$v = -join($v, "", $Benutzer)

# Dieser Befehl erstellt das Verzeichnis C:\C1\S2\S3\S4\S5\S6\S7\username
New-Item -Path "C:" -Name $v -ItemType "directory"

Die Frage von Bernd ist sinnvoll. Wozu das ganze?
 
Hallo Wori.

Dir und allen anderen, welche mir geantwortet haben, recht herzlichen Dank.

Ich habe es mir einfacher vorgestellt, das Problem über einen Code in einer Batch-File zu lösen.

Da ich sehr gute Kenntnisse in Rexx dank meiner jahrelangen Tätigkeit auf einem Großrechner habe, habe ich mich nun entschlossen, mein Problem mit Hilfe von Rexx. welches ich aus der Batch-File aufrufe, zu lösen. Dazu habe ich mir schon vor langer Zeit Regina-Rexx auf meinen Rechner heruntergeladen und auch schon einiges damit realisiert.

Für mich ist damit dieses Problem gelöst. Mit Rexx sehe ich hier überhaupt keine Probleme.

Gruß Werner
 
Anzeige
Oben