Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst Dateien kopieren, rekursiv in einen Ordner, Dubletten durchnummerieren.

Mitglied: orlet

orlet (Level 1) - Jetzt verbinden

30.05.2006, aktualisiert 01.06.2006, 9874 Aufrufe, 4 Kommentare

auf die Gefahr hin, daß mich der Biber gleich anknappert:

Ich weis, kopieren und umbenennen ist schon oft behandelt, aber ich bekomme die Mischung nicht hin.

Erreichen möchte ich, das alle Files aus beliebig tiefen Unterverzeichnisse von %parent% in ein %target% kopiert werden. Dubletten sollen dabei nicht überschrieben, sondern durchnummeriert werden. Die Baumstruktur von %parent% soll aufgelöst werden (keine SubDirs in %target%

Ich habe folgende Skripte versucht zu kombinieren:
::-----Inhalt ftpcopy.bat
::--- MoveAll2OneDir.bat (ungetestete Skizze)

Mein Versuch:
:: --- MoveAll2OneDir.bat (ungetestete Skizze)
:: @echo off & setlocal
Set parent=s:\test\
Set target=s:\target\
Pushd "%parent%" && Rem In das parent Verzeichnis wechseln
for /F %%i in ('dir /a:D /b') do (
for /F %%a in ('dir /b /A:-d %%i\*.*') do (
if exist %target%%%a (
if exist %target%%%a-4 (echo "Worst-Case war nicht worst genug!") && pause
if exist %target%%%a-4 goto end
if exist %target%%%a-3 rename %Target%%%a-3 %%a-4
if exist %target%%%a-2 rename %Target%%%a-2 %%a-3
if exist %target%%%a-1 rename %Target%%%a-1 %%a-2
rename %target%%%a %%a-1
)
copy %parent%%i%%a% %target%%a% >nul
)
)

::del %inputdir%%filename%
Popd && rem ..und alten Zustand von Lw/Verz wiederherstellen... ist eine Stilfrage
::--- MoveAll2OneDir.bat

scheitert daran, daß der copy-Befehl irgendwie nicht richtig ist:
Datei nicht gefunden
S:\test>copy s:\test\ s:\target\ 1>nul
Das System kann die angegebene Datei nicht finden.

Irgendwie schaut %%a aber doch gefüllt zu werden, irgendwo im Output steckt ein
S:\test>(if exist s:\emese_target\install.txt ( ...

Nun bin ich in Batch-Proggen absoluter Neuling, mir geht es eigentlich nur um mein Kopier-Problem. Vor allem die Variablen-Deklarierung versteh ich gar nicht. Vielleicht erbarmt sich jemand und richtet mal mein Skript. Und vielleicht bekommt er die Nummerierung auch an den Dateinamen, und nicht an den File-Typ.

Danke
Mitglied: orlet
30.05.2006 um 20:09 Uhr
mein jetziger Stand:
:: --- MoveAll2OneDir.bat (ungetestete Skizze)
@echo off & setlocal

Set source=s:\emese
Set target=s:\target

Pushd "%source%" && Rem In das Source-Verzeichnis wechseln

echo versuche erste for
FOR /F %%i IN ('dir /A:D /b /s') DO (
for /F %%a in ('dir /b /A:-d %%i\*.*') do (
if exist %target%\%%a (

if exist %target%\%%a-9 (echo "Worst-Case war nicht worst genug!") && pause
if exist %target%\%%a-9 goto end

if exist %target%\%%a-8 rename %target%\%%a-9 %%a-9
if exist %target%\%%a-7 rename %target%\%%a-7 %%a-8
if exist %target%\%%a-6 rename %target%\%%a-6 %%a-7
if exist %target%\%%a-5 rename %target%\%%a-5 %%a-6
if exist %target%\%%a-4 rename %target%\%%a-4 %%a-5
if exist %target%\%%a-3 rename %target%\%%a-3 %%a-4
if exist %target%\%%a-2 rename %target%\%%a-2 %%a-3
if exist %target%\%%a-1 rename %target%\%%a-1 %%a-2
if exist %target%\%%a-0 rename %target%\%%a-0 %%a-1
rename %target%\%%a %%a-0
)
echo copy %%i\%%a %target%\%%a
copy %%i\%%a %target%\%%a
)
)



::del %inputdir%%filename%
Popd && rem ..und alten Zustand von Lw/Verz wiederherstellen... ist eine Stilfrage
::--- MoveAll2OneDir.bat

:end


Bleibt noch das Prob, das der index hinter der Dateiendung steht, und nicht beim Namen. Meine Experimente mit find; findstr; usw. bringen mich irgendwie nicht weiter.
Bitte warten ..
Mitglied: Biber
31.05.2006 um 21:58 Uhr
Moin orlet,

da will ich mal ein bisschen ausweichend antworten...

Die beiden Schnipsel, die Du zusammengeschraubt hast, lassen sich zwar zum Fliegen bringen, aber der Batch hat ja gleich drei Designfehler.

1) Weder Datei- noch Verzeichnisnamen mit Leerzeichen ( "C:\Dokumente und Einstellungen"..) werden verarbeitet.
War damals nicht gefordert, aber für einen allgemein verwendbaren Batch muss das rein.
2) Der ist, wie mir Dein Kommentar gezeigt hat, nicht pfleg- und wartbar. Und bei Bätchen ist es immer irgendwann so, dass die angepasst/erweitert/ergänzt werden müssen. Da helfen dann dünn kommentierte Zeilen mit einem halben Dutzend %%a's und %%o's wenig.
3) Die Behandlung der Dateinamens-Kollisionen sollte nicht so fest verdrahtet werden. Ob der Worst-Case nun auf 4 oder auf 8 oder auf 20 gesetzt wird... es wird immer zu kurz greifen. Also sollte das Umbenennen IMMER funktionieren, auch wenn Du 500 Verzeichnisse mit Shareware in einen Ordner kopierst und dort Hunderte Dateien "ReadMe.txt" oder "File.diz" dabei sind.

