jediman
Goto Top

Name eines Verzeichnisses per batch finden und damit weiterarbeiten?

Name eines Verzeichnisses per batch finden und damit weiterarbeiten?

Hallo face-smile

ich benötige für ein paar automatisierte Kopieraktionen eine kleine .bat Datei die den Namen eines Verzeichnisses rausfindet bzw von mehreren Verzeichnissen, sozusagen nach folgendem Muster:

1. schau im Verzeichnis1 nach welche Verzeichnisse es dort gibt und wie sie heissen.
2. kopieren dann eine Datei x.txt in JEDES der oben gefundenen Verzeichnisse rein

Im Prinzip also ein Schleife die nachschaut welche Verzeichnisse existieren und bei einem gefundenen Verzeichnis dann eine Datei jeweils in das gefundene Verzeichnis schreibt, bis alle Verzeichnisse abgearbeitet wurden die im Verzeichnis1 drinne sind.

Hoffe ich hab es nicht zu kompliziert ausgedrückt *g*
... und schonmal Danke für alle Antworten face-smile

Content-Key: 14681

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

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

Member: Biber
Biber Aug 22, 2005 at 00:42:13 (UTC)
Goto Top
Nimm diesen Oneliner:
snipp CopyFileToAllDirsBelowDir.bat----------
<font size=-2>@if "%*"=="" (@Echo Syntax: %0 File ToDir) ELSE (@for /r "%~2" %%i in (.) do @if Not "%~1"=="%%~i" @copy "%~1" "%%~i" >nul)</font>
snipp CopyFileToAllDirsBelowDir.bat-------
HTH Frank /der Biber aus Bremen
Member: Biber
Biber Aug 22, 2005 at 05:20:39 (UTC)
Goto Top
Moin, Jediman,
sorry, wenn ich im obigen Kommentar so kurz angebunden war - ich hatte die Antwort schon einmal eingetippt und war dabei abgestürzt.. genauer gesagt mein Brauser. Egal.

Also jetzt noch kurz ein paar Nachträge:
- ein CopyFileToAllDirsBelowDir.bat x.txt d:\temp kopiert Dir die Datei x.txt in alle Unterverzeichnisse unterhalb von d:\temp.
- Nicht in D:\temp selbst. Wenn es da auch hin soll: @if Not "%~1"=="%%~i" löschen.
- Dafür wird x.txt auch in alle Unter-Unterverzeichnisse kopiert. Wenn es nur auf die erste Ebene unterhalb d:\temp soll, noch mal posten. Dann machen wir einen Zweizeiler draus *gg
- WARNUNG: das Bätchelchen macht auch ohne Rückfrage ein CopyFileToAllDirsBelowDir.bat c:\*.* d:\temp und müllt Dir zu, was auch immer Du schriftlich verlangst.

Und eine Frage noch:
Ich verwende immer relativ viel Energie und Gehirnschmalz darauf, Dateiduplikate zu vermeiden statt zu erzeugen ... Was um alles in der Welt treibt Dich zu dieser Anforderung??? Nur mal interessehalber...
Member: Jediman
Jediman Aug 22, 2005 at 06:24:03 (UTC)
Goto Top
Erst mal vielen Dank Biber für deine Antwort face-smile

Ich benötige das ganze für eine kleine Installations-Routine, auf das zu "manipulierende" Ziel hab ich leider keinen Einfluss, daher das etwas komplizierte.

Mein Problem genau ist folgendes:

Ich befinde mich im Root-Verteichnis eines Spiels

W:\Spiel

nun "möchte" ich per .bat 2 Dateien für ein Layout was sich öffters ändert in Unterverzeichnisse kopieren, deren Name ich allerdings nicht kenne und das ist eben mein Problem. Bisher habe ich es so gelöst das der Nutzer seinen Accountnamen und dann anschliessend jeweils seine bis zu 20 Charnamen per Hand eingeben musste, was natürlich bei 20 Spieler-Chars doch etwas umständlich ist. Daher suche ich alternativ eine automatische Erkennung der Verzeichnisse

genau sollte es so sein:

ich bin im Verzeichnis W:\Spiel

gehe nun ins Verzeichnis W:\Spiel\Account

[START Schleife 1]
- Abfrage: Schaue nach welche Accounts/Verzeichnisse existieren (eventuell mit /dir)

