45753
Goto Top

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.

Content-ID: 56338

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

Ausgedruckt am: 26.11.2024 um 02:11 Uhr

46503
46503 11.04.2007 um 12:33:28 Uhr
Goto Top
Setze ein Variable, und wenn du bei dem gewünschten Wert angekommen bist, beende die Aktion.
45753
45753 11.04.2007 um 12:38:57 Uhr
Goto Top
Ja, das ist auch mein Wunsch. Nur habe ich keine Ahnung wie ich Unterordner zählen kann., bzw der Batch datei das beibringen kann.
46503
46503 11.04.2007 um 13:08:15 Uhr
Goto Top
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
45753
45753 15.04.2007 um 21:03:10 Uhr
Goto Top
Hallo hpdnm,

ich habe das gerade mal auprobiert...
Der Batch macht leider nicht das wonach ich suche. Folgendes Szenario:

In einem Ordner liegt eine Datei die ich in alle unterordner bis zu einer Tiefe von 2 in alle jeweiligen unterordner kopieren möchte - also z.B.:

Baumstruktur:
OrdnerAA\OrdnerAB\OrdnerAC
OrdnerBA\OrdnerBB\OrdnerBC

Die Batch sollte das hier können:

Datei kopieren nach
OrdnerAA
OrdnerAA\OrdnerAB
OrdnerBA
OrdnerBA\OrdnerBB

Die jetzige Batch würde so vorgehen:

Datei kopieren nach
OrdnerAA
OrdnerAA\OrdnerAB
OrdnerAA\OrdnerAB\OrdnerAC
OrdnerBA

Gibt es dafür eine Lösung?
Vielleicht kann man die Anzahl der Backslashs von dem Ordner in dem man sich gerade befindet bis zu der gewünschten Ordnertiefe zählen lassen...

Wenn es mit Boardmitteln nicht geht...
-Bei Robocopy kann man ein /LEV:n angeben, doch das bezieht sich meines Wissens nur auf den Source Folder und nicht auf den Destination Folder.
-Kann xxcopy das vielleicht ?

Grüsse,
wobleibtdiezeit
Biber
Biber 15.04.2007 um 23:16:26 Uhr
Goto Top
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:
:: ---------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
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.
$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
....
...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 :
@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
45753
45753 16.04.2007 um 14:59:00 Uhr
Goto Top
Hallo Biber,

Danke fuer deine Antwort. Ich werde versuchen mich heute abend drum zu kümmern, sodass die meine Antwort hoffentlich nicht lange auf sich warten läst...

Ich habe Deinen Schnipsel jetzt ausprobiert und es funtioniert alles. In meine Batch habe ich es noch nicht eingebaut, aber das wird nach Deiner Ausführlichen Anleitung denke ich nicht sehr schwer werden. Ich begeb mich mal dran.

Vielen Danke für Deine Hilfe!

Grüsse,
wobleibtdiezeit
Biber
Biber 17.04.2007 um 19:29:24 Uhr
Goto Top
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)

:: ---------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
b) als geCALLter Block innerhalb eines Batches


:: ---------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