Ich habe mal eine Skizze gemacht für das Durchwackeln der Quell-Unterverzeichnisse. Ist nur Demo (Kopiert nicht, sondern bringt Bildschirmmeldungen, was er gerade tun WÜRDE).
Das Dateinamen-Kollisionsproblem/die Umbenennerei machen wir später.
Mimik: Das Quellverzeichnis wird von der Wurzel an Unterverteichnis für Unterverzeichnis einzeln "betreten" mit "PushD". Und hinterher wieder mit PopD auf das vorher gültige Verzeichnis zurückgegangen. Dadurch braucht nicht mehr beim Kopieren der ganze Quellpfad angegeben werden.
01.
:: --- MoveAll2OneDir.bat (ungetestete Skizze) 
02.
@echo off & setlocal 
03.
goto SkipProsa 
04.
Vorüberlegung: 
05.
Der alleralleraller-Worst-Case wäre ja theoretisch, wenn alle zu kopierenden 
06.
Dateien in den %source%-Unterverzeichnissen gleich hießen (z.B. test.txt). 
07.
Dann könnte nur die erste von 100 gefundenen mit ihrem jetzigen Namen geMOVEd/kopiert 
08.
werden; alle folgenden müssten umbenannt ("mit LfdNr hochgezählt") werden. 
09.
Also--> schaun wir doch, wieviel Dateien/Dubletten wir maximal haben. 
10.
Der DIR-Befehl gibt doch am Ende eine Summenzeile aus. 
11.
Die Summenzeile fange ich ab und hole mir daraus die Anzahl der Dateien  
12.
ohne die Unterverzeichnisse selbst mitzuzählen. 
13.
Mimik siehe beim Setzen von %MaxDups% weiter unten. 
14.
Dann können die Worst-Case-Konstrukte auch in einer For /L-Konstruktuktion 
15.
abgefackelt werden. 
16.
 
