rotbart
Goto Top

Batch: Einmaliges Kopieren mit Robocopy und Log abgleich

Ich bin gerade dabei eine Batchdatei zu erweitern, was aber scheinbar nicht so einfach ist wie gedacht.
Es geht darum einen Ordner Inhalt immer wieder zu kopieren (Loop), wobei der Ordnername bestehend aus 5 zahlen sich öfters ändert.
Nun wollte ich das bereits Kopierte (immer unterschiedliche Verzeichnisse) in einer Logdatei festhalten und beim erneuten Durchgang mit
der Logdatei vergleichen bzw. bereits vorhandene ausschließen.


Problem ist jetzt, das er "%%A" nicht finden kann.

set kopi="F:\ordner1\ordner2\"  
set blacklist="F:\B-List.log"  
pushd %kopi%
For /f "delims=" %%A in ('Dir /B/AD ????? ^|Findstr "^[0-9][0-9][0-9][0-9][0-9]$"') do for /f "usebackq tokens=*" %%D in (%blacklist%) do (  

    If NOT "!dirs!"=="" (  
        Set dirs=!dirs! "%%D"  
    ) Else (
        Set dirs="%%D"  
    )
)

robocopy "%%A" "E:\ordner3" /S /XD !dirs!  

set kopi="F:\ordner1\ordner2\"  
pushd %kopi%
Dir /AD /S /B > "F:\B-List.log"  

PAUSE

Was mir grad noch aufgefallen ist, das das Erstellen der Logdatei so wie ich es jetzt habe nicht viel sin macht.
Wenn beim Kopieren ein neuer Ordner rein kommt, wird er wohlmöglich vor dem kopieren mit ins log geschrieben oder?
Man könnte, das Logfile ja auch von robocopy Erstellen lassen, aber da wird das auswerten sicher schwieriger.


Ich bin dankbar für jede Hilfe. face-smile

Content-Key: 291928

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

Printed on: April 18, 2024 at 03:04 o'clock

Member: rubberman
Solution rubberman Dec 30, 2015, updated at Dec 31, 2015 at 15:30:13 (UTC)
Goto Top
Hallo Rotbart.

Mag sein, dass ich irgend etwas nicht richtig verstanden habe, aber ROBOCOPY kopiert keine Dateien die gleich sind (es sei denn, Option /IS wird übergeben). Und ja, das Loggen solltest du ROBOCOPY überlassen. Schau dir die entsprechenden /N... Optionen an, wenn du bestimmte Ausgaben nicht im Log haben willst.

Grüße
rubberman
Member: Rotbart
Rotbart Dec 30, 2015 at 16:19:24 (UTC)
Goto Top
Hallo rubberman,

danke erst mal für die Antwort.

Das Robocopy, Datein nicht doppelt kopiert, weiß ich. Das Problem ist, das nach dem Kopiervorgang der ganzen Ordner, die Inhalte weiter verarbeitet, gefiltert oder verschoben werden. Deshalb wollte ich mit einer Liste bereits kopierter Ordner arbeiten.
Wenn man diese Schalter benutzt (/NFL /NS /NC /NJH /NJS), sieht die Logdatei schon besser aus, allerdings immer noch viele Leerzeichen am Anfang.


Gruß
Rotbart
Member: rubberman
Solution rubberman Dec 30, 2015, updated at Dec 31, 2015 at 14:13:50 (UTC)
Goto Top
OK, so ganz habe ich das noch nicht verstanden, aber ich kann dir ja trotzdem versuchen eine Richtung zu zeigen.

allerdings immer noch viele Leerzeichen am Anfang
Sind Tabs. Für mein Beispiel würden die aber ignoriert werden, ebenso Leerzeilen.
Die Idee ist, einen ROBOCOPY Job zu erstellen.
In meiner Beispielumgebung gibt es ein Verzeichnis "a" als Quelle und ein Verzeichnis "x" als Ziel. Die Logdatei wird bei jedem Kopiervorgang erweitert (um die Verzeichnisse die neu kopiert wurden). Die Job Datei wird dynamisch erstellt.
@echo off &setlocal
set "src=a"  
set "dest=x"  
set "log=test.log"  
set "job=TEST"  

>"%job%.RCJ" (  
  for %%I in ("/SD:%src%\" "/DD:%dest%\" "/XX" "/S" "/R:0" "/W:0" "/NS" "/NC" "/NFL" "/NJH" "/NJS" "/NP" "/LOG+:%log%" "/XD") do (  
    echo %%~I
  )
)

copy /b "%job%.RCJ" /b + "%log%" /b  

robocopy /job:"%job%"  

Grüße
rubberman
Member: Rotbart
Rotbart Dec 31, 2015 at 12:49:02 (UTC)
Goto Top
Klingt gut die Idee.

