johtoe
Goto Top

Vergessliche Schleife

Hallo in die Runde.

Sollte es mir bei der Suche entgangen sein, dass die Frage bereits behandelt wurde, so bitte ich um Nachsicht.
Nicht nur ich bin neu hier im Forum, die Batchverarbeitung ist auch noch sehr neu für mich.

Habe nun eine vorhandene Batch-Datei geringfügig erforlgreich angepasst und vom (Anfänger)-Glück beseelt mich bei weiteren Änderungen verhaspelt.

Und das sind die Beteiligten:
- die auszuführende Anwendung "befehl.exe"
- die Datei "kundennr.txt" mit wenigen Kundennummern
- die Datei "parameter.txt" mit Parametern
- die Datei "gesperrt.txt", diese Datei verhindert den Start der Anwendung "befehl.exe"

Und das soll gemacht werden:
- zuerst sollen die Kunden aufgelistet werden. Dazu wird die Datei "kundennr.txt" zeilenweise ausgelesen und die Kundennummern per ECHO ausgegeben.
- im zweiten Schritt sollen die Parameter im Klartext angezeigt werden. Dazu wird Datei "parameter.txt" zeilenweise ausgelesen und da es nur wenige sind, werden sie gleich im Klartext angezeigt.
- Pro Kunde soll die Anwednung alle Parameter abarbeiten.
- existiert die Datei "gesperrt.txt", so wird pro Kunde abgefragt, ob die Datei "gesperrt.txt" gelöscht werden soll.

Die Löschung der "gesperrt.txt" pro Kunde ist nun mein Problem. In der Schleife wird der Kunde vergessen!?

REM @ECHO OFF
CLS
Setlocal EnableDelayedExpansion
ECHO Folgende Kunden sind gelistet:
FOR /f %%i IN (kundennr.txt) DO (
	ECHO - %%i
 	)
ECHO.
ECHO Folgende Parameter werden in dieser Reihenfolge abgearbeitet:
FOR /f %%y IN (parameter.txt) DO ( 
	IF "%%y"====parameter1! ECHO - Klartext_fuer_parameter_1  
	IF "%%y"====parameter2! ECHO - Klartext_fuer_parameter_2  
	IF "%%y"====parameter3! ECHO - Klartext_fuer_parameter_3  
	)
ECHO.
PAUSE
ECHO.
FOR /f %%i IN (kundennr.txt) DO ( 
	ECHO.
	ECHO Kunde: %%i Start !time:~0,8! Uhr
:: Abfrage, ob bei Vorhandensein die Datei gesperrt.txt gelöscht werden soll.
	:Beginn
	IF NOT EXIST gesperrt.txt GOTO Weiter
	IF EXIST gesperrt.txt ECHO Anwenung gesperrt & goto Frage
	:Frage 
	ECHO Um fortzufahren muss die Datei gesperrt.txt geloescht werden.
	SET /p wahl=Wollen Sie die Datei gesperrt.txt jetzt loeschen? (J N) & goto Antwort
	:Antwort
	FOR %%a IN (J N) DO IF /i '!wahl!'=='%%a' GOTO Wahl%%a   
	ECHO.
	ECHO Ungueltige Antwort, nur (J N) & goto Frage 
	:WahlN 
	ECHO.
	ECHO Sie haben NEIN gewaehlt, Anwendung abgebrochen.
	GOTO Ende 
	:WahlJ 
	DEL gesperrt.txt 
	ECHO.
	ECHO Sie haben JA gewaehlt, die Datei gesperrt.txt wurde geloescht.
	ECHO Anwendung gestartet.
	ECHO.
	ECHO Kunde: %%i  Start   !time:~0,8! Uhr 
	:Weiter
	ECHO.
		FOR /f %%y IN (parameter.txt) DO ( 
		IF "%%y"====parameter1! ECHO.|set /p =- Klartext_fuer_parameter_1 wird durgefuehrt  
		IF "%%y"====parameter2! ECHO.|set /p =- Klartext_fuer_parameter_2 wird durgefuehrt  
		IF "%%y"====parameter3! ECHO.|set /p =- Klartext_fuer_parameter_3 wird durgefuehrt  
		start befehl.exe 
		ECHO  Beendet !time:~0,8! Uhr
		)
	)
ECHO.
ECHO Abgeschlossen %date:~0% - %time:~0,8% Uhr.
:ENDE
ENDLOCAL
ECHO.
PAUSE