17.
:SkipProsa 
18.
::BiberTest-Section; Variable BiberTest ist bei mir außerhalb des Batches gesetzt 
19.
if defined BiberTest ( 
20.
Set source=D:\temp\pwroff30 
21.
Set target=D:\Temp\Move2OneDir 
22.
) ELSE ( 
23.
Set source=s:\emese 
24.
Set target=s:\target 
25.
26.
:: MaxDups /maximale Duplikate ermitteln == Anzahl aller Dateien überhaupt 
27.
for /f %%i in ('Dir /a:-d /s "%source%"^|find "Datei(en)"') do Set "maxDups=%%i" 
28.
 
29.
Pushd "%source%" && Rem In das Source-Verzeichnis wechseln 
30.
 
31.
echo versuche erste for 
32.
REM --- Eine Alternative zu: FOR /F %%i IN ('dir /A:D /b /s') DO ( 
33.
REM --- wäre dies: for /r %source% %%i in (.) do ( 
34.
REM --  Die vorige Zeile einfach mal so am Prompt testen: 
35.
REM --- for /r D:\temp\backup1\ %i in (.) do @echo %~dpnxi 
36.
 
37.
REM Die äußere For-Schleife...Für alle Unterverzeichnisse unterhalb %source%... 
38.
FOR /F "delims=" %%i IN ('dir /A:D /b /s') DO ( 
39.
    echo Erstes FOR: Directory [%%i] 
40.
    REM Zweite For-Schleife...Für alle Dateien im jeweiligen Unterverzeichnis 
41.
    PushD "%%i" 
42.
    FOR /F "delims=" %%a in ('dir /b /A:-d ^2^>nul') do ( 
43.
      REM Das "^2^>nul" unterdrückt die Meldung "Datei nicht gefunden", 
44.
      REM ...Wenn mal ein leeres Unterverzeichnis dabei sein sollte. 
45.
      REM --------------------------------------------------------- 
46.
      REM nächste Datei anzeigen mit vollem Pfad und Namen 
47.
      echo ......[drive-path-name-ext] [%%~dpnxa] 
48.
      ECHO ......IF not exist "%target%\%%~nxa" ^( 
49.
      ECHO .........COPY/MOVE "%%~nxa" "%target%\%%~nxa" 
50.
      ECHO ......^) 
51.
        
52.
53.
    PopD 
54.
55.
PopD 
56.
goto :eof
Mit der Skizze kannst Du erstmal loslaufen... die zeigt vor allem die Auflösung der %~d/ %~p/ %~n /%~x-Variablen.

Mit diesem Wissen kannst Du jede Datei, die irgendwo durch eine For..In..Do-Anweisung durchgeschleift wird, in ihre Pfad/Namens/Extension-Bestandteile aufspalten.

Im Moment ist in dem obigen Schnipsel folgende Demo-Sequenz in der inneren FOR-Schleife:
01.
... 
02.
      ECHO ......IF not exist "%target%\%%~nxa" ^( 
03.
      ECHO .........COPY/MOVE "%%~nxa" "%target%\%%~nxa" 
04.
      ECHO ......^) 
05.
...
  • Anmerkung: die Carets ^ vor den Klammern sind nur zur Maskierung für den Echo-Befehl da. Einfach ignorieren.
Scharf gemacht und um einen ELSE-Zweig ergänzt sähe das so aus:
01.
       ... 
02.
      IF not exist "%target%\%%~nxa" ( 
03.
            COPY/MOVE "%%~nxa" "%target%\%%~nxa" >nul 
04.
      ) ELSE ( 
05.
          Call :CopyWithRename "%%~nxa" 
06.
07.
      .... 
08.
PopD 
09.
goto :eof 
10.
~~~~~ nach der bisherigen letzten Zeile kann dann noch die Renamerei abgefackelt werden ~~~~ 
11.
:CopyWithRename Parameter 1 = Dateiname (Name +Extension, z.B ReadMe.txt) 
12.
For /L %%i in (%MaxDups%,-1,1) do if not exist "%target%\%~n1-%%i%%~x1" set "newname=%target%\%~n1-%%i%%~x1" 
13.
Copy "%1" "%Newname%"  
14.
goto :eof 
15.
 
Und diese Zeile erläutere ich:
For /L %%i in (%MaxDups%,-1,1) do if not exist "%target%\%~n1-%%i%%~x1" set "newname=%target%\%~n1-%%i%%~x1"

For /L %%i in (%MaxDups%,-1,1) do ----------> Von MaxDups an in Einserschritten runterzählen ....44, 43, 42...etc steht in der Variablen %%i

... if not exist "%target%\%~n1-%%i%%~x1"
..wenn nicht folgende Datei existiert...
%target%\ = s:\emese\
%~n1 ......= vom 1.Parameter (dateiname) nur den Namen OHNE Extension beachten == "ReadMe" bei "ReadMe.txt"
-%%i .........= wird zu "-44", "-43", "-42" etc
%%~x1 ........= vom 1.Parameter (dateiname) nur die Extension z.B ".txt"
.... wenn diese Datei S:\emese\readme-44.txt nicht existiert (der Name FREI ist)
...dann merken wir uns den.
set "newname=%target%\%~n1-%%i%%~xi"

Soweit die Skizze... ich denke, die Anpassungen bekommst Du jetzt hin.

Gruß
Biber
Bitte warten ..
Mitglied: orlet
01.06.2006 um 12:50 Uhr
Tausend Dank, auch und insbesondere für die Erläuterung. Ich glaube ich habe es sogar halbwegs verstanden. Gerade dieses %~fdpnxsatza hat mir anfänglich totales Kopfzerbrechen bereitet

(Für Leidensgenossen: Das letzte a ist die eigentliche Variable, alles davor steuert die Formatierung von a; siehe "for /?" am Promt).

Soweit die Skizze... ich denke, die
Anpassungen bekommst Du jetzt hin.

Gruß
Biber

Welche Anpassungen? Ah jetzt, Du wolltest mich testen:
set "newname=%target%\%~n1-%%i%%~xi"
muss doch wohl heißen
set "newname=%target%\%~n1-%%i%%~x1"

Nochmals danke
Orest
Bitte warten ..
Mitglied: Biber
01.06.2006 um 13:01 Uhr
Nein, das %%~xi statt %%~x1 war ein ganz normaler Tippfehler...
Mit Anpassungen meinte ich, ob Du Du nun ein COPY und danach DEL machst oder ein MOVE oder irgendwas in eine LogDatei schreibst etc...

Aber ich denke, die eigentliche Frage ist beantwortet - ich setze den beitrag mal auf "Gelöst".

Grüße
Biber
Bitte warten ..
Ähnliche Inhalte
Batch & Shell

Dateien kopieren, rekursiv in einen Ordner

gelöst Frage von golsinBatch & Shell9 Kommentare

Hallo und noch ein Frohes neues Jahr ;-) Ich bin mal wieder etwas ratlos Ich Versuche von einem Rechner ...

Batch & Shell

Ordner nach Dateien absuchen und kopieren

Frage von sbsnewbieBatch & Shell4 Kommentare

Moin Leude, folgende Frage: Ich möchte eine kleine batch bauen um ein Verezeichniss nach Dateien abzusuchen und in eine ...

Batch & Shell

Dateien in einem Verzeichnis mergen - rekursiv

gelöst Frage von frad1980Batch & Shell10 Kommentare

HAllo, ich habe folgende Ordner Struktur: 100 200 300 usw. In jedem Ordner sind PDF Dateien abgelegt. Mittels einem ...

VB for Applications

Alle Dateien rekursiv auflisten

gelöst Frage von 94451VB for Applications2 Kommentare

Hallo liebe Kollegen, ich suche nach einer Möglichkeit in VBS alle Dateien rekursiv aufzulisten hier habe ich eine Möglichkeit ...

Neue Wissensbeiträge
Drucker und Scanner
HP-MF-Drucker per Fax angreifbsr
Information von Lochkartenstanzer vor 1 TagDrucker und Scanner2 Kommentare

Endlich eine sinnvolle Verwendung für Faxe: Damit kann man offensichtlich den Drucker übernehmen. lks

Router & Routing

Das pfSense Buch ist jetzt für jeden kostenlos zu beziehen

Tipp von magicteddy vor 1 TagRouter & Routing2 Kommentare

Bisher war das Buch nur für zahlende Unterstützer verfügbar, jetzt steht für Jedermann kostenlos zur Verfügung. Siehe auch The ...

Firewall

Möglicherweise neue Sicherheitslücke in Mikrotik-Firmware

Information von LordGurke vor 4 TagenFirewall3 Kommentare

Hallo zusammen, vor ein paar Monaten gab es ja bereits eine Sicherheitslücke in der Firmware von Mikrotik-Routern, über welche ...

Erkennung und -Abwehr
Rechner hacken mit Cortana, auch Remote
Information von Lochkartenstanzer vor 5 TagenErkennung und -Abwehr3 Kommentare

heise berichtet über den Vortrag von der Blackhat Open Sesame: Picking Locks with Cortana. Einige Fehler sind schon gefixt, ...

Heiß diskutierte Inhalte
Windows 10
WIN 10 1803 - LTE Stick kein Internetzugriff
Frage von killtecWindows 1022 Kommentare

Hallo, ich habe mit einem Windows 10 1803 Probleme mit einem LTE-Stick. Das gleiche Problem ist bei mehreren Rechnern ...

CPU, RAM, Mainboards
Xeon E5620: noch schnell genug?
Frage von ahussainCPU, RAM, Mainboards19 Kommentare

Hallo allerseits, ich habe die Möglichkeit, aus Restbeständen einen Tower mit Xeon E5620 CPU und 24 GB RAM zu ...

Datenbanken
MySQL Datenbank Import Aufgabe für mehrere .csv dateien
Frage von Marcel1989Datenbanken17 Kommentare

Hi, ich komm nicht weiter. Ich hab auf einem Windows Server 2012 r2 eine MariaDB/MySQL laufen. Nun soll diese ...

Peripheriegeräte
Steckdose(nleiste) mit Schwellwert für off und mit externem Taster
Frage von ahstaxPeripheriegeräte16 Kommentare

Hallo, ich suche eine Steckdose oder Steckdosenleiste mit externem Taster und Schwellwerterkennung. Zu realisieren ist folgendes: Ein PC soll ...