Top-Themen

Aktuelle Themen (A bis Z)

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 ?

Mitglied: TEKnopapST

TEKnopapST (Level 1) - Jetzt verbinden

07.07.2011, aktualisiert 14:59 Uhr, 2663 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 ..
Ähnliche Inhalte
Batch & Shell

Syntaktischer Fehler im Batch File das die Farben von CMD ändern soll

gelöst Frage von MaxappemannBatch & Shell2 Kommentare

Hallo liebe Community wir haben hier ein kleines Problem. Wir versuchen mit einem Batch File statt color 0A schreiben ...

Batch & Shell

Batch Archivierung und löschen von Files

Frage von PeronasBatch & Shell1 Kommentar

Hallo zusammen, ich habe mal eine Frage zu einem Batch-File welches ich zum archivieren von Files benötige. Und zwar ...

Batch & Shell

Batch File zum Auslesen einer Datei

gelöst Frage von Marcel1989Batch & Shell9 Kommentare

Hallo, Ich scheibe momentan ein Anmeldescript als batch mit dem Aufruf von VBS dateien. Hierfür haben wir bereits gruppen ...

Batch & Shell

Authentifizierung in einem Batch File

gelöst Frage von fiffi1Batch & Shell7 Kommentare

Hallo miteinander, Ich möchte ein script schreiben, das mir alle Netzlaufwerke automatisch einbindet. Ich setzte mich also daran und ...

Neue Wissensbeiträge
Windows 10

USB Maus und Tastatur versagen Dienst unter Windows 10

Erfahrungsbericht von hardykopff vor 15 StundenWindows 103 Kommentare

Da steht man ziemlich dumm da, wenn der PC sich wegen fehlender USB Tastatur und Maus nicht bedienen lässt. ...

Administrator.de Feedback
Update der Seite: Alles zentriert
Information von Frank vor 18 StundenAdministrator.de Feedback14 Kommentare

Hallo User, die größte Änderung von Release 5.8 ist das Zentrieren der Webseite (auf großen Bildschirmen) und ein "Welcome"-Teaser ...

Humor (lol)

WhatsApp-Nachrichten endlich auch per Bluetooth versendbar

Information von BassFishFox vor 1 TagHumor (lol)4 Kommentare

Genau darauf habe ich gewartet! ;-) Der beliebte Messaging-Dienst WhatsApp erhält eine praktische neue Funktion: Ab dem nächsten Update ...

Google Android

Googles "Android Enterprise Recommended" für Unternehmen

Information von kgborn vor 2 TagenGoogle Android3 Kommentare

Hier eine Information, die für Administratoren und Verantwortliche in Unternehmen, die für die Beschaffung und das Rollout von Android-Geräten ...

Heiß diskutierte Inhalte
Server-Hardware
Welche Rolle spielt Design bei Enterprise IT Hardware?
Frage von ApolloXServer-Hardware17 Kommentare

Ich arbeite für einen internationalen Elektronikhersteller in der Forschung und meine Aufgabe ist es, Feedback von Nutzern in Hinsicht ...

Windows Netzwerk
WSUS4 und Windows 10 Updates automatisch installieren
Frage von sammy65Windows Netzwerk15 Kommentare

Hallo miteinander, ich habe mit einen neuen WSUS Server aufgesetzt Server 2016 darauf einen aktuellen WSUS. Grund, wir stellen ...

Speicherkarten
Vergessliche USB-Sticks?
Frage von hanheikSpeicherkarten14 Kommentare

Ich habe in den letzten Tagen 500 USB-Sticks mit Bilddateien bespielt. Obwohl ich die Dateien mit größter Sorgfalt kopiert ...

Hyper-V
Hyper-V mit altem XEON-Server. Was ist falsch?
Frage von LollipopHyper-V11 Kommentare

Hallo Bin etwas frustriert. Kleinbetrieb, ca. 15 PC's, 2 Stk. Server mit einigen virtuellen PC's für Fernwartung, VaultServer für ...