Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

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

Frage Entwicklung Batch & Shell

Mitglied: TEKnopapST

TEKnopapST (Level 1) - Jetzt verbinden

07.07.2011, aktualisiert 14:59 Uhr, 2598 Aufrufe, 4 Kommentare

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:
01.
@Echo off 
02.
REM /*********************************************************************************************************************/ 
03.
REM /*! \brief  MsgLostStateMode.bat erzeugt aus dem Input-Textfile 3 Ausgabedateien in denen die  
04.
REM  *          MsgLostStateMode-Funktionsrümfe, die entsprechenden DUMMY-Defines sowie, die Initialisierrungsaufrufe 
05.
REM  *          enthalten sind. 
06.
REM  *                           
07.
REM  *  \pre defined var "FUNKTIONSRUMF_OUT" var 
08.
REM  *  \param  Input-Textfile nach dem Schema (MsgLostFunktion1	Botschaft 	MsgLost) 
09.
REM  *  \output 3 Textfiles (funktionsrümfe, Dummy-defines, initaufrufe) 
10.
REM **********************************************************************************************************************/ 
11.
SET FUNKTIONSRUMF_OUT=MsgLost_Funktions.txt 
12.
SET DEFINES_OUT=MsgLost_Defines.txt 
13.
SET INIT_OUT=MsgLost_Init.txt 
14.
 
15.
REM Löschen der ausgabe Dateien (falls bereists vorhanden) 
16.
IF EXIST %FUNKTIONSRUMF_OUT% DEL %FUNKTIONSRUMF_OUT% 
17.
IF EXIST %DEFINES_OUT% DEL %DEFINES_OUT% 
18.
IF EXIST %INIT_OUT% DEL %INIT_OUT% 
19.
 
20.
 
21.
 
22.
FOR /f "tokens=1-3*" %%f IN (Input.txt) DO call :FUNKTIONSRUMF "%%f" "%%g" "%%h" & call :DEFINES "%%h" & CALL :INITIALISATION "%%g" "%%h" 
23.
GOTO eof 
24.
 
25.
REM /*********************************************************************************************************************/ 
26.
REM  MsgTimeOut funktions generator; automatically generates timeout functions. 
27.
REM  *  \pre defined var "FUNKTIONSRUMF_OUT" var 
28.
REM  *  \param  1: Funktionsrumf (z.b. aus Linker error file) 
29.
REM  *  \param  2: KommentarInformationen (z.B. Msg name) 
30.
REM  *  \param  3: RteCallspezifike (z.B. Msg name, oder DDMAN Signame) 
31.
REM  *  \output 1x Textfile FUNKTIONSRUMF_OUT including function implementions for timeout reaction 
32.
REM /*********************************************************************************************************************/ 
33.
:FUNKTIONSRUMF 
34.
SET "varFunktionsrumf=%~1" 
35.
SET "varKommentar=%~2" 
36.
SET "varRteCall=%~3" 
37.
 
