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

Nur kopierte Dateien in Datei ausgeben bzw. loggen

Frage Entwicklung Batch & Shell

Mitglied: LPRathmann

LPRathmann (Level 1) - Jetzt verbinden

20.05.2010, aktualisiert 13:16 Uhr, 7083 Aufrufe, 13 Kommentare

Hallo zusammen,

ich habe ein Skript, welches mir bestimmte Dateien kopiert.

Nun habe ich eine weitere Anforderung. Ich möchte die Dateien nur EINMAL kopieren, daher dachte ich, dass ich xcopy /EXCLUDE einsetze.

D.h. über xcopy /exclude:exclude.txt && echo %%i.txt >> exlucde.txt

wobei %%i.txt die gefundenen Text-Dateien sind.

Das funktioniert im Prinzip auch, leider schreibt er aber immer die gefundenen DAteien in die Datei exclude.txt. Ich möchte aber, dass die Dateien nur in die exclude.txt geschrieben werden, wenn die Datei auch kopiert wird, sonst hab ich sie ja zig mal drin stehen.
Hab mit errorlevel experimentiert, aber komme nicht hin (errorlevel ist immer 0).

Beispiel:
1.Durchlauf
3 gefunden Dateien 123456.txt, 234567.txt, 345678.txt
=> sollen kopiert werden
=> Dateinamen sollen zusätzlich in exclude.txt geschrieben werden

2.Durchlauf
3 gefunden Dateien 123456.txt, 234567.txt, 345678.txt (also keine neuen!)
=> sollen nicht kopiert werden (Ausschluss über exclude.txt)
=> Dateinamen sollen NICHT in exclude.txt geschrieben werden

3.Durchlauf
4 gefunden Dateien 123456.txt, 234567.txt, 345678.txt, 456789.txt (also 1 neue!)
=> 456789.txt soll kopiert werden (die anderen Ausschluss über exclude.txt)
=> nur Dateiname 456789.txt sollen in exclude.txt geschrieben werden

Hier mein bisheriger Code (der aber jedesmal in die exclude.txt schreibt):


01.
@Echo off 
02.
Set "Base=C:\temp\csv\source" 
03.
Set "Target=C:\temp\csv\target" 
04.
Set "LogFile=exclude.txt" 
05.
 
06.
pushd %base% 
07.
 
08.
if not exist %LogFile% copy NUL %LogFile% 
09.
 
10.
For /f "delims=" %%i in ('Dir /B/AD /O-D ?????? ^|Findstr "^[0-9][0-9][0-9][0-9][0-9][0-9]$"') Do (  
11.
  if Exist "%%i\Fehler\%%i.txt" xcopy "%%i\Fehler\%%i.txt" %target% /d /exclude:%LogFile% && if %errorlevel% == 0 echo %%i.txt >> %LogFile% 
12.
)

Danke!!
Mitglied: Connor1980
20.05.2010 um 12:59 Uhr
Sollen die Dateien nur kopiert werden wenn sie verändert wurden bzw. neu sind? Dann wäre es ganz einfach mit
robocopy /MIR 
hinzubekommen.
/MIR
macht einen Spiegel der Quelldateien ins Zielverzeichnis. Es gibt allerdings noch viele weitere Schalter, die dir evtl. behilflich sein könnten. Vllt. hilft dir das weiter.

P.S.: Bitte formatiere deinen Code noch mit den dafür vorgesehenen Codetags, s. Formatierungshilfe.
Bitte warten ..
Mitglied: LPRathmann
20.05.2010 um 13:15 Uhr
Wenns geht möchte ich auf "externe" Tools wie Robocopy verzichten (unbestritten der Tatsache, dass Robocopy höchstwahrscheinlich viel geeigneter wäre).

Ich bin ja auch schon relativ weit mit dem Skript, nur noch nicht ganz am Ziel.

