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 ?

Frage Entwicklung Batch & Shell

Mitglied: TEKnopapST

TEKnopapST (Level 1) - Jetzt verbinden

07.07.2011, aktualisiert 14:59 Uhr, 2651 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
Viren und Trojaner

Deaktivierter Keylogger in HP Notebooks entdeckt

Information von bitcoin vor 17 StundenViren und Trojaner1 Kommentar

Ein Grund mehr warum man Vorinstallationen der Hersteller immer blank bügeln sollte Der deaktivierte Keylogger findet sich im vorinstallierten ...

Router & Routing

Lets Encrypt kommt auf die FritzBox

Information von bitcoin vor 21 StundenRouter & Routing

In der neuesten Labor-Version der FB7490 integriert AVM unter anderem einen Let's Encrypt Client für Zugriffe auf das Webinterface ...

Internet

Was nützt HTTPS, wenn es auch von Phishing Web-Seiten genutzt wird

Information von Penny.Cilin vor 3 TagenInternet17 Kommentare

HTTPS richtig einschätzen Ob man eine Webseite via HTTPS aufruft, zeigt ein Schloss neben der Adresse im Webbrowser an. ...

Webbrowser

Bugfix für Firefox Quantum released - Installation erfolgt teilweise nicht automatisch!

Erfahrungsbericht von Volchy vor 4 TagenWebbrowser8 Kommentare

Hallo zusammen, gem. dem Artike von heise online wurde mit VersionFirefox 57.0.1 sicherheitsrelevante Bugs behoben. Entgegen der aktuellen Veröffentlichung ...

Heiß diskutierte Inhalte
Batch & Shell
Trusted Sites für alle User auf dem PC einpflegen
Frage von xXTaKuZaXxBatch & Shell12 Kommentare

Aufgabestellung: Es sollen auf 1 PC (bzw. mehreren PCs) vertrauenswürdige Sites per Powershell eingetragen werden, die für alle User ...

Voice over IP
Telefonstörung - Ortsrufnummern kein Verbindungsaufbau
Frage von Windows10GegnerVoice over IP10 Kommentare

Hallo, sowohl bei uns als auch beim Opa ist es über VoIP nicht möglich Ortsrufnummern anzurufen. Es kommt nach ...

Vmware
DOS 6.22 in VMWare mit CD-ROM
gelöst Frage von hesperVmware10 Kommentare

Hallo zusammen! Ich hab ein saublödes Problem. Es ist eine VMWare mit DOS 6.22 zu erstellen auf dem ein ...

Cloud-Dienste
PIM als SaaS Nutzungsgebühr
Frage von vanTastCloud-Dienste8 Kommentare

Moin, wir haben uns ein PIM (Product Information Management) nach unseren Ansprüchen für viel Geld als SaaS-Lösung bauen lassen. ...