Name eines Verzeichnisses per batch finden und damit weiterarbeiten?
Name eines Verzeichnisses per batch finden und damit weiterarbeiten?
Hallo
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
Hallo
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
Please also mark the comments that contributed to the solution of the article
Content-ID: 14681
Url: https://administrator.de/forum/name-eines-verzeichnisses-per-batch-finden-und-damit-weiterarbeiten-14681.html
Printed on: May 15, 2025 at 05:05 o'clock
6 Comments
Latest comment
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...
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...
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...
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.
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...
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.
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:
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=>
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
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...."
Ergebnis
<=10:01:15 D:\temp=>
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.
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
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_birgitD:\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.txtD:\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.txtD:\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.
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