Es sollen nur die Dateien, die neu dazugekommen sind, kopiert werden (Änderungen gibt es im Moment nicht).
Im Prinzip macht das ja schon "xcopy /d", aber die Dateien im Zielverzeichnis werden in eine DB importiert und anschließend gelöscht, daher reicht xcopy /d nicht aus, da sonst immer alle Dateien kopiert werden. Daher die Idee mit dem exclude...
Bitte warten ..
Mitglied: Connor1980
20.05.2010 um 13:55 Uhr
Unter welchem Betriebssystem arbeitest du denn? robocopy ist von MS und ab Windows 2003 Server und Vista dabei.
Ich hatte eben überlegt das mit einem DIR im Anschluss zu lösen, aber dann hast du ja wesentlich mehr Text um die eigentlichen Dateinamen noch herumschwirren...
Bitte warten ..
Mitglied: LPRathmann
20.05.2010 um 14:23 Uhr
Zitat von Connor1980:
Unter welchem Betriebssystem arbeitest du denn? robocopy ist von MS und ab Windows 2003 Server und Vista dabei.

Ich glaub Windows 2000 Server, muss aber nochmal nachschauen!

Ich hatte eben überlegt das mit einem DIR im Anschluss zu lösen, aber dann hast du ja wesentlich mehr Text um die
eigentlichen Dateinamen noch herumschwirren...

Kann Dir da jetzt nicht ganz folgen...

Also wenns überhaupt nicht mit Batch gehen sollte und ich zwingend Robocopy verwenden muss, dann wär das zwar schade, aber zuminest ne Aussage...
Wenns doch geht mit Batch, dann bitte ich um Hilfe/Vorschläge
Bitte warten ..
Mitglied: bastla
20.05.2010 um 18:06 Uhr
Hallo LPRathmann!

Abgesehen davon, dass wegen des "&&" das folgende "if %errorlevel% == 0" ohnehin sinnlos ist, kann das innerhalb der Schleife gar nicht wie gewünscht funktionieren (Stichwort "delayedexpansion") - allenfalls wäre noch "if not errorlevel 1" eine Alternative (aber genauso unnötig), daher sollte reichen:
if Exist "%%i\Fehler\%%i.txt" xcopy "%%i\Fehler\%%i.txt" "%target%" /d /exclude:"%LogFile%" && echo %%i.txt>>"%LogFile%"
Was ist eigentlich das genaue Ziel der Aktion? Ein neuerliches Kopieren der bereits im Zielordner vorhandenen Dateien erfolgt ja wegen des "/d" ohnehin nur, wenn die Quelldatei zwischenzeitlich verändert wurde und daher neuer ist; zudem könntest Du ja auch einfach per "if exist" prüfen, ob es die zu kopierende Datei im Zielordner bereits gibt ...

Grüße
bastla
Bitte warten ..
Mitglied: LPRathmann
20.05.2010 um 19:17 Uhr
Zitat von bastla:

Was ist eigentlich das genaue Ziel der Aktion? Ein neuerliches Kopieren der bereits im Zielordner vorhandenen Dateien erfolgt ja
wegen des "/d" ohnehin nur, wenn die Quelldatei zwischenzeitlich verändert wurde und daher neuer ist; zudem
könntest Du ja auch einfach per "if exist" prüfen, ob es die zu kopierende Datei im Zielordner bereits
gibt ...


Die Dateien werden im Zielordner in eine Datenbank verarbeitet. Nach erfolgreicher Verarbeitung wird die im Zielordner gelöscht, da ansonsten über DB-Logik ebenfalls noch geprüft werden muss was schon verarbeitet ist. Außerdem auch aus Platzgründen sollen die Dateien nach erfolgreicher Verarbeitung in die DB gelöscht werden, daher das ganze...

