tolwyn
Goto Top

If kaskade in Batch

Hallo

ich schreibe vielleicht erstmal was ich überhaupt machen will, eventuell gibt es dafür ja auch eine bessere lösung und dann mein eigentliches problem:

Ich habe zwei Ordner mit mehr oder weniger dem gleichen Inhalt (gleiche Dateinamen). Die Dateigrößen unterscheiden sich aber.
Es kann dabei sein, dass in Ordner A (fiktive "Quelle") die größere der beiden Dateien ist oder in Ordner B (fiktives "Ziel").

Alle Dateien sollen kopiert werden, aber wenn in der Quelle eine Datei eine geringere oder gleiche Größe ( <= ) hat als im Zielordner, soll sie nicht kopiert werden.

Meine Idee war mit einer FOR-Schleife eine Liste des Quellordners zu erstellen, Größe und Name der Datei zu speichern und dann mit der Datei im Zielordner zu vergleichen.

Logdatei aufbau: (eine Dir ausgabe)
25.08.2008  12:08               295 textdatei_auslesen.bat

Die Batchdatei:
@ECHO ON

for /F "tokens=3* delims= " %%I in (F:\log.txt) DO (  

::noch nicht verwendet; evtl für verwendung außerhalb der schleife
Set groesse =%%I
Set name =%%J

	IF EXIST F:\test2\%%J (	ECHO Datei existiert bereits )	ELSE (Copy "F:\test\%%J" "F:\test2\")	  
	
)

Jetzt wollte ich bei dem IF eigentlich dazu übergehen eine IF-Kaskade zu machen, wie in Java:
if(//existiert datei?) 
{
  if( //ist quelldatei größer als zieldatei?)
  {
     if(//ist quelldatei um mindestens 2MB größer?) 
     {
       etc etc etc...
     }
   }
   else 
   {
   }
}


So hab ichs mal probiert:

IF EXIST F:\test2\%%J ( IF "F:\test2\%~zJ" GTR %%I (ECHO Datei existiert) ELSE (Copy "F:\test\%%J" "F:\test2\"))

Wie würde das richtig gehen?
Das IF und ELSE kann man ja auch nicht auf mehrere Zeilen verteilen?

Gruß

Tolwyn

Content-ID: 95427

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

Ausgedruckt am: 22.11.2024 um 11:11 Uhr

miniversum
miniversum 27.08.2008 um 13:55:21 Uhr
Goto Top
Das IF und ELSE kann man ja auch nicht auf mehrere Zeilen verteilen?
Doch das geht:
IF EXIST F:\test2\%%J (
  IF "F:\test2\%~zJ" GTR %%I (  
    ECHO Datei existiert
  ) ELSE (
    Copy "F:\test\%%J" "F:\test2\"  
  )
)
Wenn du allerdings sowieso mit %~zJ arbeitest müstest du die temponääre logdatei ncith umbedingt anlegen.
Das geht dann auch so:
FOR /F "delims=" %%J in ('dir /b "F:\test\*.*"') do (  
  IF EXIST F:\test2\%%J (
    FOR /F "delims=" %%I in ('dir /b "F:\test2\%%~nxI"') do (  
      IF "F:\test2\%%~zJ" GTR %%~zI (  
        ECHO Datei existiert
      ) ELSE (
        Copy "F:\test\%%J" "F:\test2\"  
      )
    )
  )
)
bastla
bastla 27.08.2008 um 14:27:47 Uhr
Goto Top
... und mit analoger Vorgangsweise, aber Verwendung eines Schalters:
@echo off & setlocal
set "Quelle=F:\test"  
set "Ziel=F:\test2"  

for %%i in ("%Quelle%\*.*") do (  
    set DoIt=
    if not exist "%Ziel%\%%~nxi" (  
        set Doit=true
    ) else (
        for %%j in ("%Ziel%\%%~nxi") do if %%~zi gtr %%~zj set Doit=true  
    )
    If defined DoIt copy "%%i" "%Ziel%\">nul && echo %%~nxi  
)
Grüße
bastla
miniversum
miniversum 27.08.2008 um 14:40:58 Uhr
Goto Top
Ich bin mir nicht sicher ob das so funktioniert.
Werden variabeln die in Klammern (von der For-Schleife) gesetzt werden nicht erst danach aufgelöst?
das if defined DoIt würd da doch dan garnicht funktionieren, oder liege ich jetzt falsch?
bastla
bastla 27.08.2008 um 16:48:57 Uhr
Goto Top
@miniversum

... oder liege ich jetzt falsch?
Ja.

Grüße
bastla
Tolwyn
Tolwyn 27.08.2008 um 22:58:43 Uhr
Goto Top
hi

danke für eure Lösungen.
Hat soweit ganz gut funktioniert.

Die Frage ist damit erstmal gelöst.

Gruß

Tolwyn