(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:
Wie Ihr sicher gesehen habt geht es um den Abschnitt. 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
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 169330
Url: https://administrator.de/forum/batch-file-fehler-durch-konkurrierenden-dateizugriff-aber-wie-so-169330.html
Ausgedruckt am: 12.01.2025 um 13:01 Uhr
4 Kommentare
Neuester Kommentar
Hallo TEKnopapST!
Grob überarbeitet würde ich das etwa so versuchen (das Testen, und dabei hat sich "
Anmerkungen:
Grüße
bastla
[Edit] Zweige für "COMCoutTX" waren vertauscht - sollte jetzt passen [/Edit]
Grob überarbeitet würde ich das etwa so versuchen (das Testen, und dabei hat sich "
echo on
" bewährt, überlasse ich Dir ):@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
bastla
[Edit] Zweige für "COMCoutTX" waren vertauscht - sollte jetzt passen [/Edit]