rybog 0 Geschrieben 29. April 2014 Melden Teilen Geschrieben 29. April 2014 (bearbeitet) 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 29. April 2014 von rybog Zitieren Link zu diesem Kommentar
Dukel 455 Geschrieben 29. April 2014 Melden Teilen Geschrieben 29. April 2014 Kannst du die mmu Datei nicht jedes mal neu erstellen? Dann musst du nichts vergleichen und löschen. Ansonsten würde ich Powershell nutzen. Da könnte ich dir dann auch helfen ;) Zitieren Link zu diesem Kommentar
rybog 0 Geschrieben 29. April 2014 Autor Melden Teilen Geschrieben 29. April 2014 Hallo, leider kann ich nicht jedes Mal eine neue MNU-Datei erstellen lassen. Anstelle der Raute-Zeichen werden später Beschreibungen für jede einzelne Datei eingefügt, und es handelt sich um sehr viele Dateien. Gruß P.S. Das Skript soll BATCH-Skript sein, um in jeder Windows-Version zu funktionieren, wo kein Powershell vorhanden ist. Zitieren Link zu diesem Kommentar
h-d.neuenfeldt 21 Geschrieben 29. April 2014 Melden Teilen Geschrieben 29. April 2014 mach mal : if "%errorlevel%"=="1" ( Zitieren Link zu diesem Kommentar
rybog 0 Geschrieben 30. April 2014 Autor Melden Teilen Geschrieben 30. April 2014 (bearbeitet) 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 30. April 2014 von rybog Zitieren Link zu diesem Kommentar
Daniel -MSFT- 129 Geschrieben 30. April 2014 Melden Teilen Geschrieben 30. April 2014 (bearbeitet) Die Variable wird ebventuell in der Schleife nicht ausgewertet, wenn Du nicht 'setlocal ENABLEDELAYEDEXPANSION' vorher setzt: http://www.administr...ife-155681.html. Weiterhin sollte !errorlevel! genutzt werden. bearbeitet 30. April 2014 von Daniel -MSFT- Zitieren Link zu diesem Kommentar
rybog 0 Geschrieben 1. Mai 2014 Autor Melden Teilen Geschrieben 1. Mai 2014 (bearbeitet) 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 1. Mai 2014 von rybog Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.