galuwenator
Goto Top

Automatisiert Dateien aktualisieren

Dateien aus einem Stapel automatisch auf einem anderen Laufwerk suchen und ersetzen.

Hallo Leute,

ich habe ein einfach klingendes Problem: Ich habe Dateien auf einem Ziellaufwerk verstreut (PDF's und Video's) die regelmäßig aktualisiert werden.

Leider werden diese Dateien zigfach auf dem Laufwerk herumkopiert und das Aktualisieren ist immer eine Pest (sind derzeit ca. 200 Dateien die ich 2x im Monat so suchen und überschreiben muß).

Ich habe mir im Moment ein Batchdatei geschrieben, die die Datei nach Namen auf dem Laufwerk sucht und dann gezielt vom Vorlagelaufwerk überkopiert face-smile

Das geht aber leider immer nur File für File und hätte das gerne Automatisiert.

Nun meine Frage: Gibt es ein fertiges Tool, dass alle Files von einem Ausgangspfad nacheinander im Zielfpfad sucht und ersetzt?

Habe da auch langer Recherche nix gefunden.

[Edit Biber] Ich brauche daher Eure Hiiiilfeee !! Bitte diese Floskeln meiden in Zukunft. Danke [/Edit]

Danke Alexander
Kommentar vom Moderator Biber am Jan 25, 2010 um 06:02:19 Uhr
Beitrag verschoben von "Tools & Utilities" nach "Batch & Shell"... scheinen keine (Zusatz-)Utilities erforderlich zu sein.

Content-Key: 133722

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

Printed on: April 26, 2024 at 05:04 o'clock

Mitglied: 48507
48507 Jan 18, 2010 at 17:00:56 (UTC)
Goto Top
Suchen und ersetzen heißt, ein Spiegelabbild von einer Quelle (mit den aktuellsten Version) erstellen? Wenn ja, schau dir mal robocopy an: http://www.wintotal.de/artikel/artikel-2007/91.html
Member: TheDarkLord
TheDarkLord Jan 19, 2010 at 07:28:27 (UTC)
Goto Top
Hallo face-smile

Kann man das nicht auch einfach mit xcopy machen, oder hab ich die Fragestellung jetzt falsch verstanden?
Für ein tägliches Aktualisierungsbackup bei mir an der Arbeit nutze ich:

xcopy "C:\Beispielorder\*.*" "D:\Beispielbackupordner\" /sdyhcr
S: Kopiert Verzeichnisse und Unterverzeichnisse, die nicht leer sind
D: Kopiert nur die an oder nach dem Datum geänderten Dateien. Ist kein Datum angegeben, werden nur Dateien kopiert, die neuer als die bestehenden Zieldateien sind.
Y: Unterdrückt die Aufforderung zur Bestätigung, dass eine vorhandene Zieldatei überschrieben werden soll.
H: Kopiert auch Dateien mit den Attributen 'Versteckt' und 'System'.
C: Setzt das Kopieren fort, auch wenn Fehler auftreten.
R: Überschreibt schreibgeschützte Dateien.
Anstatt S kann E verwendet werden, dann werden auch leere Unterverzeichnisse mitkopiert.

Damit werden dann nicht jedes mal alle 23948203482304823 Dateien kopiert, sondern nur noch neu erstellte werden kopiert und veränderte werden aktualisiert, d.h. die vorhandene ältere Version im Backupverzeichnis mit der veränderten neueren überschrieben.

Ist das nicht genau Dein Anliegen?

Gruß Dark


Nachtrag:

Es kann zusätzlich auch noch noch "vo" verwendet werden.
V: Überprüft jede neue Datei auf Korrektheit.
O: Kopiert Informationen über den Besitzer und ACL.