- Abfrage: Wie heisst das ERSTE gefundene Verzechnis? Weise den erfragten Namen einer Variablen zu zB %AccName%

- Gehe nun in das ERSTE erfragte Verzeichnis (dessen Name ich ja nicht kenne) cd %AccName%

[START Schleife 2]
- Schaue nun nach in dem Verzeichnis %AccName% ob sich dort Charnamen=Verzeichnisse befinden und weise (eventuell mit /dir erfragen?) diesen gefundenen Charnamen/Verzeichnisse die Variable %Char% zu

kopiere alle im Verzeichnis W:\Spiel\template\*.* befindlichen DATEIEN in das erfragte Verzeichnis W:\Spiel\Account\%AccName%\%Char%\*.*

Arbeite das ganze solange ab, bis keine CHARNAMEN=Verzeichnisse mehr gefunden werden
Wenn welche gefunden werden gehen nach Anfang Schleife 2
Werden keine weiteren CHARNAMEN=Verzeichnisse gefunden dann schau nach ob es noch einen weiteren Account gibt. Schaue nach ob noch weitere Accounts (siehe Schleife 1) existieren, erfrage dort auch die CHARNAMEN=Verzeichnisse und kopieren dann auch jeweils in jedes gefundenen Charnamen=Verzeichniss

[ENDE Schleife 2]

Schaue nach ob noch weitere Accounts (siehe Schleife 1) existieren, erfrage dort auch die Charnamen und kopieren dann auch jeweils in jedes gefundenen Charnamen=Verzeichniss
[ENDE Schleife 1]

Ordner Struktur wäre zB

Quelle:
W:\Spiel\template\*.*

Ziel:
W:\Spiel\Account\Account1\Char1\
W:\Spiel\Account\Account1\Char2\
W:\Spiel\Account\Account1\Char3\
W:\Spiel\Account\Account1\Char4\
W:\Spiel\Account\Account1\Char5\
W:\Spiel\Account\Account1\Char6\

W:\Spiel\Account\Account2\Char1\
W:\Spiel\Account\Account2\Char2\
W:\Spiel\Account\Account2\Char3\

hoffe das versteht einer *g*
Member: Biber
Biber Aug 22, 2005 at 09:21:24 (UTC)
Goto Top
aaahhh, Jediman,
jetzt versteh ich...(glaub ich *gg)... Du brauchst DEN Oneliner:
CopyTemplates.bat
@for /r W:\Spiel\Account %%a in (.\Account*) do @for /r %%~dpa %%i in (.) do copy W:\Spiel\template\*.* "%%~i" >nul
snapp CopyTemplates.bat

das mit Deinen vielen Schleifen und Variablen hab ich nicht verstanden, das würde bestimmt auch Stunden dauern, so zwei um sich kreisende Schleifen zu programmieren... face-wink

probier aber lieber erst den "entschärften" TestCopyTemplates.bat aus
---snipp----------
@for /r W:\Spiel\Account %%a in (.\Account*) do @for /r %%~dpa %%i in (.) do @echo copy W:\Spiel\template\*.* "%%~i" ^>NUL
---snapp

So würde es zumindest (denke ich) fünktionieren, wenn unterhalb W:\Spiel\Account\Account?\ nur Verzeichnisse ("CHARy" in Deinem Beispiel) und keine Dateien wären.
Wohler wäre mir (und Dir sicher auch) wenn sich das "(.)" in der 2. FOR-Schleife eingegrenzt werden könnte durch eine bestimmte Dateimaskenvorgabe. Aber die "CHAR.."-Verzeichnisnamen sind frei wählbar für deine Anwender??
Dann musst Du VOR das Copy noch diese Prüfung setzen: If Exist "%%~i\." , damit nur in Verzeichnisse kopiert wird und nicht auf Dateien in der Ebene W:\Spiel\Account\Account?.

Sind bestimmt noch Denkfehler drin, aber in der Theorie klappt es prima.
Member: Biber
Biber Aug 23, 2005 at 08:13:43 (UTC)
Goto Top
Moin, Jediman,

wir haben uns das Leben unnötig schwer gemacht, geht noch einfacher.
Zumindest bei Deiner speziellen Verzeichnis-Struktur.
Ich habe es mal bei mir nachgebildet.

