teknopapst
Goto Top

(Batch file) Fehler durch konkurrierenden Dateizugriff, aber wie so ?

Hi Leute, ich verzweifle mal wieder an einem Batch file ;) vielleicht sollte ich langsam mal ne vernünftige Skriptsprache lernen.

Folgendes:

Ich habe 4 möglich Inputparameter die ich unterscheiden und ein passender Funktionsaufbau in einer Ausgabedatei erzeugen muss.
Das Funktioniert soweit, allerdings bekomme ich Probleme wenn ich ECHO ausgaben mehrfach hintereinander in eine Datei umleite.

Auf der DOS-Konsole bekomme ich den Fehler:

Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.

Und der Output ist ehr in zufälliger Reihenfolge und nicht wie ich ihn erwartet habe. Zu dem oben genannten Fehler habe ich zwar 2 Beiträge finden können, diese haben mir aber leider nicht weitergeleitet. Daher dieser Eintrag mit der Bitte, dass Ihr euch das mal anseht und mir, falls möglich, aus der Patsche helft.


Das Skript seiht wie folgt aus:
@Echo off
REM /*********************************************************************************************************************/
REM /*! \brief  MsgLostStateMode.bat erzeugt aus dem Input-Textfile 3 Ausgabedateien in denen die 
REM  *          MsgLostStateMode-Funktionsrümfe, die entsprechenden DUMMY-Defines sowie, die Initialisierrungsaufrufe
REM  *          enthalten sind.
REM  *                          
REM  *  \pre defined var "FUNKTIONSRUMF_OUT" var  
REM  *  \param  Input-Textfile nach dem Schema (MsgLostFunktion1	Botschaft 	MsgLost)
REM  *  \output 3 Textfiles (funktionsrümfe, Dummy-defines, initaufrufe)
REM **********************************************************************************************************************/
SET FUNKTIONSRUMF_OUT=MsgLost_Funktions.txt
SET DEFINES_OUT=MsgLost_Defines.txt
SET INIT_OUT=MsgLost_Init.txt

REM Löschen der ausgabe Dateien (falls bereists vorhanden)
IF EXIST %FUNKTIONSRUMF_OUT% DEL %FUNKTIONSRUMF_OUT%
IF EXIST %DEFINES_OUT% DEL %DEFINES_OUT%
IF EXIST %INIT_OUT% DEL %INIT_OUT%



FOR /f "tokens=1-3*" %%f IN (Input.txt) DO call :FUNKTIONSRUMF "%%f" "%%g" "%%h" & call :DEFINES "%%h" & CALL :INITIALISATION "%%g" "%%h"  
GOTO eof

REM /*********************************************************************************************************************/
REM  MsgTimeOut funktions generator; automatically generates timeout functions.
REM  *  \pre defined var "FUNKTIONSRUMF_OUT" var  
REM  *  \param  1: Funktionsrumf (z.b. aus Linker error file)
REM  *  \param  2: KommentarInformationen (z.B. Msg name)
REM  *  \param  3: RteCallspezifike (z.B. Msg name, oder DDMAN Signame)
REM  *  \output 1x Textfile FUNKTIONSRUMF_OUT including function implementions for timeout reaction
REM /*********************************************************************************************************************/
:FUNKTIONSRUMF
SET "varFunktionsrumf=%~1"  
SET "varKommentar=%~2"  
SET "varRteCall=%~3"  

