45753
11.04.2007, aktualisiert am 17.04.2007
15135
7
0
Datei in alle unterordner kopieren, aber unterordner-tiefe abgeben können
Hallo zusammen,
mit der For-Schleife ist es ja möglich eine Datei in alle unterordner zu vervielfältigen...
for /R %%i in (.) do copy [Datei] "%%i"
Nur habe ich noch nicht rausbekommen, wie man die tiefe der Unterordner bestimmen kann. Wenn ich also z.B. nur eine Tiefe von 2 haben möchte, dann sollte die Batch datei in der lage sein, die datei in alle unterordner bis eben zu einer unterordnertiefe von 2 zu kopieren. Ab dort wird die Datei dann nicht mehr weiter vervielfältigt. ist das möglich ?
Gruss, wobleibtdiezeit.
mit der For-Schleife ist es ja möglich eine Datei in alle unterordner zu vervielfältigen...
for /R %%i in (.) do copy [Datei] "%%i"
Nur habe ich noch nicht rausbekommen, wie man die tiefe der Unterordner bestimmen kann. Wenn ich also z.B. nur eine Tiefe von 2 haben möchte, dann sollte die Batch datei in der lage sein, die datei in alle unterordner bis eben zu einer unterordnertiefe von 2 zu kopieren. Ab dort wird die Datei dann nicht mehr weiter vervielfältigt. ist das möglich ?
Gruss, wobleibtdiezeit.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 56338
Url: https://administrator.de/contentid/56338
Ausgedruckt am: 26.11.2024 um 02:11 Uhr
7 Kommentare
Neuester Kommentar
Setze ein Variable, und wenn du bei dem gewünschten Wert angekommen bist, beende die Aktion.
Probiere es aus, sollte bis 3 funktionieren:
@echo off & setlocal
Set /A zaehler=0
for /R %%i in (.) do if %zaehler% LSS 3 call :wasweissich "%%i"
goto :eof
:wasweissich
set /A zaehler=%zaehler%+1
if %zaehler% GTR 3 goto :eof
echo %zaehler%
rem copy [Datei] "%1"
echo %1
Moin wobleibtdiezeit,
ich würde es von von der Funktionalität her trennen und dieses vielleicht auch an anderen Stellen verwendbare "Gib mir alle Unterordner unterhalb von XXX in einer Tiefe von 2 (oder 3 oder 4...oder 7)" in einen seperaten Oneliner packen.
Vielleicht lässt es sich ja noch mal wiederverwenden bei einer DirSize-Variante oder ähnlichem.
So ein Billigschnipsel könnte so aussehen:
Und würde aufgrufen werden mit den zwei Parametern Param1==StartDir und Param2==Verzeichnistiefe.
So würde ein Aufruf des Einzeilers mit "c:\Eigene Dateien" und 4 alle Unterverzeichnisse bis zu 4 Ebenen unterhalb "C:\Eigene Dateien" liefern.
...allerdings auch das Start-Verzeichnis "c:\Eigene Dateien" selbst als erste Zeile.
Dennoch, wenn Du diesen Schnipsel als Batch irgendwo abspeicherst, dann kannst Du ihn innerhalb Deines KopierMir-Batches in einer For /f-Anweisung aufrufen.
[Edit] Kannst dieses Zeile natürlich auch als geCALLten Block in Deine Batch integrieren. Dann ist er nur nicht "wiederverwendbar". [/Edit]
Beispiel in Deinem Batch :
Wermutstropfen: der "DispDirsAndSubDirs"-Batch funktioniert nur ab einer Mindesttiefe von 2 Ebenen (nicht mit EINER).
Dazu müsstest/würdest Du sinnvollerweise auf eine "For /D.." -Anweisung zurückgreifen.
Wenn Dir die obige Mimik zu aufwändig ist, kannst Du ohnehin auch 2 Verzeichnisebenen mit zwei gestaffelten FOR /D-Anweisungen abfackeln.
HTH
Biber
ich würde es von von der Funktionalität her trennen und dieses vielleicht auch an anderen Stellen verwendbare "Gib mir alle Unterordner unterhalb von XXX in einer Tiefe von 2 (oder 3 oder 4...oder 7)" in einen seperaten Oneliner packen.
Vielleicht lässt es sich ja noch mal wiederverwenden bei einer DirSize-Variante oder ähnlichem.
So ein Billigschnipsel könnte so aussehen:
:: ---------snipp DispDirsAndSubdirs.bat
@Setlocal EnabledelayedExpansion & FOR /R "%~dpnx1" %%i in (.) do @(
set "thisdir=%%~sdpnxi\." & set "relDir=!thisDir:%~sdpnx1\=!"
for /f "delims=\ tokens=1,%2,*" %%a in ("!relDir!") do @if "%%c" LEQ "." echo %%~dpnxi
)
:: ---------snapp DispDirsAndSubdirs.bat
So würde ein Aufruf des Einzeilers mit "c:\Eigene Dateien" und 4 alle Unterverzeichnisse bis zu 4 Ebenen unterhalb "C:\Eigene Dateien" liefern.
$cmd$DispDirAndSubDirs.bat "c:\Eigene Dateien" 4
c:\Eigene Dateien
c:\Eigene Dateien\My eBooks
c:\Eigene Dateien\Eigene Bilder
c:\Eigene Dateien\Eigene Webs
c:\Eigene Dateien\Eigene Webs\_vti_pvt
c:\Eigene Dateien\Eigene Webs\_private
c:\Eigene Dateien\Eigene Webs\_vti_cnf
....
Dennoch, wenn Du diesen Schnipsel als Batch irgendwo abspeicherst, dann kannst Du ihn innerhalb Deines KopierMir-Batches in einer For /f-Anweisung aufrufen.
[Edit] Kannst dieses Zeile natürlich auch als geCALLten Block in Deine Batch integrieren. Dann ist er nur nicht "wiederverwendbar". [/Edit]
Beispiel in Deinem Batch :
@Echo off
for /f "skip=1 delims=" %%i in ('D:\batches\DispDirsAndSubdirs d:\MeinOrdner 2') do Copy test.txt "%%i\test.txt"
Wermutstropfen: der "DispDirsAndSubDirs"-Batch funktioniert nur ab einer Mindesttiefe von 2 Ebenen (nicht mit EINER).
Dazu müsstest/würdest Du sinnvollerweise auf eine "For /D.." -Anweisung zurückgreifen.
Wenn Dir die obige Mimik zu aufwändig ist, kannst Du ohnehin auch 2 Verzeichnisebenen mit zwei gestaffelten FOR /D-Anweisungen abfackeln.
Set Startdir=D:\test
FOR /D %%i in ("%startdir%"} do copy test.txt ""%Startdir%\%%i\test.txt" && For /D %%j in ("%Startdir%\%%i") Do copy test.txt ""%Startdir%\%%i\%%j\test.txt"
HTH
Biber
Moin, wobleibtdiezeit,
gern geschehen, und der Vollständigkeit halber poste ich noch mal zwei "extreme" Variationen des ursprünglichen Ansatzes.
a) als ganz eigenständige Batch-Variante CopyIntoDirsAndSubdirs mit drei Parametern (1=Ab wo 2=Ebenen 3=Was)
b) als geCALLter Block innerhalb eines Batches
Ich setze den Beitrag mal auf "Gelöst" und "Geschlossen".
Gruss
Biber
gern geschehen, und der Vollständigkeit halber poste ich noch mal zwei "extreme" Variationen des ursprünglichen Ansatzes.
a) als ganz eigenständige Batch-Variante CopyIntoDirsAndSubdirs mit drei Parametern (1=Ab wo 2=Ebenen 3=Was)
:: ---------snipp CopyIntoDirsAndSubdirs.bat [Parameter z.B. d:\temp 3 x:\myStuff.txt]
@Setlocal EnabledelayedExpansion & FOR /R "%~dpnx1" %%i in (.) do @(
set "thisdir=%%~sdpnxi\." & set "relDir=!thisDir:%~sdpnx1\=!"
for /f "delims=\ tokens=1,%2,*" %%a in ("!relDir!") do @if "%%c" LEQ "." copy "%~3" "%%~dpnxi\%~nx3
)
:: ---------snapp CopyIntoDirsAndSubdirs.bat
:: ---------snipp IrgendeinBatch.bat [Parameter z.B. d:\temp 3 x:\myStuff.txt]
@echo off & Setlocal EnabledelayedExpansion
:: whatever happens ....
.....
....
:: an der nötigen Stelle:
Call :CopyIntoDirsAndSubDirs "C:\Eigene Dateien" 3 f:\blablubb.txt
...
::..weiter im Batch
goto :eof
:CopyIntoDirsAndSubDirs: [Parameter z.B. %1=d:\temp %2=3 %3=x:\myStuff.txt]
FOR /R "%~dpnx1" %%i in (.) do @(
set "thisdir=%%~sdpnxi\." & set "relDir=!thisDir:%~sdpnx1\=!"
for /f "delims=\ tokens=1,%2,*" %%a in ("!relDir!") do (
@if "%%c" LEQ "." copy "%~3" "%%~dpnxi\%~nx3
))
goto :eof
:: endOfSub :CopyIntoDirsAndSubdirs
:: ---------snipp IrgendeinBatch.bat
Ich setze den Beitrag mal auf "Gelöst" und "Geschlossen".
Gruss
Biber