Für denn Fall, das bestimmte Dateitypen nicht kopiert werden sollen, z.B. temp. Dateien, kann man diese ausschließen mit:
/exclude:C:\exclude.txt
In der TXT dann einfach pro Zeile die auszuschließenden Dateiendungen, z.B.
.tmp
~$
.lnk
Die ganze Zeile sähe dann so aus.
xcopy "C:\Beispielorder\*.*" "D:\Beispielbackupordner\" /sdyhcrvo /exclude:C:\exclude.txt
Member: Galuwenator
Galuwenator Jan 19, 2010 at 11:31:48 (UTC)
Goto Top
Hallo Leute,

schon mal Danke für die rasche Hilfe. Mein Problem ist, dass die "Zeildateien" über ein ganzes Laufwerk verstreut sind und sich in anderen Dateien "untermischen". Dass heisst ich habe nicht ein Ausgangs und ein Zielverzeichnis sondern ein Ausgangsverzeichnis und eine ganze Festplattenstruktur auf der das File oftmals liegt.

Geht sowas mit XCOPY?

Um es eindeutiger zu erklären:

Ich würde gerne ein Netzwerklaufwerk durchsuchen nach einer bestimmten Datei. Dann bekomme ich zum Beispiel 12 Suchergebnisse unterschiedlicher Speicherorte. Dann möchte ich diese 12 gefunden Dateien direkt in den Suchergebnissen mit einer neuen gleichlautenden Datei neueren Datums überschreiben.

Heute muss ich jedes dieser Verzeichnisse manuell öffnen und dort die Datei manuell überschreiben.

Was macht FileMonkey? Die Software durchsucht das Ziellaufwerk und speichert die Zielpfade zwischen. Dann wird automatisch ein Batchfile kreiiert, dass für jeden Zielpfad einen Kopiervorgang ausführt. Dann wird die Batchdatei ausgeführt.

Leider geht das wie oben beschrieben nur File für File....

Alexander
Member: Biber
Biber Jan 19, 2010 at 12:44:42 (UTC)
Goto Top
Moin Galuwenator,

auch das könntest mit XCopy erreichen.
XCopy kennt einen Schalter /L, der die relevanten Dateien nur anListet und nicht kopiert.
So würde ein "XCOPY N:\abc.pdf d:\temp /s /L" alle Dateien abc.pdf auf Laufwerk N:\ in allen Unterverzeichnissen auflisten (plus eine Zeile "xxx Dateien kopiert").
Wäre also dasselbe wie das Filemonkey-Resultat.
Und ja, es ginge auch mit "dir N:\abc.pdf /s /b"... aber Xcopy /L ist schneller.

Grüße
Biber
Member: Galuwenator
Galuwenator Jan 23, 2010 at 21:18:25 (UTC)
Goto Top
Hallo,

danke erst mal für die Hilfe.

Frage: Was soll das bringen? Ich will die Datei abc.pdf auf dem Ziellaufwerk austauschen und nicht nur einfach suchen. Das heisst 20mal kopieren.

Wenn ich Deinen Befehl eingebe wird nur ein Suchergebnis kopiert aber nicht die Platte durchsucht *Kopf kratz*

Alexander
Member: Biber
Biber Jan 24, 2010 at 00:03:19 (UTC)
Goto Top
Moin Galuwenator,

ich versuche nochmal eine schrittweise Heranführung an die gemeinte Strategie.

Angenommen, es ginge mir um eine Liste von 100 Dateien, die auf einem QuellLaufwerk/Pfad und/oder einer Liste/Textdatei vorlägen.
Alle diese Quelldateien Q liegen auch irgendwo auf einem Zielverzeichnis Z vor (in irgendwelchen Unterpfaden) und sollen dort ersetzt werden.

Nehmen wir an, eine dieser Dateien, die überall ersetzt werden soll, wäre eine Datei "Readme.txt" und ich wollte die überall in meinem Zielpfad [Beispiel "D:\Temp"] und darunterliegenden Verzeichnissen ersetzen.

Dann wäre mein Vorgehen
Führe für jede Datei Q folgendes durch (erste Datei Q ist wie geschrieben "Readme.txt")
  • finde alle Dateien mit dem Q-Dateinamen "Readme.txt" auf Zielverzeichnis und darunterliegenen Pfaden