Ich habs mal probiert, aber irgendwie bekomme ich immer eine Fehlermeldung.
Die beiden Schalter /SD /DD sagen ja, das keine Quelle und Ziel vorhanden sind. Ich hab sie mal rausgenommen, bekomme dann aber eine andere Fehlermeldung (Ungültiger Parameter #1 "/Job:TEST" ).

So habe ich Deine Vorlage jetzt angepasst. Ordner a und x sind auch angelegt. Die Jobdatei wird auch erstellt und danach kommt der Fehler.

@echo on &setlocal
:P1
set "src=C:\Users\SL\Desktop\Batch-test\a"   
set "dest=C:\Users\SL\Desktop\Batch-test\x"  
set "log=test.log"   
set "job=TEST"  

>"%job%.RCJ" (   
  for %%I in ("%src%\" "%dest%\" "/XX" "/S" "/R:0" "/W:0" "/NS" "/NC" "/NFL" "/NJH" "/NJS" "/NP" "/LOG+:%log%" "/XD") do (  
    echo %%~I 
)
)

copy /b "%job%.RCJ" /b + "%log%" /b  

robocopy /job:"%job%"  

timeout /t 100
goto P1
Member: rubberman
Solution rubberman Dec 31, 2015 updated at 14:13:31 (UTC)
Goto Top
Die beiden Schalter /SD /DD sagen ja, das keine Quelle und Ziel vorhanden sind.
Nee im Gegenteil. Sie geben Quelle und Ziel an.

Dein Fehler kommt (ausnahmsweise) vom sonst nützlichen ECHO ON. Der Prompt wandert mit in die Job Datei, was natürlich zum Crash führt.
Ergo, stelle den Prompt mit ECHO OFF wieder aus.

//Edit
Genügt natürlich, wenn du das nur für die Umleitung tust, à la
>"%job%.RCJ" (  
  @echo off
  for %%I in ("%src%\" "%dest%\" "/XX" "/S" "/R:0" "/W:0" "/NS" "/NC" "/NFL" "/NJH" "/NJS" "/NP" "/LOG+:%log%" "/XD") do (  
    echo %%~I 
  )
  echo on
)

Grüße
rubberman
Member: Rotbart
Rotbart Dec 31, 2015 updated at 15:32:50 (UTC)
Goto Top
Perfekt face-smile

Jetzt funktioniert es wie erhofft. Vielen Dank.

Jetzt ist nur noch eine Sache. Wie bekomme ich die for schleife für die Ordnersuche mit rein? Nach Ordner2, ist immer ein dynamischer Ordnername mit zahlen vorhanden, und erst danach kommen die zu kopierenden Verzeichnisse.

set kopi="F:\ordner1\ordner2\ ?? \"  
pushd %kopi%
For /f "delims=" %%A in ('Dir /B/AD ????? ^|Findstr "^[0-9][0-9][0-9][0-9][0-9]$"')  


Gruß Rotbart
Member: rubberman
Solution rubberman Dec 31, 2015 updated at 16:08:22 (UTC)
Goto Top
Naja, genau an der Stelle verstehe ich den Sinn nicht. Aber vielleicht so:
@echo off &setlocal
set "kopi=F:\ordner1\ordner2"  
set "dest=E:\ordner3"  

for /f "delims=" %%i in ('dir /ad /b "%kopi%\?????"^|findstr /x "[0-9][0-9][0-9][0-9][0-9]"') do for %%j in ("%kopi%\%%i") do (  

  >"JOB.RCJ" (  
    for %%I in ("/SD:%%~fj\" "/DD:%dest%\" "/XX" "/S" "/R:0" "/W:0" "/NS" "/NC" "/NFL" "/NJH" "/NJS" "/NP" "/LOG+:log_%%i.log" "/XD") do (  
      echo %%~I
    )
  )
  copy /b "JOB.RCJ" /b + "log_%%i.log" /b  
  robocopy /job:"JOB"  

)

Grüße
rubberman
Member: Rotbart
Rotbart Dec 31, 2015 at 16:15:59 (UTC)
Goto Top
Genial. face-smile

Funktioniert sehr gut, und ich konnte wieder was dazu lernen. Vielen Dank noch mal.


Ich wünsche dir noch einen guten Rutsch ins neu Jahr. face-smile

Liebe Grüße
Rotbart
Member: rubberman
rubberman Dec 31, 2015 at 16:40:07 (UTC)
Goto Top
Das wünsche ich dir auch face-smile

Grüße
rubberman
Member: Rotbart
Rotbart Jan 14, 2016 at 13:02:00 (UTC)
Goto Top
Hallo rubberman

Jetzt hab ich noch ein anderes ähnliches anliegen. Es geht darum zib und rar Dateien nur einmalig
zu entpacken. Ich weiß das es den Schalter -o- gibt, welcher bereits vorhandenes überspringt.
Problem hierbei ist aber, das Winrar für das Prüfen ganz schön lange braucht, bzw. nicht gerade Ressourcenarm ist.
Die Idee ist jetzt praktisch die gleiche wie bei Robocopy.
Hier könnte man jetzt auch mit einer Logdatei arbeiten und den Ordnerinhalt mit dieser vergleichen.
Dazu wollte ich das alle zib/rar Dateien nach abarbeiten ins log geschrieben werden (außer Fehlerhaftes) und bei
erneutem durchgang, mit dem Ordnerinhalt verglichen wird. Jetzt sollen nur noch neue nicht vorhandene entpackt werden.


Mein Versuch das ganze einzubauen, klappt irgendwie noch nicht. Die "RAR-LOG.txt" wird zwar erstellt aber ohne Inhalt.
Es kommt auch der Fehler "%%A" ungültig.

@echo on
:P1
setlocal ENABLEDELAYEDEXPANSION
set folder="E:\quelle\"  
pushd %folder%
set path="C:\Program Files\WinRAR\";%path%  
FOR /F "delims=*" %%A IN ('dir /b /s /a-d *.rar') do (unrar x "%%A" "%%~dpA") && echo  
"%%A">>E:\RAR-LOG.txt  

if %errorlevel%==1 goto P2
if %errorlevel%==2 goto P2
if %errorlevel%==3 goto P2
if %errorlevel%==4 goto P2
if %errorlevel%==5 goto P2
if %errorlevel%==6 goto P2
if %errorlevel%==8 goto P2
if %errorlevel%==10 goto P2

Mit dieser Zeile wollte ich den Ordnerinhalt mit der RAR-LOG.txt vergleichen und an Winrar übergeben.

for /f "delims=" %%i in ('dir /b /s /ad ') do @Findstr "%%i" /C E:\RAR-LOG.txt >nul || @echo %%i  



Wäre super, wenn du noch mal helfen könntest.


Gruß
Rotbart
Member: rubberman
Solution rubberman Jan 14, 2016, updated at Jan 20, 2016 at 11:51:47 (UTC)
Goto Top
Hallo Rotbart,

mit WinRAR kann ich nicht viel anfangen. Nie installiert/benutzt. Zeile 8 gehört aber an Zeile 7 angehängt, à la
FOR /F "delims=*" %%A IN ('dir /b /s /a-d *.rar') do (unrar x "%%A" "%%~dpA" && echo %%A>>E:\RAR-LOG.txt)  

Erst mal weiß ich nicht so genau was du mit den elfundneunzig Errorlevelabfragen vorhast. Nach der Schleife hast du den Errorlevel des allerletzten Aufrufs von unrar an dieser Stelle. Und wenn du nicht mit der Errorlevelvariable arbeitest, sondern statt dessen mit dem althergebrachten ...
if errorlevel 1 goto P2
... was so viel heißt wie "Wenn der Errorlevel größer oder gleich 1 ist, dann...", brauchst du das nicht für jeden Wert einzeln.

Mit dieser Zeile wollte ich den Ordnerinhalt mit der RAR-LOG.txt vergleichen und an Winrar übergeben.
Sinnvollerweise wirst du doch sicher die Ausgabe des DIR Commands direkt an FINDSTR übergeben.
FOR /F "delims=*" %%A IN ('dir /b /s /a-d *.rar^|findstr /lvxg:"E:\RAR-LOG.txt"') do (unrar x "%%A" "%%~dpA" && echo %%A>>"E:\RAR-LOG.txt")  

Grüße
rubberman
Member: Rotbart
Rotbart Jan 15, 2016 at 18:37:19 (UTC)
Goto Top
Danke erst mal.

Ich hab jetzt ein wenig rumprobiert, bekomm es aber nicht hin.
Klingt jetzt vllt komisch, aber mal funktioniert es und dann wieder nicht.
Jetzt vergleicht er aber überhaupt nicht mehr mit Vorhandenen. Dadurch das nicht mehr verglichen wird, springt er nun gleich zu Unrar, und fragt ob überschrieben werden soll. -.-
Temporär hab nun erst mal mit -o- das überschreiben wieder verhindert. In der DepackLOG.txt wird alles Gefundene richtig aufgelistet. Kann es sein das der "findstr /lvxg:" Befehl fehlerhaft arbeitet?
Ein Problem ist auch, das man für den g: Schalter, erst die "DepackLOG.txt" anlegen (einmalig) und eine Zeile manuell einfügen muss. Ansonsten kommt eine Fehlermeldung.

So hab ich es jetzt stehen.
@echo on
:P1
setlocal ENABLEDELAYEDEXPANSION
set folder="E:\Ordner1\Ordner2\Ordner3\Ordner4\"  
pushd %folder%
FOR /F "delims=*" %%A IN ('dir /s /b *.rar^|findstr /lvxg:"DepackLOG.txt"') do ("C:\Program Files\WinRAR\unrar" x -o- "%%A" "%%~dpA" && echo %%A>>"DepackLOG.txt")  

if %errorlevel%==1 goto P2
if %errorlevel%==2 goto P2
if %errorlevel%==3 goto P2
if %errorlevel%==4 goto P2
if %errorlevel%==5 goto P2
if %errorlevel%==6 goto P2
if %errorlevel%==7 goto P2
if %errorlevel%==8 goto P2
if %errorlevel%==9 goto P2


Das mit dem Errorlevel musste ich so lösen, da Winrar bei erneutem Durchlauf, immer die Meldung "Keine Dateien zum Entpacken gefunden" ausgibt. Die Meldung hat den Error Code 10.
Wenn das mit dem Vergleichen funktioniert, dann könnte ich auch Dein bsp. (if errorlevel 1 goto P2) nutzen.
Das die Errorabfrage jetzt nur den Letzten überprüft, ist natürlich auch nicht sin der Sache.
Am besten wäre es doch, wenn alles einzeln abgearbeitet wird oder? Also Entpacken + Error prüfen.


Grüße
Rotbart
Member: rubberman
Solution rubberman Jan 15, 2016, updated at Jan 20, 2016 at 11:51:53 (UTC)
Goto Top
Kann es sein das der "findstr /lvxg:" Befehl fehlerhaft arbeitet?
Normalerweise nicht. Wichtig ist nur dass die Pfade ohne umschließende Anführungszeichen in der Datei abgelegt sind. Ansonsten:
/L vergleiche als Stringliteral (nicht als RegEx)
/V gib nur das aus, was nicht gefunden wurde
/X vergleiche die gesamte Zeile
/G: Suchzeichenfolgen aus der angegebenen Datei entnehmen.

Ein Problem ist auch, das man für den g: Schalter, erst die "DepackLOG.txt" anlegen (einmalig) und eine Zeile manuell einfügen muss. Ansonsten kommt eine Fehlermeldung.
Dann schreib eine Zeile, die nicht in einem Pfad vorkommen kann/darf. Z.B. so:
if not exist "DepackLOG.txt" >>"DepackLOG.txt" echo(^<  


Das mit dem Errorlevel musste ich so lösen, da Winrar bei erneutem Durchlauf, immer die Meldung "Keine Dateien zum Entpacken gefunden" ausgibt.
Erstens verstehe ich nicht, warum diese Meldung kommen sollte und zweitens kann ich dir keine Lösung anbieten, solange ich nicht weiß, was du in diesem Fall tust.

Grüße
rubberman
Member: Rotbart
Rotbart Jan 16, 2016 updated at 19:11:21 (UTC)
Goto Top
Hab jetzt mal den findstr befehl, in eine extra Textdatei schreiben lassen. Leider sind tatsächlich Anführungszeichen in der Ausgabe vorhanden. Ich hab auch schon andere Schalter versucht, aber die Anführungszeichen bleiben bestehen.


Mit der If Errorabfrage wollte ich bis jetzt nur in eine Warteschleife gehen, und dann wieder bei :P1 starten. Das wäre dann für den fall, das die Datei noch nicht vollständig vorhanden ist. Wenn die zib/rar nun aber beschädigt ist, müsste sie übersprungen werden. Das Überspringen würde bei auslassen bestimmter Error Codes automatisch passieren.

Das ist übrigens die Winrar Errorliste.

0 Successful operation.
1 Warning. Non fatal error(s) occurred.
2 A fatal error occurred.
3 Invalid checksum. Data is damaged.
4 Attempt to modify a locked archive.
5 Write error.
6 File open error.
7 Wrong command line option.
8 Not enough memory.
9 File create error.
10 No files matching the specified mask and options were found.
11 Wrong password.
255 User break.


Gruß
Rotbart
Member: rubberman
Solution rubberman Jan 16, 2016, updated at Jan 20, 2016 at 11:52:00 (UTC)
Goto Top
Leider sind tatsächlich Anführungszeichen in der Ausgabe vorhanden.
Woher kommen die noch? Ich habe die Anführungszeichen bei der ECHO Umleitung längst entfernt.

Mit der If Errorabfrage wollte ich bis jetzt nur in eine Warteschleife gehen
Das betriftt doch dann nur die entsprechende Datei und nicht alle. Warum also noch einmal von vorn alle Dateien beackern?
OK, also etwa so:
@echo off &setlocal
set folder="E:\Ordner1\Ordner2\Ordner3\Ordner4\"  
pushd %folder%
if not exist "DepackLOG.txt" >>"DepackLOG.txt" echo(^<  
FOR /F "delims=*" %%A IN ('dir /s /b *.rar^|findstr /lvxg:"DepackLOG.txt"') do (  
  "C:\Program Files\WinRAR\unrar" x "%%A" "%%~dpA"  
  if not errorlevel 10 if errorlevel 1 (
    >nul timeout /t 10 /nobreak
    "C:\Program Files\WinRAR\unrar" x "%%A" "%%~dpA"  
    if not errorlevel 1 >>"DepackLOG.txt" echo %%A  
  ) else (
    >>"DepackLOG.txt" echo %%A  
  )
)
Grüße
rubbermann
Member: Rotbart
Rotbart Jan 17, 2016 at 13:56:57 (UTC)
Goto Top
Das mit den Anführungszeichen hab ich falsch verstanden. Ich dachte, das nach dem findstr Befehl keine Anführungszeichen mehr sein dürfen.
Problem ist aber immer noch, das er bei jeder .rar datei fragt, ob sie überschrieben werden soll. Eigentlich sollte er nur die .rar bekommen, die noch nicht abgearbeitet wurden. Scheinbar kann Winrar, mit der Ausgabe vom Findstr befehl nichts anfangen. Bin ratlos

Die Errorabfrage ist so jetzt besser gelöst, danke. face-smile


Gruß
Rotbart
Member: rubberman
Solution rubberman Jan 17, 2016, updated at Jan 20, 2016 at 11:52:04 (UTC)
Goto Top
Schreib doch einfach mal ein ECHO vor die unrar Zeilen und ein PAUSE ans Ende des Codes (oder auch in die Schleife, damit du jede einzelne Datei bewerten kannst). Dann passiert zwar nichts, aber du siehst wie unrar aufgerufen werden würde.

Grüße
rubberman
Member: Rotbart
Rotbart Jan 18, 2016 at 10:30:02 (UTC)
Goto Top
Also es liegt demnach wohl am Findstr Befehl. Ich hab nun mehrere Schalterkombis probiert und mit echo geschaut, was passiert. Mit /lvxg: gibt er alles an winrar weiter, egal was in der "DepackLOG.txt" steht. Mit /smvg: wird schon mal ein teil der "DepackLOG.txt" berücksichtigt, aber eben nicht alles. Jetzt hab ich geprüft, ob es an den Dateinamen gelegen haben könnte, aber auch hier keine Eigenheiten oder Ähnliches. Zu lang sind die Bezeichnungen auch nicht. Funktioniert das den bei dir?


Gibts nicht noch die Möglichkeit das ganz mit einer IF-Abfrage zu lösen?


LG
Rotbart
Member: rubberman
Solution rubberman Jan 18, 2016, updated at Jan 20, 2016 at 11:52:05 (UTC)
Goto Top
Nee, nee, irgendwas muss mit den Daten in der Logdatei faul sein. Prüf noch mal, ob du irgendwelche voran- oder nachgestellte Leerzeichen in der Zeile hast. (In dem Zusammenhang auch prüfen, ob sich nach echo %%A in deinem Script noch ein Leerzeichen eingemogelt hat.) Nochmal: Option /x vergleicht die gesamte Zeile mit allem was dort steht und das macht auch absolut Sinn. Schließlich willst du ja nicht einen ähnlichen, sondern genau den aktuellen Dateiname matchen.

Grüße
rubberman
Member: Rotbart
Rotbart Jan 18, 2016 at 19:59:08 (UTC)
Goto Top
Hast recht, in der Logdatei sind noch Leerzeichen am ende vorhanden. Ich hab sie mal versuch mit ^.$ zu entfernen, klappt aber nicht. Hast du noch eine Idee?
Member: rubberman
Solution rubberman Jan 18, 2016, updated at Jan 20, 2016 at 11:52:07 (UTC)
Goto Top
\s$
... je nachdem was dein Texteditor an RegEx so alles supportet.
Member: Rotbart
Rotbart Jan 19, 2016 at 08:23:17 (UTC)
Goto Top
Das bedeutet also das ich vor der Übergabe an Winrar, erst noch die Leerzeichen mit Notepad entfernen muss. Müsste ich dazu nicht noch eine tmp.txt erstellen lassen, die das zuvor aufgelistete reinschreibt/dann mit Notepad (Leerzeichen, Tabs) entfernen/dann erst Übergabe an Winrar?
Scheint doch etwas aufwendiger zu werden, als ich dachte. face-confused


Gruß
Rotbart
Member: rubberman
Solution rubberman Jan 19, 2016, updated at Jan 20, 2016 at 11:52:10 (UTC)
Goto Top
Nein. Ich dachte du wolltest nur einmalig die vorhandene Datei editieren ...

Das Leerzeichen kommt ja irgendwo her. Anders gesagt, beim Schreiben der Logdatei läuft was schief. Das ist der Grund, warum ich dir oben schon mal geschrieben hatte, dass du dir auch den Code noch mal anschaun sollst. Die Vermutung liegt nahe, dass du in den beiden Zeilen mit
>>"DepackLOG.txt" echo %%A
noch ein zusätzliches Leerzeichen hinter dem %%A stehen hast. Das würde mit dem ECHO auch ausgegeben werden und wandert bei der Umleitung in die Datei.

Grüße
rubberman
Member: Rotbart
Rotbart Jan 19, 2016 at 20:40:14 (UTC)
Goto Top
Die verdammten Leerzeichen, nach %%A war noch eins.
Jetzt funktioniert es wie erhofft face-smile
Vielen Dank noch mal für die Hilfe.


Beste Grüße
Rotbart
Member: Rotbart
Rotbart Jan 20, 2016 at 13:10:32 (UTC)
Goto Top
Hallo rubberman,

jetzt habe ich doch noch eine frage .^^
Kann ich die "DepackLOG.txt" vom entpacken Ablauf auch für den Robocopy Job nutzen? Ich hatte nämlich zum Testen einen Ordner mit fehlerhaften Rararchiv erstellt und mit der Batch durchlaufen lassen. Das Problem ist nun, das der Robocopy Job den fehlerhaften Ordner/rar mit aufzeichnet. Beim erneutem Durchgang und aktualisierten Rarfile, würde robocopy den Ordner + Inhalt auslassen.
Das mit der IF-Abfrage beim entpackenprozess, funktioniert nur bei Daten die gerade im Quellverzeichnis erstellt werden. Bei einer defekten Datei kann es schon mal dauern bis sie ausgetauscht wird. Deshalb, die Idee, gleich die DepackLOG dafür zu nutzen.
Mein versuch die Texdatei einzuschleusen klappt nicht ganz.


@echo off &setlocal
set "src=E:\Ordner1\Ordner2\Ordner3\Ordner4\DepackLOG.txt"  
set "log=copylog"  
set "job=JOB"   

>"%job%.RCJ" (   
for /f %%I in ("%src%" "/XX" "/S" "/R:0" "/W:0" "/NS" "/NC" "/NFL" "/NJH" "/NJS" "/NP" "/LOG+:%log%" "/XD") do (   
      echo %%~I 
)
echo on
)

copy /b "%job%.RCJ" /b + "%log%" /b  

robocopy /job:"%job%" "F:\  

Um nur die Order zu kopieren, müsste ich noch /LEV:5 nutzen oder?
Wäre super, wenn du noch ein letztes mal helfen könntest. face-smile


Liebe grüße
Rotbart
Member: rubberman
rubberman Jan 20, 2016 at 18:26:27 (UTC)
Goto Top
Ich wollte, ich würde bei dem Durcheinander wieder mal durchblicken face-sad
Das Problem ist nun, das der Robocopy Job den fehlerhaften Ordner/rar mit aufzeichnet.
Keine Ahnung was du meinst. Manchmal glaube ich, du vergisst völlig, dass niemand außer dir vor deinem Rechner sitzt und sieht was du siehst.

Nochmal ganz langsam. In deiner DepackLOG.txt Datei finden sich die Namen der verarbeiteten *.rar Dateien. Die /XD Option von Robocopy spezifiziert Verzeichnisse die augeschlossen werden sollen. Es sollte ziemlich offensichtlich sein, dass das nicht funktionieren kann.

Grüße
rubberman
Member: Rotbart
Rotbart Jan 21, 2016 updated at 09:15:03 (UTC)
Goto Top
Tut mir leid, wenn es zu durcheinander ist. Ich Versuch es noch mal einfacher.

Nur der Inhalt der DepackLOG.txt, soll für den Robocopy Job benutzt werden. In der DepackLOG.txt steht jetzt Folgendes drin.
E:\Ordner1\Ordner2\Ordner3\Ordner4\Testordner1\file1.rar
E:\Ordner1\Ordner2\Ordner3\Ordner4\Testordner2\file2.rar
E:\Ordner1\Ordner2\Ordner3\Ordner4\Testordner3\file3.rar

Nun soll aber nicht nur das "file.rar" kopiert werden, sondern alles was nach Ordner4\ kommt.

Das, ist der aktuelle Robocopy ablauf.
@echo off &setlocal
set "src=E:\Ordner1\Ordner2\Ordner3\Ordner4\DepackLOG.txt"   
set "log=COPYLOG.log"  
set "job=JOB"   

>"%job%.RCJ" (   
for %%I in ("%src%" "/XX" "/S" "/R:0" "/W:0" "/NS" "/NC" "/NFL" "/NJH" "/NJS" "/NP" "/LOG+:%log%") do (   
      echo %%~I 
)
echo on
)

copy /b "%job%.RCJ" /b + "%log%" /b  

robocopy /job:"%job%" "F:\Ordner1\Ordner2" /S /XF *.rar  
Der Versuch ohne /XD, gibt weiterhin diese Fehlermeldung aus.
Invalid Job File, Line #15 :"E:\Ordner1\Ordner2\Ordner3\Ordner4\Testordner1\file1.rar" 
Invalid Parameter #1 : "/job:JOB" 
Weitere versuche ohne "/XX" oder mit "/IF%src%" brachten den gleichen Error. Keine Ahnung wie man das jetzt Lösen soll.


Ich hoffe jedenfalls, das durcheinander ist jetzt etwas verständlicher. face-smile


Gruß
Rotbart
Member: rubberman
rubberman Jan 21, 2016 updated at 17:08:52 (UTC)
Goto Top
Keine Ahnung wie man das jetzt Lösen soll.
Statt wild drauf los zu probieren, die Hilfe zu Robocopy lesen, wäre mein Ansatz gewesen.

Nun soll aber nicht nur das "file.rar" kopiert werden, sondern alles was nach Ordner4\ kommt.
Ähm, du meinst "Testordner1" bis "Testordner3"?
Ungetestet:
for /f "usebackq skip=1 delims=" %%i in ("E:\Ordner1\Ordner2\Ordner3\Ordner4\DepackLOG.txt") do (  
  robocopy "%%~dpi." "F:\Ordner1\Ordner2" /S /XF "%%i"  
)
Das /XF habe ich aus deinem Code übernommen, ich denke aber eher, dass du alles nach /S wegnehmen solltest.

Grüße
rubberman
Member: Rotbart
Rotbart Jan 21, 2016 updated at 20:47:17 (UTC)
Goto Top
Ja, Ordner1 bis Ordner3. Also alles, was sich in Ordner4 befindet.

So wie Du den Code jetzt hast, braucht es ja eigentlich kein RobocopyJob mehr. Allerdings fehlt mir bei Deinem Beispiel noch das Abgleichen mit bereits kopierten Dateien. Kann aber auch sein, das ich deinen Code nicht verstanden habe.

Ansonsten wollte ich das Abgleichen jetzt so lösen, wie bei Deinem Beispiel zum Entpacken.
Etwa so hier:
set folder="E:\Ordner1\Ordner2\Ordner3\Ordner4\"  
pushd %folder%
if not exist "COPYLOG.txt" >>"COPYLOG.txt" echo(^<  
for /f "skip=1 delims=" %%A in ('"E:\Ordner1\Ordner2\Ordner3\Ordner4\COPYLOG.txt"^|findstr /lvxg:"DepackLOG.txt"') do (  
robocopy "%%A" "%%~dpA" "F:\Ordner1\Ordner2" /S /XF & echo %%A>>COPYLOG.txt)  

Irgendwo ist aber wieder der Wurm drin.
The filename, directory name, or volume label syntax is incorrect


LG
Member: rubberman
Solution rubberman Jan 21, 2016, updated at Jan 25, 2016 at 19:25:14 (UTC)
Goto Top
Ja, Ordner1 bis Ordner3. Also alles, was sich in Ordner4 befindet.
Ich kann an meinem Rechner nicht sehen, ob das bei dir alles ist, oder ob sich auch noch ein Ordner4711 und ein Ordner0815 darin befindet. Ebenso wenig, was damit passieren soll, wenn es so wäre.

Ich weiß nicht was du da tust. Das einzige was ich machen kann ist mitraten.
set "folder=E:\Ordner1\Ordner2\Ordner3\Ordner4\"  
pushd "%folder%"  
if not exist "COPYLOG.txt" >>"COPYLOG.txt" echo(^<  
for /f "skip=1 delims=" %%A in ('findstr /lvxg:"DepackLOG.txt" "COPYLOG.txt"') do (  
  robocopy "%%~dpA." "F:\Ordner1\Ordner2" /S & echo %%A>>COPYLOG.txt)  
popd
Member: Rotbart
Rotbart Jan 22, 2016 updated at 18:16:34 (UTC)
Goto Top
Hey rubberman,

ich habe den Batchablauf jetzt so gut wie fertiggestellt. Dein letztes Beispiel hat mir dabei auch weiter geholfen. Danke dafür.

Nun gibt es nur noch ein einziges Problem.
In der folgenden "test.txt" Datei, sind an jedem Zeilenende, noch Backslash \ vorhanden. Diese möchte ich gern alle gelöscht haben. Zu erwähnen sei noch, das der Textdatei inhalt, dynamisch ist. Es können z. B. auch mal 10 oder 30 Zeilen vorhanden sein. Dabei ist das Zeilenende jeder Zeile, immer ein Backslash.
So sieht der Textinhalt aus. test1 und test2 sind Ordner.
E:\Ordner1\Ordner2\Ordner3\Ordner4\test1\
E:\Ordner1\Ordner2\Ordner3\Ordner4\test2\
...usw.

Am ende, soll die "text.txt" dann einfach gespeichert oder ersetzt werden.
Ich sitze mittlerweile schon wieder stunden davor, und bin am Verzweifeln. Würde mich freuen, wenn du dafür noch eine Lösung hast. face-smile


Liebe Grüße
Rotbart
Mitglied: 114757
Solution 114757 Jan 22, 2016, updated at Jan 25, 2016 at 19:25:03 (UTC)
Goto Top
Moin,
in der folgenden "test.txt" Datei, sind an jedem Zeilenende, noch Backslash \ vorhanden. Diese möchte ich gern alle gelöscht haben.
@echo off & setlocal ENABLEDELAYEDEXPANSION
>"C:\pfade_ohne_backslash.txt" (for /f "usebackq delims=" %%a in ("C:\text.txt") do set "fullpath=%%a" & echo !fullpath:~0,-1!)  
Gruß jodel32
Member: rubberman
Solution rubberman Jan 22, 2016, updated at Jan 25, 2016 at 19:25:05 (UTC)
Goto Top
Diese möchte ich gern alle gelöscht haben.
Ist machbar. Leider schreibst du nicht warum das so sein soll. Vielleicht ist dir der Punkt in
robocopy "%%~dpA." ...
aufgefallen. Der steht für "dieses Verzeichnis". Ein "C:\foo\." ist gleichbedeutend mit "C:\foo". Wenn du also die Pfade in deiner Datei weiterverarbeiten willst und dich der Backslash stört, kannst du ebenso gut nach dem Einlesen einer Zeile den Punkt anhängen. Aber das nur nebenbei (da ich glaube, du machst dir das Leben manchmal selbst schwer, erklärst aber nie was dein Endziel für die Aktionen ist)...

Wie auch immer. Derselbe Punkt dient auch der Entfernung der Backslashes, wie von dir gewünscht.
@echo off &setlocal
>"%temp%\temp.txt~" (  
  for /f "usebackq delims=" %%i in ("text.txt") do for %%j in ("%%~i.") do echo %%~fj  
)
move /y "%temp%\temp.txt~" "text.txt"  

Grüße
rubberman

//EDIT Huch, hier liest ja doch noch jemand mit face-smile
Mitglied: 114757
114757 Jan 23, 2016 updated at 15:16:02 (UTC)
Goto Top
Zitat von @rubberman:
EDIT Huch, hier liest ja doch noch jemand mit face-smile
Zufällig über den Mega-Thread gestolpert, da wollte ich dir etwas unter die Arme greifen face-smile Ich kenn das wenn ein TO nicht locker lässt face-wink, obwohl man hier ja kaum noch durchblickt was der TO damit eigentlich bezwecken will. Eine saubere Liste von Robocopy bekommt man auch mit einem 1-Zeiler Powershell, aber damit ist der TO sicherlich noch mehr überfordert.

Als denn, dann noch viel Spaß hier...
Gruß jodel32
Member: Rotbart
Rotbart Jan 25, 2016 at 20:20:35 (UTC)
Goto Top
Danke Jodel32 und Rubberman. face-smile
Das ganze funktioniert jetzt wie gewünscht und kann nun abgehackt werden.

@rubberman
Das mit dem Punkt am ende ist eigentlich die beste Lösung. Problem bei der sache ist nur, wenn mal ein Punkt im Verzeichnisnamen vorhanden ist, wird bis dort auch gekürzt. So war es jedenfalls beim Testen. Egal, mit deinem Code für Entfernung der Backslashes, funktioniert es ja nun auch. face-smile

@114757
Ich hätte wohl besser zwei Threads aufmachen sollen, statt hier alles reinzuhauen. Zu viel Durcheinader, geb ich dir recht.
Mit Powershell kenn ich mich leider gar nicht aus, vllt wäre es damit aber sogar einfacher gewesen.


Gruß
Rotbart