Content-Key: 172490

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

Printed on: April 23, 2024 at 13:04 o'clock

Mitglied: 60730
60730 Sep 02, 2011 at 11:24:36 (UTC)
Goto Top
moin und willkommen

  • nimm bitte bitte bitte bitte bitte bitte bitte bitte bitte das vermaledeite @echo off raus, bis die Batch Wasserdicht ist.
  • dann hast du beim umwerklen offenbar hier (Zeile 11-13, 46-48) einen Bock geschossen.

IF %%y!==parameter1! ECHO
Würde ich "so" malen
IF "%%y"===="parameter1!" ECHO

Das watr das allererste grob geschnitten gefundene - aber wo hängst denn bei dir genau?

Mit anderen Worten, die Fehlerfunde haben keinen Anspruch auf Vollständigkeit.

Gruß
Member: jeb-the-batcher
jeb-the-batcher Sep 02, 2011 at 11:30:21 (UTC)
Goto Top
Hallo und willkommen,

ich denke das folgende ist ein wenig problematisch
FOR /f %%i IN (kundennr.txt) DO (  
       ....
	SET /p wahl=Wollen Sie die Datei gesperrt.txt jetzt loeschen? (J N) & goto Antwort 
	:Antwort 
	FOR %%a IN (J N) DO IF /i '%wahl%'=='%%a' GOTO Wahl%%a  

Da %wahl% nicht mehr expandiert wird weil es in einem Block liegt (soviel zur täglich wiederkehrenden Frage).
Da wäre ein !wahl! mit aktiviertem delayed expansion die bessere Wahl (Ist ja eh schon aktiv).

jeb
Member: Skyemugen
Skyemugen Sep 02, 2011 at 12:11:18 (UTC)
Goto Top
Zitat von @60730:
aber wo hängst denn bei dir genau?


Aloha T-Mo,

na beim Schildern des Problems face-wink

Den Ist-Zustand dürfen wir uns im Skript zurechtmausern, immerhin gibt er den Soll-Zustand vor ...

Wie war das mit GOTO innerhalb der Schleife? Glaube da stand etwas in unserem schönen Tutorial zur FOR-Schleife ...
Wer mag Böcke?

greetz André

P.S.:
:ENDE 
ENDLOCAL 
überflüssig
Member: Johtoe
Johtoe Sep 02, 2011 at 13:39:58 (UTC)
Goto Top
Danke für die schnelle Antworten!

Habe den Quellcode editiert.

@ TimoBeil
Anführungszeichen und die vier Gleichheitszeichen ("" und ====) in Zielen 11-13 und 46-48 gesetzt, mit dem Effekt der ausgeblendeten Parameter&Ausgabe in den geänderten Zeilen.

Zu deiner Frage: die Schleife (ab Zeile 18) vergisst die kundennr; z.B. in Zeile 42 sehe ich in der Ausgabe nur "Kunde: %i"


@ jeb-the-batcher
delayed expansion ist gesetzt, der Unterschied zwischen %wahl% und !wahl! ist mir (noch) unbekannt.
Member: Johtoe
Johtoe Sep 02, 2011 at 15:14:58 (UTC)
Goto Top
Danke für die bisherige Hilfe und insbesondere für den Link zum Tutorial.

So komme ich der Sache näher...
Nach dem ersten Überfliegen sehe ich keine Alternative, als die Abfrage nach der gesperrt.txt und auch deren Behandlung (ab Zeile 21) ohne GOTO in den Griff zu bekommen.

"Mir drei sin furchtbar talentiert – am Selvermache interessiert..."
Nehme die Lektüre mit ins Wochenende. Feuerpause bis dahin.
Member: Skyemugen
Skyemugen Sep 02, 2011 at 15:53:49 (UTC)
Goto Top
Aloha,


Statt GOTO solltest du dann eventuell das Arbeiten mit CALL :Sprungmarke versuchen face-wink

hier mal ein kurzes Beispiel für die Abfrage und {{
@echo off & setlocal enabledelayedexpansion
for %%s in (echo) do (
	:Frage
	set /p wahl=Ja oder Nein
	if /i !wahl!==J (
		echo JA
	) else (
		if /i !wahl!==N (
			echo Nein
		) else (
			echo falsche Eingabe && call :Frage
			goto :eof
		)
	)
)
echo weiter geht's  
pause

greetz André