Das geht wahlweise mit
> dir readme.txt /b /s
D:\temp\Bat-beispiele\fABMIN\SPRIS\Scripts\Readme.txt
D:\temp\Bat-beispiele\fABMIN\SPRIS\TestEnv\Readme.txt
D:\temp\Bat-beispiele\mp3tool\A1u570a\68\OS2\Readme.txt
D:\temp\Bat-beispiele\mp3tool\A1u570a\68\WINNT351\README.TXT
D:\temp\Bat-beispiele\mp3tool\mp3tool\A1u570a\68\OS2\Readme.txt
D:\temp\Bat-beispiele\mp3tool\mp3tool\A1u570a\68\WINNT351\README.TXT
D:\temp\uni-mainz\moveex\readme.txt
D:\temp\MBR\README.TXT
D:\temp\rplfaq97\Readme.txt
-- oder ---
> xcopy d:\temp\readme.txt? f:\just4AList\ /LSD
D:\temp\Bat-beispiele\fABMIN\SPRIS\Scripts\Readme.txt
D:\temp\Bat-beispiele\fABMIN\SPRIS\TestEnv\Readme.txt
D:\temp\Bat-beispiele\mp3tool\A1u570a\68\OS2\Readme.txt
D:\temp\Bat-beispiele\mp3tool\A1u570a\68\WINNT351\README.TXT
D:\temp\Bat-beispiele\mp3tool\mp3tool\A1u570a\68\OS2\Readme.txt
D:\temp\Bat-beispiele\mp3tool\mp3tool\A1u570a\68\WINNT351\README.TXT
D:\temp\uni-mainz\moveex\readme.txt
D:\temp\MBR\README.TXT
D:\temp\rplfaq97\Readme.txt
9 Datei(en) kopiert
--- bzw mit wegfiltern der nicht benötigten Summenzeile --

D:\temp>
> xcopy d:\temp\readme.txt? f:\just4AList\ /LSD|find /v "Datei(en)"
D:\temp\Bat-beispiele\fABMIN\SPRIS\Scripts\Readme.txt
D:\temp\Bat-beispiele\fABMIN\SPRIS\TestEnv\Readme.txt
D:\temp\Bat-beispiele\mp3tool\A1u570a\68\OS2\Readme.txt
D:\temp\Bat-beispiele\mp3tool\A1u570a\68\WINNT351\README.TXT
D:\temp\Bat-beispiele\mp3tool\mp3tool\A1u570a\68\OS2\Readme.txt
D:\temp\Bat-beispiele\mp3tool\mp3tool\A1u570a\68\WINNT351\README.TXT
D:\temp\uni-mainz\moveex\readme.txt
D:\temp\MBR\README.TXT
D:\temp\rplfaq97\Readme.txt

Diese Ergebnisliste wiederum kannst du dann als komplette ZIEL-Liste als Input in einer FOR /F-Anweisung verwenden.

