Jump to content

IF-Bedingung in Verbindung mit FIND in einer FOR-Schleife (Batch-Skript))


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo,

ich habe mir ein BATCH-Skript geschrieben, das mit einer Verknüpfung vom Ordner „SendTo“ aufgerufen wird und folgende Aufgabe bewältigt:

Ein Ordner wird nach bestimmten Dateien durchsucht (*.prt.* *.asm.* *.drw.*) und die gefundene Dateinamen werden in eine MNU-Datei geschrieben.

Das Skript:

@echo off
cd /d %1
echo %~n1> %~n1.mnu
echo #>> %~n1.mnu
echo #>> %~n1.mnu
for /f "tokens=1-2 delims=." %%x in ('dir /b /l /o:n *.prt.* *.asm.* *.drw.*') do (
   echo %%x.%%y>> %~n1.mnu
   echo #>> %~n1.mnu
   echo #>> %~n1.mnu
)

Das Ergebnis in der MNU-Datei:

archive   <-- Name des durchsuchten Ordners
#
#
datei1.prt
#
#
datei2.prt
#
#
datei3.prt
#
#
datei1.asm
#
#
datei2.asm
#
#
datei3.asm
#
#
datei1.drw
#
#
datei2.drw
#
#
datei3.drw
#
#

Ich wollte noch zwei Bedingungen einfügen, die überprüfen:
- ob eine MNU-Datei im Ordner bereits vorhanden ist, und
- ob neue Dateien dazugekommen sind.

Wenn ja, dann soll das Skript die Erstellung der MNU-Datei überspringen und in die vorhandene MNU-Datei nur die Dateinamen einfügen, die neu dazugekommen sind.

Die erste Aufgabe war leicht (siehe die 3. Zeile).
Die zweite Aufgabe in der FOR-Schleife bereitet mir Schwierigkeiten.
Ich habe eine Syntax in der 9. Zeile geschrieben, um es zu verdeutlichen, was ich erreichen möchte.

@echo off
cd /d %1
if not exist %~n1.mnu (
   echo %~n1> %~n1.mnu
   echo #>> %~n1.mnu
   echo #>> %~n1.mnu
)
for /f "tokens=1-2 delims=." %%x in ('dir /b /l /o:n *.prt.* *.asm.* *.drw.*') do (
   if find /i "%%x.%%y" %~n1.mnu goto found   <--Diese Syntax ist natürlich falsch, zeigt aber mein Vorhaben.
   echo %%x.%%y>> %~n1.mnu
   echo #>> %~n1.mnu
   echo #>> %~n1.mnu
   :found
)

Kann mir bitte jemand einen Tipp geben, wie ich es bewerkstelligen könnte?

Gruß

 

=== EDIT===

 

Hallo,
ich habe einen Ansatz gefunden. Ich überprüfe jedes mal, ob es eine gegebene Datei gibt.

@echo off
cd /d %1
if not exist %~n1.mnu (
   echo %~n1> %~n1.mnu
   echo #>> %~n1.mnu
   echo #>> %~n1.mnu
)
for /f "tokens=1-2 delims=." %%x in ('dir /b /l /o:n *.prt.* *.asm.* *.drw.*') do (
    find /i "%%x.%%y" %~n1.mnu
    if %errorlevel%==1 (
        echo %%x.%%y>> %~n1.mnu
        echo #>> %~n1.mnu
        echo #>> %~n1.mnu
    )
)

Leider funktioniert die Anfrage "if %errorlevel%==1" nicht wie gewünscht. Das heißt, ich möchte wissen, ob "find" auch etwas gefunden hat.
In der Batch-Konsole dagegen funktioniert diese Abfrage wunderbar. Warum dieser Unterschied?

bearbeitet von rybog
Link zu diesem Kommentar

Hallo,
leider ändert sich dadurch nichts.

Die Anweisung FIND funktioniert tadellos nur der ERRORLEVEL ist immer „0“ bei gefundenen und nicht gefundenen Dateinamen. Ich habe zusätzlich eine Bildschirm-Ausgabe für den ERRORLEVEL eingefügt, um es zu verdeutlichen.

@echo off
cd /d %1
if not exist %~n1.mnu (
   echo %~n1> %~n1.mnu
   echo #>> %~n1.mnu
   echo #>> %~n1.mnu
)
for /f "tokens=1,2 delims=." %%x in ('dir /b /l /o:n *.prt.* *.asm.* *.drw.*') do (
    find /i "%%x.%%y" %~n1.mnu
    echo %errorlevel%   <-- Nur zum Testen der ERRORLEVEL-Ausgabe auf dem Bildschirm
    if "%errorlevel%"=="1" (
        echo %%x.%%y>> %~n1.mnu
        echo #>> %~n1.mnu
        echo #>> %~n1.mnu
    )
)
cmd /k   <-- Nur zum Testen der ERRORLEVEL-Ausgabe auf dem Bildschirm
bearbeitet von rybog
Link zu diesem Kommentar

Hallo Daniel,

 

Volltreffer! Es funktioniert!

Vielen, vielen Dank! Ich muss nur noch das Skript in Windows XP testen (Ja, ja, ich weiß. Es wird nicht mehr von Microsoft unterstützt.).

 

Und hier noch das ganze Skript für die, die vielleicht etwas davon lernen möchten:

@echo off
setlocal enabledelayedexpansion
cd /d %1
if not exist %~n1.mnu (
    echo %~n1> %~n1.mnu
    echo #>> %~n1.mnu
    echo #>> %~n1.mnu
)
for /f %%x in ('dir /b /l /o:n *.') do (
    find /i "/%%x" %~n1.mnu
    if !errorlevel!==1 (
        echo /%%x>> %~n1.mnu
        echo #>> %~n1.mnu
        echo #>> %~n1.mnu
    )
)
for /f "tokens=1-2 delims=." %%x in ('dir /b /l /o:n *.prt.* *.asm.* *.mfg.* *.drw.* *.gph.* *.sec.* *.spl.* *.tbl.* *.sym.*') do (
    find /i "%%x.%%y" %~n1.mnu
    if !errorlevel!==1 (
        echo %%x.%%y>> %~n1.mnu
        echo #>> %~n1.mnu
        echo #>> %~n1.mnu
    )
) 

Gruß

bearbeitet von rybog
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...