Bei Deinem Skript werden die Dateien aber doch immer in die Log-Datei geschrieben, unabhängig davon, ob kopiert wird oder nicht. Das möchte ich ja nicht, weil ansonsten die exluce.txt ganz schön groß wird und die Dateinamen redundant drin stehen. (Im Quellverzeichnis wird nie gelöscht)
Bitte warten ..
Mitglied: bastla
20.05.2010 um 19:51 Uhr
Hallo LPRathmann!
Bei Deinem Skript werden die Dateien aber doch immer in die Log-Datei geschrieben, unabhängig davon, ob kopiert wird oder nicht.
Mein Script ist eigentlich zunächst nur eine Korrektur zu Deinem Ansatz - die Abfrage von %errorlevel% in Deiner Version liefert aus zwei Gründen immer 0: Erstens, weil das "&&" vorweg schon den Errorlevel checkt und nur, wenn dieser 0 ist (also "xcopy" ohne Fehler beendet wurde), den Rest der Zeile ausführt, und zweitens, weil innerhalb der Schleife %errorlevel% immer den Wert liefert, der bereits vor der Schleife enthalten war (gilt auch für andere Variable, wenn keine "delayedExpansion" verwendet wird).
Wenn ich das richtig verstehe sollen also alle Dateien also nur genau einmal kopiert werden (unabhängig davon, ob sie nachträglich noch verändert wurden) - in diesem Fall würde ich das (ungetestet) so versuchen:
01.
@echo off & setlocal 
02.
Set "Base=C:\temp\csv\source" 
03.
Set "Target=C:\temp\csv\target" 
04.
Set "LogFile=exclude.txt" 
05.
 
06.
pushd %base% 
07.
if not exist %LogFile% copy NUL %LogFile% 
08.
 