38.
ECHO void %varFunktionsrumf% (){ >>%FUNKTIONSRUMF_OUT% 
39.
ECHO.%varFunktionsrumf%|FINDSTR /L COMCbk >NUL 
40.
if ERRORLEVEL 1 ( 
41.
	REM ECHO COMCbk=NO >>%FUNKTIONSRUMF_OUT% 
42.
	ECHO.%varFunktionsrumf%|FINDSTR /L COMCoutTX >NUL 
43.
	if ERRORLEVEL 1 ( 
44.
		ECHO 1 
45.
		ECHO uint8 crcbyte[%varKommentar%]; >>%FUNKTIONSRUMF_OUT% 
46.
		ECHO 2 
47.
		ECHO copycrcdata(crcbyte, sduptr, %varKommentar%); >>%FUNKTIONSRUMF_OUT% 
48.
		ECHO 3 
49.
		REM ECHO RteWrite_R_nw_ssw_docu61_p%varRteCall%_%varRteCall%(crcbyte); >>%FUNKTIONSRUMF_OUT% 
50.
		ECHO 4 
51.
		REM ECHO return 1; >>%FUNKTIONSRUMF_OUT% 
52.
		ECHO 5 
53.
	) else ( 
54.
		ECHO //Appl_COMCoutTX_Pdu_STW_ANGL_STAT__CHASSIS >>%FUNKTIONSRUMF_OUT%) 
55.
	 
56.
) else ( 
57.
	REM ECHO COMCbk=YES >>%FUNKTIONSRUMF_OUT% 
58.
	ECHO.%varFunktionsrumf%|FINDSTR /L TOut >NUL 
59.
	if ERRORLEVEL 1 (SET "result=0") else (SET "result=1") 
60.
	ECHO    RteWrite_R_nw_ssw_docu61_p%varRteCall%_%varRteCall%(%result%; >>%FUNKTIONSRUMF_OUT% 
61.
62.
ECHO }>>%FUNKTIONSRUMF_OUT% 
63.
GOTO eof 
64.
REM /*********************************************************************************************************************/ 
65.
REM  MsgTimeOut funktions generator; automatically generates timeout functions. 
66.
REM  *  \pre defined var "DEFINES_OUT" var 
67.
REM  *  \param  1: RteCallspezifike (z.B. Msg name, oder DDMAN Signame) 
68.
REM  *  \output x1 Textfile DEFINES_OUT which holdes the definitions of the dummy rte calls 
69.
REM /*********************************************************************************************************************/ 
70.
:DEFINES 
71.
SET "varRteCall=%~1" 
72.
ECHO #define RteWrite_R_nw_ssw_docu61_p%varRteCall%_%varRteCall%(value); >>%DEFINES_OUT% 
73.
GOTO eof 
74.
 
75.
REM /*********************************************************************************************************************/ 
76.
REM  MsgTimeOut funktions generator; automatically generates timeout functions. 
77.
REM  *  \pre defined var "DEFINES_OUT" var 
78.
REM  *  \param  1: KommentarInformationen (z.B. Msg name, oder DDMAN Signame) 
79.
REM  *  \param  2: RteCallspezifike (z.B. Msg name, oder DDMAN Signame) 
80.
REM  *  \output x1 Textfile DEFINES_OUT which holdes the definitions of the dummy rte calls 
81.
REM /*********************************************************************************************************************/ 
82.
:INITIALISATION 
83.
SET "varKommentar=%~1" 
84.
SET "varRteCall=%~2" 
85.
ECHO /* %varKommentar% */>>%INIT_OUT% 
86.
ECHO RteWrite_R_nw_ssw_docu61_p%varRteCall%_%varRteCall%(1); >>%INIT_OUT% 
87.
GOTO eof 
88.
 
89.
 
90.
 
91.
:eof
Wie Ihr sicher gesehen habt geht es um den Abschnitt
01.
 :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?
<code>
if ERRORLEVEL 1 (
ECHO 1
ECHO uint8 crcbyte[%varKommentar%];
<code>
Ich hoffe auf eure Hilfe ;)

MfG
TEKnopapST
Mitglied: bastla
07.07.2011 um 16:02 Uhr
Hallo TEKnopapST!

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

Grüße
bastla
Bitte warten ..
Mitglied: TEKnopapST
07.07.2011 um 16:41 Uhr
Moin bastla,

super, vielen Dank das "escapen" hat funktioniert.

Danke & Gruß
TEKnopapST
Bitte warten ..
Mitglied: bastla
07.07.2011 um 18:15 Uhr
Hallo TEKnopapST!

Grob überarbeitet würde ich das etwa so versuchen (das Testen, und dabei hat sich "echo on" bewährt, überlasse ich Dir ):
01.
@Echo off & setlocal 
02.
REM /*********************************************************************************************************************/ 
03.
REM /*! \brief  MsgLostStateMode.bat erzeugt aus dem Input-Textfile 3 Ausgabedateien in denen die  
04.
REM  *          MsgLostStateMode-Funktionsrüpfe, die entsprechenden DUMMY-Defines sowie die Initialisierrungsaufrufe 
05.
REM  *          enthalten sind. 
06.
REM  *                           
07.
REM  *  \pre defined var "FUNKTIONSRUMF_OUT" var 
08.
REM  *  \param  Input-Textfile nach dem Schema (MsgLostFunktion1	Botschaft 	MsgLost) 
09.
REM  *  \output 3 Textfiles (funktionsrümfe, Dummy-defines, initaufrufe) 
10.
REM **********************************************************************************************************************/ 
11.
SET FUNKTIONSRUMF_OUT=MsgLost_Funktions.txt 
12.
SET DEFINES_OUT=MsgLost_Defines.txt 
13.
SET INIT_OUT=MsgLost_Init.txt 
14.
 
15.
REM Löschen der ausgabe Dateien (falls bereists vorhanden) 
16.
IF EXIST %FUNKTIONSRUMF_OUT% DEL %FUNKTIONSRUMF_OUT% 
17.
IF EXIST %DEFINES_OUT% DEL %DEFINES_OUT% 
18.
IF EXIST %INIT_OUT% DEL %INIT_OUT% 
19.
 
20.
 
21.
 
22.
FOR /f "tokens=1-3*" %%f IN (Input.txt) DO call :FUNKTIONSRUMF "%%f" "%%g" "%%h" & call :DEFINES "%%h" & CALL :INITIALISATION "%%g" "%%h" 
23.
GOTO :eof 
24.
 
25.
REM /*********************************************************************************************************************/ 
26.
REM  MsgTimeOut funktions generator; automatically generates timeout functions. 
27.
REM  *  \pre defined var "FUNKTIONSRUMF_OUT" var 
28.
REM  *  \param  1: Funktionsrumf (z.b. aus Linker error file) 
29.
REM  *  \param  2: KommentarInformationen (z.B. Msg name) 
30.
REM  *  \param  3: RteCallspezifike (z.B. Msg name, oder DDMAN Signame) 
31.
REM  *  \output 1x Textfile FUNKTIONSRUMF_OUT including function implementions for timeout reaction 
32.
REM /*********************************************************************************************************************/ 
33.
:FUNKTIONSRUMF 
34.
SET "varFunktionsrumf=%~1" 
35.
SET "varKommentar=%~2" 
36.
SET "varRteCall=%~3" 
37.
>>%FUNKTIONSRUMF_OUT% ECHO void %varFunktionsrumf% (){  
38.
 
39.
ECHO.%varFunktionsrumf%|FINDSTR "COMCbk" >NUL && goto :COMCbk 
40.
REM ECHO COMCbk=NO 
41.
ECHO.%varFunktionsrumf%|FINDSTR "COMCoutTX" >NUL && ( 
42.
    >>%FUNKTIONSRUMF_OUT% ECHO //Appl_COMCoutTX_Pdu_STW_ANGL_STAT__CHASSIS 
43.
) || ( 
44.
    ECHO 1 
45.
    >>%FUNKTIONSRUMF_OUT% ECHO uint8 crcbyte[%varKommentar%]; 
46.
    ECHO 2 
47.
    >>%FUNKTIONSRUMF_OUT% ECHO copycrcdata^(crcbyte, sduptr, %varKommentar%^); 
48.
    ECHO 3 
49.
    REM >>%FUNKTIONSRUMF_OUT% ECHO RteWrite_R_nw_ssw_docu61_p%varRteCall%_%varRteCall%^(crcbyte^); 
50.
    ECHO 4 
51.
    REM >>%FUNKTIONSRUMF_OUT% ECHO return 1; 
52.
    ECHO 5 
53.
54.
goto :FUNKTIONSRUMF_END 
55.
 
56.
:COMCbk 
57.
REM >>%FUNKTIONSRUMF_OUT% ECHO COMCbk=YES 
58.
ECHO.%varFunktionsrumf%|FINDSTR /L TOut >NUL && SET "result=0" || SET "result=1" 
59.
>>%FUNKTIONSRUMF_OUT% ECHO    RteWrite_R_nw_ssw_docu61_p%varRteCall%_%varRteCall%^(%result%^); 
60.
 
61.
:FUNKTIONSRUMF_END 
62.
>>%FUNKTIONSRUMF_OUT% ECHO } 
63.
GOTO :eof 
64.
 
65.
REM /*********************************************************************************************************************/ 
66.
REM  MsgTimeOut funktions generator; automatically generates timeout functions. 
67.
REM  *  \pre defined var "DEFINES_OUT" var 
68.
REM  *  \param  1: RteCallspezifike (z.B. Msg name, oder DDMAN Signame) 
69.
REM  *  \output x1 Textfile DEFINES_OUT which holdes the definitions of the dummy rte calls 
70.
REM /*********************************************************************************************************************/ 
71.
:DEFINES 
72.
SET "varRteCall=%~1" 
73.
>>%DEFINES_OUT% ECHO #define RteWrite_R_nw_ssw_docu61_p%varRteCall%_%varRteCall%(value); 
74.
GOTO :eof 
75.
 
76.
REM /*********************************************************************************************************************/ 
77.
REM  MsgTimeOut funktions generator; automatically generates timeout functions. 
78.
REM  *  \pre defined var "DEFINES_OUT" var 
79.
REM  *  \param  1: KommentarInformationen (z.B. Msg name, oder DDMAN Signame) 
80.
REM  *  \param  2: RteCallspezifike (z.B. Msg name, oder DDMAN Signame) 
81.
REM  *  \output x1 Textfile DEFINES_OUT which holdes the definitions of the dummy rte calls 
82.
REM /*********************************************************************************************************************/ 
83.
:INITIALISATION 
84.
SET "varKommentar=%~1" 
85.
SET "varRteCall=%~2" 
86.
>>%INIT_OUT% ECHO /* %varKommentar% */ 
87.
>>%INIT_OUT% ECHO RteWrite_R_nw_ssw_docu61_p%varRteCall%_%varRteCall%(1); 
88.
GOTO :eof
Anmerkungen:
  • ":eof" ist eine imaginäre Sprungmarke (und muss daher nicht im Code enthalten sein) und bedeutet "Programmende" im Hauptprogramm bzw "Rücksprung" im Unterprogramm.
  • Anstelle der ERRORLEVEL-Abfrage (mit der Du ja in diesem Batch nur zwischen 0 und nicht 0 unterscheidest) kann "&&" (für Errorlevel 0) und "||" (für Errorlevel nicht 0) - aber nur in dieser Reihenfolge - verwendet werden.
  • Innerhalb eines Blocks (zB einer Schleife oder eines "geklammerten" Teiles) erstellte / veränderte Variablen werden erst nach dem Block ausgewertet - um dieses Verhalten zu ändern, wäre "delayedExpansion" erforderlich - ich fand es daher sinnvoller, mit "goto :COMCbk" einen solchen Block zu vermeiden, da ansonsten %result% immer den Wert des vorigen Schleifendurchlaufes gehabt hätte (oder eben eine "verzögerte Variablenauflösung" hätte erfolgen müssen).
  • Eine (Ausgabe-)Umleitung (zB ">>%FUNKTIONSRUMF_OUT%") kann auch vor dem "ECHO"-Befehl stehen - damit sind ua "trailing blanks" leichter zu vermeiden ...

Grüße
bastla

[Edit] Zweige für "COMCoutTX" waren vertauscht - sollte jetzt passen [/Edit]
Bitte warten ..
Mitglied: TEKnopapST
07.07.2011 um 22:27 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
"Generic" Drucker mit batch - File erstellen (6)

Frage von MrPreesident zum Thema Batch & Shell ...

Batch & Shell
gelöst Kl. Frage: Log-File schreiben per Batch (3)

Frage von Yauhun zum Thema Batch & Shell ...

Batch & Shell
gelöst Splitten in Batch. Wo liegt der Fehler!? (4)

Frage von Todybear zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...