Z.B (vom CMD-Prompt aus:
FOR /F "delims=" %i in ('xcopy d:\temp\readme.txt? f:\just4AList\ /LSD^|find /v "Datei(en)"') DO @echo COPY q:\bla\Readme.txt "%i"  

Das wäre mein proof-of-concept am CMD-Prompt... wenn es klappen würde, dann sollten dir (gefahrlos als Simulation) alle zusammengebratenen COPY-Befehle angezeigt werden.

In einem Batch dann jeweils zwei Prozentzeichen (%%i statt %i) und wenn es lüpt, ggf. das Wort "Echo" einfach weglassen.

Grüße
Biber
Member: Galuwenator
Galuwenator Jan 24, 2010 at 20:38:00 (UTC)
Goto Top
Ah jetzt hab ichs kapiert...Liste als Input abarbeiten..

Wau werde ich sofort ausprobieren...

Schon mal SUPER THX !!

Alexander
Member: bastla
bastla Jan 24, 2010 at 22:50:00 (UTC)
Goto Top
@Biber
Nur interessehalber: Spräche etwas gegen
replace q:\bla\Readme.txt d:\temp /s /u 
Grüße
bastla
Member: Biber
Biber Jan 25, 2010 at 05:41:36 (UTC)
Goto Top
Moin bastla,

Zitat von @bastla:
@Biber
Nur interessehalber: Spräche etwas gegen
replace q:\bla\Readme.txt d:\temp /s /u 
> 
*lach*
Natürlich nicht.... einziger Grund für die Nicht-Nennung von "Replace" war, dass ich diesen Befehl so selten verwende, dass der mir absolut nicht in den Sinn gekommen ist.

@Galuwenator
Also....zieh den optimalen Nutzen aus diesem kleinen Fachgespräch und
  • merk dir für allgemeine Batch-"Datei-Listen-Verarbeitung" die von mir gepostete (und fast immer verwendbare) Herangehensweise
  • studiere für diesen speziellen Fall noch mal die Hilfe ("Replace /? am CMD-Prompt) und verwende dann ggf für deine Anforderung die wesentlich elegantere Lösung von bastla.

Grüße
bastla
Grüße und Dank zurück
Biber
Member: Galuwenator
Galuwenator Jan 25, 2010 at 07:23:58 (UTC)
Goto Top
Hallo Bastla,

vielen Dank.

Damit bin ich wieder am Anfang meines Threads:

Kennt jemand ein kleines Prog, dass den REPLACE Befehl insofern automatisiert, dass ich eine Input-File Liste durch den Replace Befehl abarbeiten kann?

Vielen Dank.

Alexander
Member: Biber
Biber Jan 25, 2010 at 07:40:21 (UTC)
Goto Top
Moin Galuwenator,

auch das wäre wieder ein typischer Anwendungsfall für eine FOR/F-Anweisung...

Wenn du eine Liste "NeueDateien.txt" mit Pfadangaben+Dateinamen vorliegen hast:

FOR /F "delims=" %i in ("D:\einPfad\NeueDateien.txt") do replace "%i" d:\temp /s /u  
-oder, wenn alle "neuen" Dateien in einem bestimmten Verzeichnis ("D:\EinPfad") stehen
 FOR /F "delims=" %i in ('dir /b /a-d D:\einPfad\*.*') do replace "D:\EinPfad\%~nxi" d:\temp /s /u  
[jeweils wieder die Syntax vom CMD-Prompt; im Batch zwei %-Zeichen statt eines...s.o.]

Grüße
Biber

[Edit] Tippfehlerkorrektur "%~nxi" statt "~%nxi", s.Kommentar unter. [/Edit]
Member: Galuwenator
Galuwenator Jan 25, 2010 at 08:30:13 (UTC)
Goto Top
Wau,

GENAU was ich brauche! Getestet und geht.

Kompiment ans Forum!!

P.S.: Versuch 2 macht genau was ich brauche - habe nur den zweiten Teil einfach gegen "%i" getauscht - ist einfacher face-smile

Danke nochmals, Problem solved.

Alexander
Member: Galuwenator
Galuwenator Jan 25, 2010 at 08:41:55 (UTC)
Goto Top
Nein geht doch nicht...das mit dem ersten Teil des Dateipfades und die Variable zusammenhängen funktioniert nicht.

EDIT: Sorry geht doch...*Kopf kratz* mein Rechner hat im DOS-Fenster den Pfad plötzlich nicht mehr gefunden...Neues DOS-Fenster und jetzt geht es..

Alexander
Member: Biber
Biber Jan 25, 2010 at 09:02:21 (UTC)
Goto Top
Moin Galuwenator,

...öhm....das geht/geht nicht könnte unter Umständen an einem Tippfehler in meiner Skizze/Variante 2 liegen...*schäm*

Da habe ich die Reihenfolge von Prozentzeichen und Tilde vertauscht...

FALSCH (berichtige ich oben!): .... do replace "D:\EinPfad\~%nxi"
RICHTIGER: ....do replace "D:\EinPfad\%~nxi"

Sorry
Biber