Mein "D:\temp" entspricht Deinem "W:\Spiel"... Egal - ich halte es variabel:
Set SPIELEROOT=D:\temp

Ausgangssituation: Unterhalb %SPIELEROOT%\accounts existieren ein paar Accounts (acc_birgit, admin. gast. user19),
die alle ein paar "Spielerkonten" angelegt haben. Acc_birgit zum Beispiel "biggi01" und "biggi02"..
Außerdem existiert ebenfalls unterhalb %SPIELEROOT% ein template-Unterzeichnis mit 2 *.txt-Dateien.
<= 9:40:46 D:\temp=>
dir /s /b %SPIELEROOT%\accounts
D:\temp\accounts\acc_birgit
D:\temp\accounts\admin
D:\temp\accounts\gast
D:\temp\accounts\user19
D:\temp\accounts\acc_birgit\biggi01
D:\temp\accounts\acc_birgit\biggi02
D:\temp\accounts\acc_birgit\gast
D:\temp\accounts\admin\DI
D:\temp\accounts\admin\MI
D:\temp\accounts\admin\MO
D:\temp\accounts\gast\player3
D:\temp\accounts\gast\player56
D:\temp\accounts\user19\megashooter
D:\temp\accounts\user19\supershooter
D:\temp\accounts\user19\supershooter\serverlog.txt

dir /s /b %SPIELEROOT%\template
D:\temp\template\setipconfig2IP.txt
D:\temp\template\vbsskripte.txt
(Die beiden *.txt sollen kopiert werden wie bei Dir beschrieben.

Lösung
Dann reicht doch logischerweise diese Zeile
"in alle Unterverzeichnissen, die ZWEI Ebenen tiefer hängen als die Ebene template kopiere...."

@for /r %SPIELEROOT%\Accounts %a in (.) do @if exist %a.\..\..\template copy %a.\..\..\template\*.txt %a

Ergebnis
<=10:01:15 D:\temp=>
dir /s /b %SPIELEROOT%\accounts\*.txt
D:\temp\accounts\acc_birgit\biggi01\setipconfig2IP.txt
D:\temp\accounts\acc_birgit\biggi01\vbsskripte.txt
D:\temp\accounts\acc_birgit\biggi02\setipconfig2IP.txt
D:\temp\accounts\acc_birgit\biggi02\vbsskripte.txt
D:\temp\accounts\acc_birgit\gast\setipconfig2IP.txt
D:\temp\accounts\acc_birgit\gast\vbsskripte.txt
D:\temp\accounts\admin\DI\setipconfig2IP.txt
D:\temp\accounts\admin\DI\vbsskripte.txt
D:\temp\accounts\admin\MI\setipconfig2IP.txt
D:\temp\accounts\admin\MI\vbsskripte.txt
D:\temp\accounts\admin\MO\setipconfig2IP.txt
D:\temp\accounts\admin\MO\vbsskripte.txt
D:\temp\accounts\gast\player3\setipconfig2IP.txt
D:\temp\accounts\gast\player3\vbsskripte.txt
D:\temp\accounts\gast\player56\setipconfig2IP.txt
D:\temp\accounts\gast\player56\vbsskripte.txt
D:\temp\accounts\user19\megashooter\setipconfig2IP.txt
D:\temp\accounts\user19\megashooter\vbsskripte.txt
D:\temp\accounts\user19\supershooter\serverlog.txt <font color=green> .....die war schon vorher da </font>
D:\temp\accounts\user19\supershooter\setipconfig2IP.txt
D:\temp\accounts\user19\supershooter\vbsskripte.txt

Voila, die beiden template\*.txt-Dateien sind da, wo sie hingehören. QED. face-big-smile
Warum unnötig kompliziert machen.

snipp CopyTemplatesII.bat
@for /r W:\Spiele\Accounts %%a in (.) do @if exist %%a.\..\..\template copy %%a.\..\..\template\*.txt %%a >NUL
snapp CopyTemplatesII.bat

HTH Biber
Member: Jediman
Jediman Aug 23, 2005 at 13:03:35 (UTC)
Goto Top
AHHHHHH face-smile

Super Danke! Damit kann ich jetzt was anfangen face-smile

Vielen lieben Dank für deine Mühe face-smile


Gruss Jediman