09.
for /f "delims=" %%i in ('Dir /B/AD /O-D ?????? ^|Findstr "^[0-9][0-9][0-9][0-9][0-9][0-9]$"') Do (  
10.
  if exist "%%i\Fehler\%%i.txt" findstr /i /x /c:"%%i.txt" "%LogFile%" || (copy "%%i\Fehler\%%i.txt" %target% >nul && >>"%LogFile%" echo %%i.txt) 
11.
12.
popd
Grüße
bastla
Bitte warten ..
Mitglied: LPRathmann
21.05.2010 um 09:16 Uhr
Hallo bastla,

danke für die Antwort.
Genau im Moment ist es so, dass es nur neue Dateien geben kann, keine Änderungen daran. (wenn doch ist das dann das Kriterium für Robocopy?)

Ich habe Dein Skript mal probiert, leider funktioniert es noch nicht so wie gewünscht:

1. Ausführung (keine DAteien im Zielverzeichnis; 3 Dateien im Quellverzeichnis);

=> Die Dateien werden kopiert, die Dateinamen in das Logfile eingetragen (3 Einträge). Bis hierher sieht alles gut aus.

2. Ausführung (3 Dateien im Zielverzeichnis; 3 Dateien im Quellverzeichnis);

=> Kopiert wird nichts (richtig), aber leider wandern wieder die Dateinamen in das Logfile, das dann 6 Einträge hat...

Was mir noch aufgefallen ist, dass das Skript leider langsam ist. Dies liegt vermutlich an der Volltextsuche und dass für jede Datei in das Logfile geschaut werden muss? Bei sehr vielen Dateien im Quellverzeichnis wäre das vermutlich sher langsam...
...was jetzt aber kein Vorwurf sein soll
Bisher muss ich davon ausgehen, dass die Dateien im Zielverzeichnis nach Verarbeitung gelöscht werden müssen.
Ein xcopy /D war deutlich schneller...aber erfordert eben, dass die Dateien im Zielverzeichnis nicht gelöscht werden....

Oder gibt es noch andere Ansätze für mein Problem?

Aber erstmal würde ich gerne das Skript oben lauffähig machen (@bastla: mit Deiner Hilfe )
Bitte warten ..
Mitglied: LPRathmann
21.05.2010 um 09:51 Uhr
Hallo bastla,

es geht jetzt. Das /x bei findstr war schuld. Wenn ich das weglasse, dann gehts:

01.
@echo off & setlocal 
02.
 
03.
Set "Base=C:\temp\csv\source"  
04.
Set "Target=C:\temp\csv\target"  
05.
Set "LogFile=exclude.txt"  
06.
 
07.
pushd %base% 
08.
 
09.
REM Log- und Exclude-Datei erstellen, falls nicht vorhanden 
10.
if not exist %LogFile% copy NUL %LogFile% 
11.
 
12.
REM 6stellige mit exclude test 
13.
For /f "delims=" %%i in ('Dir /B/AD /O-D ?????? ^|Findstr "^[0-9][0-9][0-9][0-9][0-9][0-9]$"') Do (  
14.
	if Exist "%%i\Fehler\%%i.txt" findstr /i "%%i.txt" "%LogFile%" || ( copy "%%i\Fehler\%%i.txt" %target% >nul && >>"%LogFile%" echo %%i.txt ) 
15.
16.
 
17.
popd
Bitte warten ..
Mitglied: bastla
21.05.2010 um 10:11 Uhr
Hallo LPRathmann!
Das /x bei findstr war schuld
Du hast ja fixe Namensstrukturen (6 Zeichen numerisch) und kannst daher tatsächlich darauf verzichten, da nicht zu befürchten ist, dass ein Teilstring als Treffer gewertet wird (weil zB "11333.txt" in "111333.txt" enthalten wäre); trotzdem funktioniert bei meinem (inzwischen vorgenommenen Test) auch der Vergleich der kompletten Zeile ...
Da "/d" als Schalter für "xcopy" nicht in Frage kommt: Könnte ev das "Archiv"-Attribut genutzt werden, bzw anders formuliert: Werden die Dateien, nachdem sie einmal kopiert wurden, noch verändert? Falls es keine Veränderung gibt (und das Script vor dem täglichen Backup, welches vermutlich das Archivbit zurücksetzt, ausgeführt wird), wäre ein
xcopy /m ...
eine Alternative ...
[Edit]
Um aber auch Deinen ursprünglichen Plan nochmals aufzugreifen:
xcopy "%%i\Fehler\%%i.txt" "%target%\" /y /exclude:"%LogFile%" >>"%LogFile%"
sollte auch klappen - wenn es auch hässlich ist, bei jedem (versuchten) Kopiervorgang einen Eintrag der Art
1 Datei(en) kopiert
zu erhalten (zum Wegfiltern wäre allerdings schon wieder einn "find" oder "findstr" nötig, also etwa:
xcopy "%%i\Fehler\%%i.txt" "%target%\" /y /exclude:"%LogFile%"|findstr /v /c:"Datei(en) kopiert" >>"%LogFile%"
[/Edit]

Grüße
bastla
Bitte warten ..
Mitglied: LPRathmann
21.05.2010 um 11:22 Uhr
Hallo bastla,

ich muss noch einen Fehler von mir korrigieren: Dein Skript funktioniert natürlich auch mit findstr /x

Ich hatte dummerweise beim schreiben in das Logfile " ... echo %%i.txt )" geschrieben => mit einem Leerzeichen vor der schließenden Klammer, daher waren die Einträge in der Logfile z.B. "123456.txt " und somit konnte die Suche "123456.txt" nicht funktionieren...



Deine anderen Vorschläge probier ich jetzt auch mal...danke mal schon soweit!!

[Edit]

Zitat von bastla:
Da "/d" als Schalter für "xcopy" nicht in Frage kommt: Könnte ev das "Archiv"-Attribut
genutzt werden, bzw anders formuliert: Werden die Dateien, nachdem sie einmal kopiert wurden, noch verändert? Falls es keine
Veränderung gibt (und das Script vor dem täglichen Backup, welches vermutlich das Archivbit zurücksetzt,
ausgeführt wird), wäre ein
xcopy /m ... 
> 
eine Alternative ...

Hierzu braucht man aber Schreibrechte im Zielordner, richtig?

[/Edit]
Bitte warten ..
Mitglied: bastla
21.05.2010 um 12:46 Uhr
Hallo LPRathmann!
Hierzu braucht man aber Schreibrechte im Zielordner, richtig?
Im Quellordner aber auch (sollte "Attribute schreiben" sein) ...

Grüße
bastla
Bitte warten ..
Mitglied: LPRathmann
21.05.2010 um 13:21 Uhr
Hallo bastla,

im Quellordner ist klar
Im Zielordner könnte es aber für mich durchaus sein, dass ich keine Schreibrechte habe.
Ich habe jetzt übrigens alle 3 Methoden zum Laufen bekommen. Vielen Dank für Deine Hilfe!!!
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Zeitstempel an kopierter Datei
gelöst Frage von RitzratzBatch & Shell4 Kommentare

Hallo, ich kopiere aus einer Quelle Dateien an unterschiedliche Ordner. Dieses Script wird mehrmals am Tag ausgeführt. Die Dateinamen ...

Windows 7
Kopierte Dateien im Hintergrund anzeigen
Frage von MichiBLNNWindows 71 Kommentar

Guten Tag, bei einem Programm (liegt auf einem Win2008 32bit Server) habe ich den Verdacht, dass dieses Programm viele ...

Batch & Shell
Ergebnis in Text datei ausgeben
gelöst Frage von caschoplBatch & Shell2 Kommentare

Hallo, irgendwie stehe ich auf dem schlauch. Habe folgende Batch erstellt, aber der Text wier immer überschrieben. Das ergebnis ...

Batch & Shell
Anführungszeichen in Batch Datei ausgeben
gelöst Frage von AtalicsBatch & Shell6 Kommentare

Guten Abend Leute, ich wollte eine Verknüpfung per CMD erstellen (Code von bastla, funktioniert ohne meine Veränderungen einwandfrei ^^), ...

Neue Wissensbeiträge
Microsoft

Update KB4073578 für AMD CPU (Spectre und Meltdown Lücke)

Information von sabines vor 5 StundenMicrosoft

Wegen Problemen (BOSD, nicht startende PCs) wurde das Update KB4056897 und KB4056894 für AMD CPUs zurückgezogen. Dieses Update KB4073578 ...

Mac OS X

MacOS wo ist die Tilde ?

Tipp von Alchimedes vor 18 StundenMac OS X3 Kommentare

Hallo, ich hab eine MacOS qwertz Keyboard auf US Layout umgestellt da die Sonderzeichen besser erreichbar sind. Leider fehlt ...

Datenschutz

Weitere Informationen zum Sicherheitsproblem BeA

Information von Penny.Cilin vor 1 TagDatenschutz

Im folgenden ein weiterer Bericht über die Sicherheitsprobleme von Bea. Fataler Konstruktionsfehler im besonderen elektronischen Anwaltspostfach Gruss Penny

Windows 10

Systemdienste behalten nach Win10 inplace-Upgrade nicht die ggf. modifizierte Startart bei

Tipp von DerWoWusste vor 1 TagWindows 103 Kommentare

Stellt Euch vor, Ihr habt ein Win10 System und modifiziert dort die Startart von Systemdiensten. Zum Beispiel wollt Ihr ...

Heiß diskutierte Inhalte
Batch & Shell
Anmeldevorgang für Informatikraum (Schule) unter Windows
gelöst Frage von IngenieursBatch & Shell25 Kommentare

Hey zusammen, ich werde in naher Zukunft den Informatik Raum meiner jetzigen Schule von dem aktuellen Betreiber übernehmen (Vertrag ...

Windows 10
Netbook erkennt Soundkarte nicht - keinerlei Info zum Hersteller und Modell vom Netbook und Hardware bekannt
Frage von fyrb38Windows 1019 Kommentare

Guten Tag, meine Schwester reist in einigen Wochen für ein paar Monate ins Ausland und hat sich dafür ein ...

Batch & Shell
AD-Abfrage in Batchdatei und Ergebnis als Variable verarbeiten
gelöst Frage von Winfried-HHBatch & Shell19 Kommentare

Hallo in die Runde! Ich habe eine Ergänzungsfrage zu einem alten Thread von mir. Ausgangslage ist die Batchdatei, die ...

Netzwerkgrundlagen
Welches Modem für VDSL 50000 der T-Com
Frage von Windows10GegnerNetzwerkgrundlagen18 Kommentare

Hallo, ein Kollege von mir will sich VDSL50000 von der T-Com holen, um daran einen Server zu betreiben. Ich ...