ECHO void %varFunktionsrumf% (){ >>%FUNKTIONSRUMF_OUT%
ECHO.%varFunktionsrumf%|FINDSTR /L COMCbk >NUL
if ERRORLEVEL 1 (
	REM ECHO COMCbk=NO >>%FUNKTIONSRUMF_OUT%
	ECHO.%varFunktionsrumf%|FINDSTR /L COMCoutTX >NUL
	if ERRORLEVEL 1 (
		ECHO 1
		ECHO uint8 crcbyte[%varKommentar%]; >>%FUNKTIONSRUMF_OUT%
		ECHO 2
		ECHO copycrcdata(crcbyte, sduptr, %varKommentar%); >>%FUNKTIONSRUMF_OUT%
		ECHO 3
		REM ECHO RteWrite_R_nw_ssw_docu61_p%varRteCall%_%varRteCall%(crcbyte); >>%FUNKTIONSRUMF_OUT%
		ECHO 4
		REM ECHO return 1; >>%FUNKTIONSRUMF_OUT%
		ECHO 5
	) else (
		ECHO //Appl_COMCoutTX_Pdu_STW_ANGL_STAT__CHASSIS >>%FUNKTIONSRUMF_OUT%)
	
) else (
	REM ECHO COMCbk=YES >>%FUNKTIONSRUMF_OUT%
	ECHO.%varFunktionsrumf%|FINDSTR /L TOut >NUL
	if ERRORLEVEL 1 (SET "result=0") else (SET "result=1")  
	ECHO    RteWrite_R_nw_ssw_docu61_p%varRteCall%_%varRteCall%(%result%; >>%FUNKTIONSRUMF_OUT%
)
ECHO }>>%FUNKTIONSRUMF_OUT%
GOTO eof
REM /*********************************************************************************************************************/
REM  MsgTimeOut funktions generator; automatically generates timeout functions.
REM  *  \pre defined var "DEFINES_OUT" var  
REM  *  \param  1: RteCallspezifike (z.B. Msg name, oder DDMAN Signame)
REM  *  \output x1 Textfile DEFINES_OUT which holdes the definitions of the dummy rte calls
REM /*********************************************************************************************************************/
:DEFINES
SET "varRteCall=%~1"  
ECHO #define RteWrite_R_nw_ssw_docu61_p%varRteCall%_%varRteCall%(value); >>%DEFINES_OUT%
GOTO eof

REM /*********************************************************************************************************************/
REM  MsgTimeOut funktions generator; automatically generates timeout functions.
REM  *  \pre defined var "DEFINES_OUT" var  
REM  *  \param  1: KommentarInformationen (z.B. Msg name, oder DDMAN Signame)
REM  *  \param  2: RteCallspezifike (z.B. Msg name, oder DDMAN Signame)
REM  *  \output x1 Textfile DEFINES_OUT which holdes the definitions of the dummy rte calls
REM /*********************************************************************************************************************/
:INITIALISATION
SET "varKommentar=%~1"  
SET "varRteCall=%~2"  
ECHO /* %varKommentar% */>>%INIT_OUT%
ECHO RteWrite_R_nw_ssw_docu61_p%varRteCall%_%varRteCall%(1); >>%INIT_OUT%
GOTO eof



:eof

Wie Ihr sicher gesehen habt geht es um den Abschnitt
 :FUNKTIONSRUMF 
. Hier habe ich bereits mit eingefügten ECHOS versucht zu "debuggen" mit dem Ergebnis, dass nach dem 2. in die Datei umgeleiteten ECHO geht's schief.

EDIT: Ich habe noch eine 2. Sache. Ich kann innerhalb des ERRORLEVEL-Befehls keine ECHO ausgabe mit ")" erzeugen. (siehe folgenden Abschnitt). Die geschlossene Klammer scheint ignoriert zu werden. Ich habe Sie daher erst mal aus dem Skript gelöscht. Interessieren würde ich mich aber shcon warum dem so ist?

if ERRORLEVEL 1 (
ECHO 1
ECHO uint8 crcbyte[%varKommentar%];

Ich hoffe auf eure Hilfe ;)

MfG
TEKnopapST

Content-Key: 169330

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

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

Member: bastla
bastla Jul 07, 2011 at 14:02:26 (UTC)
Goto Top
Hallo TEKnopapST!

Zur Zusatzfrage: Versuch es damit, die Klammer mit einem vorangestellten Caret ^ zu "escapen" ...

Grüße
bastla
Member: TEKnopapST
TEKnopapST Jul 07, 2011 at 14:41:42 (UTC)
Goto Top
Moin bastla,

super, vielen Dank das "escapen" hat funktioniert.

Danke & Gruß
TEKnopapST
Member: bastla
bastla Jul 07, 2011 at 16:15:29 (UTC)
Goto Top
Hallo TEKnopapST!

Grob überarbeitet würde ich das etwa so versuchen (das Testen, und dabei hat sich "echo on" bewährt, überlasse ich Dir face-smile):
@Echo off & setlocal
REM /*********************************************************************************************************************/
REM /*! \brief  MsgLostStateMode.bat erzeugt aus dem Input-Textfile 3 Ausgabedateien in denen die 
REM  *          MsgLostStateMode-Funktionsrüpfe, die entsprechenden DUMMY-Defines sowie die Initialisierrungsaufrufe
REM  *          enthalten sind.
REM  *                          
REM  *  \pre defined var "FUNKTIONSRUMF_OUT" var  
REM  *  \param  Input-Textfile nach dem Schema (MsgLostFunktion1	Botschaft 	MsgLost)
REM  *  \output 3 Textfiles (funktionsrümfe, Dummy-defines, initaufrufe)
REM **********************************************************************************************************************/
SET FUNKTIONSRUMF_OUT=MsgLost_Funktions.txt
SET DEFINES_OUT=MsgLost_Defines.txt
SET INIT_OUT=MsgLost_Init.txt

REM Löschen der ausgabe Dateien (falls bereists vorhanden)
IF EXIST %FUNKTIONSRUMF_OUT% DEL %FUNKTIONSRUMF_OUT%
IF EXIST %DEFINES_OUT% DEL %DEFINES_OUT%
IF EXIST %INIT_OUT% DEL %INIT_OUT%



FOR /f "tokens=1-3*" %%f IN (Input.txt) DO call :FUNKTIONSRUMF "%%f" "%%g" "%%h" & call :DEFINES "%%h" & CALL :INITIALISATION "%%g" "%%h"  
GOTO :eof

REM /*********************************************************************************************************************/
REM  MsgTimeOut funktions generator; automatically generates timeout functions.
REM  *  \pre defined var "FUNKTIONSRUMF_OUT" var  
REM  *  \param  1: Funktionsrumf (z.b. aus Linker error file)
REM  *  \param  2: KommentarInformationen (z.B. Msg name)
REM  *  \param  3: RteCallspezifike (z.B. Msg name, oder DDMAN Signame)
REM  *  \output 1x Textfile FUNKTIONSRUMF_OUT including function implementions for timeout reaction
REM /*********************************************************************************************************************/
:FUNKTIONSRUMF
SET "varFunktionsrumf=%~1"  
SET "varKommentar=%~2"  
SET "varRteCall=%~3"  
>>%FUNKTIONSRUMF_OUT% ECHO void %varFunktionsrumf% (){ 

ECHO.%varFunktionsrumf%|FINDSTR "COMCbk" >NUL && goto :COMCbk  
REM ECHO COMCbk=NO
ECHO.%varFunktionsrumf%|FINDSTR "COMCoutTX" >NUL && (  
    >>%FUNKTIONSRUMF_OUT% ECHO //Appl_COMCoutTX_Pdu_STW_ANGL_STAT__CHASSIS
) || (
    ECHO 1
    >>%FUNKTIONSRUMF_OUT% ECHO uint8 crcbyte[%varKommentar%];
    ECHO 2
    >>%FUNKTIONSRUMF_OUT% ECHO copycrcdata^(crcbyte, sduptr, %varKommentar%^);
    ECHO 3
    REM >>%FUNKTIONSRUMF_OUT% ECHO RteWrite_R_nw_ssw_docu61_p%varRteCall%_%varRteCall%^(crcbyte^);
    ECHO 4
    REM >>%FUNKTIONSRUMF_OUT% ECHO return 1;
    ECHO 5
)
goto :FUNKTIONSRUMF_END

:COMCbk
REM >>%FUNKTIONSRUMF_OUT% ECHO COMCbk=YES
ECHO.%varFunktionsrumf%|FINDSTR /L TOut >NUL && SET "result=0" || SET "result=1"  
>>%FUNKTIONSRUMF_OUT% ECHO    RteWrite_R_nw_ssw_docu61_p%varRteCall%_%varRteCall%^(%result%^);

:FUNKTIONSRUMF_END
>>%FUNKTIONSRUMF_OUT% ECHO }
GOTO :eof

REM /*********************************************************************************************************************/
REM  MsgTimeOut funktions generator; automatically generates timeout functions.
REM  *  \pre defined var "DEFINES_OUT" var  
REM  *  \param  1: RteCallspezifike (z.B. Msg name, oder DDMAN Signame)
REM  *  \output x1 Textfile DEFINES_OUT which holdes the definitions of the dummy rte calls
REM /*********************************************************************************************************************/
:DEFINES
SET "varRteCall=%~1"  
>>%DEFINES_OUT% ECHO #define RteWrite_R_nw_ssw_docu61_p%varRteCall%_%varRteCall%(value);
GOTO :eof

REM /*********************************************************************************************************************/
REM  MsgTimeOut funktions generator; automatically generates timeout functions.
REM  *  \pre defined var "DEFINES_OUT" var  
REM  *  \param  1: KommentarInformationen (z.B. Msg name, oder DDMAN Signame)
REM  *  \param  2: RteCallspezifike (z.B. Msg name, oder DDMAN Signame)
REM  *  \output x1 Textfile DEFINES_OUT which holdes the definitions of the dummy rte calls
REM /*********************************************************************************************************************/
:INITIALISATION
SET "varKommentar=%~1"  
SET "varRteCall=%~2"  
>>%INIT_OUT% ECHO /* %varKommentar% */
>>%INIT_OUT% ECHO RteWrite_R_nw_ssw_docu61_p%varRteCall%_%varRteCall%(1);
GOTO :eof
Anmerkungen:
Grüße
bastla

[Edit] Zweige für "COMCoutTX" waren vertauscht - sollte jetzt passen [/Edit]
Member: TEKnopapST
TEKnopapST Jul 07, 2011 at 20:27:18 (UTC)
Goto Top
Moinsen bastla,

erst Mal vielen Dank für die schnelle & Ausführliche Antwort.
Ich schätze das ich das ganze morgen oder. Samstag mal ausprobieren kann.
Ich melde mich sobald ich es getestet habe.

Danke & Gruß
TEKnopapST