tolwyn

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
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 95427

Url: https://administrator.de/forum/if-kaskade-in-batch-95427.html

Ausgedruckt am: 22.05.2025 um 04:05 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