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

Laufzeit testen, vergleichen von Laufzeiten verschiedener Skripte mit der Batch RunTimeCalc. Beispielanwendung - Schreibrechte des aktuellen Benutzers testen

Anleitung Entwicklung Batch & Shell

Mitglied: Viewfinder

Viewfinder (Level 1) - Jetzt verbinden

24.07.2012, aktualisiert 01.12.2012, 6359 Aufrufe, 1 Danke

Dieser Artikel steht im direktem Zusammenhang zu dem Snippet von bastla im Artikel: "Laufzeit bzw. Dauer einer Batch ermitteln!". Das Skript enstand als Übung zur allgemeinen Einarbeitung in Programiersprachen. Dem nach ist es die Arbeit eines blutigen Anfängers (Programierung) mit der gegebenen Pflicht zur Sorgfalt.

Noch kurz zu mir. Ich stehe bis her nicht nur entfernt zur Fachtermina, sondern auch zu Deutschland. Was meint, das Antworten durchaus etwas mehr Zeit benötigen.

Hallo wertes Forum,
es stand nicht in meiner Absicht einen eigenen Blog zu eröffnen. Wer mehr wissen möchte springt am besten zum oben angegebenen Link und ist schnell im Thema. Ursprünglich wollte ich nicht die vielen Codezeilen in die Menge schmeißen, sondern ein vereinfachtes Ablaufschema und ein paar Zeilen als Antwort posten. Da ich leider keine Möglichkeit gefunden habe, ein Bild in eine Antwort einzubinden, gibt es jetzt alles in einem Rutsch als eigenen Beitrag. Denn ohne eine grafische Darstellung, wird die Einarbeitung in den Code vermutlich etwas anstrengend.


Ursprung

Das Thema liegt schon eine Weile auf Eis, doch ich brauchte einen Einstieg in die Thematik Programiersprache. Bei den deutsch sprachigen Recherchen landet man immer wieder bei Administrator.de. Ob die Batchprogramierung hier der richtige Ansatz ist bleibt fraglich. Auf jeden Fall habe ich einen Einblick bekommen und kann mich ausgereifteren Sprachen zuwenden.

Nur was mache ich jetzt mit dem enstandenen Programm (chen)?
Entsprechend meiner generellen Auffassung gibt man zurück, was man bekommen hat. Als Neuling schreibt man andererseits auch keinen Blog. Doch die Technik läßt keinen anderen Weg und so mache ich diese Erfahrung noch neben bei.

History

Bastlas Antwort auf eine Userfrage war ein kompletter Berechnungsmodus den man unter http://www.administrator.de/contentid/79909 einsehen kann. Das Skript, für welches die Laufzeit berechnet werden soll (in Folge Laufzeitskript genannt), muss zwischen die Codezeilen gelegt werden.
Das Laufzeitskript läuft als Subroutine der Laufzeitberechnung.
Da bastla lediglich eine schnelle Antwort geliefert hat, lag das Laufzeitskript an der logischen Position im Code. Also mitten drinn. Nichts für DAU and me.
Die Lage des Laufzeitskriptes ist riskant und nicht ergonomisch.
Damit war schon mal die Aufgabe gefunden.

Entwicklung

Gerade als Anfänger tut man sich mit den vielen Begriffen schwer. Bastlas Code brauchte einen Namen RunTimeCalc. Die Ideen häuften sich und so wurde daraus schnell ein Konzept zu einem Tool. Was soll dieses Tool können?
  • Vergleichszeiten verschiedener Skripte aus der Laufzeit ausgeben (erledigt)
  • Zeitmessung und Zeitberechnung als Subroutine ausführen (erledigt)
  • Einfache Bedienung mit Fehlerhandling stellen (erledigt)
  • Bedienungsfehler ausgeben (erledigt)
  • Logsystem integrieren (erledigt)

Aktualisierung

27.11.2012 Hilfe und Protokollierung verbessert, Pause aus „:EXIT“ entfernt (sorry)

Ablaufschema.

b1ace16fb2cf5ac9030e46f20a4c878c - Klicke auf das Bild, um es zu vergrößern

Tool RunTimeCalc (Code)

01.
:Environment 
02.
@echo off 
03.
pushd %~dp0 
04.
setlocal 
05.
 
06.
 
07.
:VarTranslate 
08.
:: Startvariablen 
09.
set "ProcessID=%2" 
10.
set "StartParameter=%1" 
11.
:: Handling ProcessID 
12.
:: ... bei fehlendem Startparameter 
13.
if "%StartParameter:~0,1%" EQU "@" ( 
14.
	set "ProcessID=%StartParameter%" 
15.
	set "StartParameter=" 
16.
17.
	:: ... Formatierung 
18.
if "%ProcessID:~0,1%" EQU "@" ( 
19.
	set "ProcessID=%ProcessID:~1%" 
20.
	) else (set "ProcessID=") 
21.
 
22.
:InputControl 
23.
FOR %%i in ([] [-C] [-E] [-H] [-S]) do IF [%StartParameter%] EQU %%i goto :Settings 
24.
echo. 
25.
echo   RuntimeCalc 
26.
echo. 
27.
echo   --------mistake: [%1]-------------------------------------------------- 
28.
echo   Startzeit [-S]  Endzeit, Berechnung[-E]  Hilfe [-H]  interne Berechnung [] 
29.
echo        Kontrolle [-C]                  ProcessID [@Text_ohne_Leerzeichen] 
30.
echo. 
31.
echo. 
32.
echo "%ProgName%" wurde wegen falschem Parameter beendet. 
33.
echo. 
34.
echo. 
35.
goto :Exit 
36.
 
37.
:Settings 
38.
set "ProgName=RunTimeCalc" 
39.
set "RTC_FilePath=%~dp0" 
40.
set "RTC_InfStamp=%date%;%time%;[INFO];[%ProcessID%]" 
41.
set "RTC_ErrStamp=%date%;%time%;[ERROR];[%ProcessID%]" 
42.
if "%log_file%" EQU "" set "log_file=%~dp0%ProgName%.log" 
43.
:: Abhaengikeit zu ":ActiveProcess" und ":MenuSet1" 
44.
set "RTC_ProcFile=%RTC_FilePath%%ProgName%_TEMP_%ProcessID%.cmd" 
45.
 
46.
:StartParameter 
47.
:: Handling StartParameter 
48.
:: ... IFs ueberspringen 
49.
if "%StartParameter%" EQU "" goto :SetStartTime 
50.
:: ... Startzeit aus Datei abrufen 
51.
if "%StartParameter%" EQU "-E" ( 
52.
	if not exist "%RTC_ProcFile%" goto :Error-E 
53.
	call :GetTime 
54.
	call %RTC_ProcFile%  
55.
	goto :SetEndTime 
56.
57.
:: ... Startzeit in Datei speichern 
58.
if "%StartParameter%" EQU "-S" ( 
59.
	if exist "%RTC_ProcFile%" goto :Error-S 
60.
	call :GetTime 
61.
	goto :WriteProcess 
62.
63.
:: ... Hilfe des Programms aufrufen 
64.
if "%StartParameter%" EQU "-H" goto :Help 
65.
:: ... laufende Prozesse abfragen 
66.
if "%StartParameter%" EQU "-C" goto :Control-C 
67.
 
68.
 
69.
:SetStartTime 
70.
:: Start der Berechnungsroutine 
71.
:: ... Startzeit (in Hundertstelsekunden) holen 
72.
call :GetTime 
73.
:: ... Startzeit in Variablen speichern  
74.
set "Startzeit=%t%" 
75.
set "Start=%TimeInHSec%" 
76.
:: -------------------- 
77.
:: ... Startet das innenliegende Skript (optional) 
78.
call :StartRunTimeSkript 
79.
:: -------------------- 
80.
:SetEndTime 
81.
:: Holt die Endzeit und berechnet Differenz zur Startzeit 
82.
:: ... Endzeit (in Hundertstelsekunden) holen und in Variablen speichern 
83.
call :GetTime 
84.
set "Endzeit=%t%" 
85.
set "End=%TimeInHSec%" 
86.
:Calculator 
87.
:: ... Ermittlung und Zerlegung/Formatierung der Differenz 
88.
set /a Diff=%End%-%Start% 
89.
:: ... Tageswechsel beachten 
90.
if %Diff% lss 0 set /a Diff+=8640000 
91.
set DiffRem=%Diff% 
92.
:: ... Hundertstelsekunden holen 
93.
call :GetPart 100 
94.
set hs=%Part% 
95.
:: ... Sekunden holen 
96.
call :GetPart 60 
97.
set s=%Part% 
98.
:: ... Minuten holen 
99.
call :GetPart 60 
100.
set m=%Part% 
101.
:: ... Stunden bleiben als Rest 
102.
set h=%DiffRem% 
103.
:Output 
104.
:: Ausgabe der Daten, End of Batch 
105.
if [%ProcessID%] NEQ [] ( 
106.
	if not exist "%RTC_ProcFile%" ( 
107.
		echo %RTC_InfStamp%>>%log_file% 
108.
		echo [%ProcessID%]  Startzeit       %Startzeit%>>%log_file% 
109.
110.
	echo [%ProcessID%]    Endzeit       %EndZeit%>>%log_file% 
111.
	echo [%ProcessID%]      Dauer        %h%:%m%:%s%,%hs%>>%log_file% 
112.
113.
echo. 
114.
if "%StartParameter%" == "" call :Reference 
115.
echo ............................... 
116.
echo Laufzeit zum Prozess [%ProcessID%] 
117.
echo ------------------------------- 
118.
echo Startzeit:     %Startzeit% 
119.
echo Endzeit:       %EndZeit% 
120.
echo Dauer:         %h%:%m%:%s%,%hs% 
121.
echo ............................... 
122.
echo. 
123.
if exist "%RTC_ProcFile%" del %RTC_ProcFile% 
124.
goto :Exit 
125.
 
126.
 
127.
:GetTime  
128.
:: Subroutine zur Bildung der Variablen von Start- und End- zeit 
129.
:: ... Aktuelle Zeit verwenden ... 
130.
set t=%time% 
131.
:: ... Systemvariable "time" zerlegen, Formatierungszeichen entfernen ... 
132.
for /f "tokens=1-4 delims=:," %%i in ("%t%") do set "h=%%i" & set "m=%%j" & set "s=%%k" & set "hs=%%l" 
133.
:: ... Oktalzahlklippen umschiffen ... 
134.
if %m:~0,1%==0 set m=%m:~1% 
135.
if %s:~0,1%==0 set s=%s:~1% 
136.
if %hs:~0,1%==0 set hs=%hs:~1% 
137.
:: ... und in Hundertstelsekunden-Wert umrechnen. 
138.
set /a TimeInHSec=((%h%*60+%m%)*60+%s%)*100+%hs% 
139.
goto :eof  
140.
 
141.
:GetPart 
142.
:: Subroutine zur Berechnung der Differenz 
143.
:: ... Anhand des Aufrufparameters (60 oder 100) aufspalten ... 
144.
set /a Part=%DiffRem%%%%1 
145.
:: ... und mit fuehrender Null formatieren sowie ... 
146.
if %Part% lss 10 set Part=0%Part% 
147.
:: ... noch aufzuteilenden Rest der Differenz ermitteln. 
148.
set /a DiffRem=%DiffRem%/%1 
149.
goto :eof 
150.
 
151.
 
152.
 
153.
:WriteProcess 
154.
:: Schreibt "RTC_ProcFile" und speichert Startzeit 
155.
echo @echo off>%RTC_ProcFile% 
156.
echo TITLE %ProgName% [%ProcessID%]>>%RTC_ProcFile% 
157.
:: ... speichern der Variablen als festen Wert 
158.
echo set "Startzeit=%t%">>%RTC_ProcFile% 
159.
echo set "Start=%TimeInHSec%">>%RTC_ProcFile% 
160.
:: ... Protokoll unerwuenscht - schneller machen 
161.
echo if [%ProcessID%] EQU [] ^(goto :eof^)>>%RTC_ProcFile% 
162.
:: ... Wertuebergabe an das Protokoll bei Aufruf des "RTC_ProcFile" 
163.
echo echo %%RTC_InfStamp%%^>^>%log_file%>>%RTC_ProcFile% 
164.
echo echo [%ProcessID%]  Startzeit       %%Startzeit%%^>^>%log_file%>>%RTC_ProcFile% 
165.
echo goto :eof>>%RTC_ProcFile% 
166.
echo Startzeit mit "%t%" und ProcessID [%ProcessID%] wurde gespeichert. 
167.
goto :Exit 
168.
 
169.
 
170.
:Error-E 
171.
:: Fehlerhandling wenn Prozess nicht vorhanden 
172.
set "MessageID=Err-E" 
173.
echo. 
174.
echo. 
175.
echo WARNUNG: 
176.
echo ProcessID: [%ProcessID%] 
177.
echo Eine Laufzeitberechnung mit gleicher ProcessID wurde nicht gefunden. 
178.
echo %RTC_ErrStamp%>>%log_file% 
179.
echo [%ProcessID%];%MessageID%;Gleichnamiger Prozess wurde nicht gefunden>>%log_file% 
180.
echo [%ProcessID%];%MessageID%;Betroffene Startzeiten werden nachfolgend aufgelistet.>>%log_file% 
181.
echo. 
182.
echo Der aktuelle Vorgang ist relevant fuer ALLE aktiven Laufzeitberechnungen. 
183.
echo Er ist nicht ausfuehrbar und wird in jedem Fall abgebrochen. 
184.
echo. 
185.
echo Liste der aktiven Laufzeitberechnungen 
186.
call :ActiveProcess 
187.
echo. 
188.
goto :MenuOptionen 
189.
 
190.
:Error-S 
191.
:: Fehlerhandling wenn Prozess vorhanden 
192.
set "MessageID=Err-S" 
193.
echo. 
194.
echo. 
195.
echo WARNUNG: 
196.
echo ProcessID: [%ProcessID%] 
197.
echo Eine Laufzeitberechnung mit gleicher ProcessID wurde bereits gestartet 
198.
echo und nicht beendet. 
199.
echo %RTC_ErrStamp%>>%log_file% 
200.
echo [%ProcessID%];%MessageID%;Gleichnamiger Prozess gefunden>>%log_file% 
201.
echo [%ProcessID%];%MessageID%;Betroffene Startzeiten werden nachfolgend aufgelistet.>>%log_file% 
202.
echo - Jede Laufzeitberechnung die innerhalb einer aktiven Laufzeitberechnung 
203.
echo   gestartet wird, benoetigt eine eigene ProcessID. 
204.
echo. 
205.
echo Der aktuelle Vorgang ist relevant fuer ALLE aktiven Laufzeitberechnungen. 
206.
echo. 
207.
echo Liste der aktiven Laufzeitberechnungen 
208.
call :ActiveProcess 
209.
echo. 
210.
echo Bei Fortsetzung des aktuellen Prozesses wird eine neue Startzeit 
211.
echo gespeichert. In der Logdatei erfolgt ein Hinweis auf diesen Vorgang. 
212.
echo. 
213.
goto :MenuOptionen 
214.
 
215.
:Control-C 
216.
:: Zugang zum Menue 
217.
set "MessageID=Ctrl-C" 
218.
echo. 
219.
echo. 
220.
echo HINWEIS: 
221.
echo ProcessID: [%ProcessID%] 
222.
echo Es werden alle gestarteten Prozesse Prozesse angezeigt. Dieser Vorgang 
223.
echo wird grundsaetzlich geloggt. 
224.
echo %RTC_InfStamp%>>%log_file% 
225.
echo [%ProcessID%];%MessageID%;Gleichnamiger Prozess gefunden>>%log_file% 
226.
echo [%ProcessID%];%MessageID%;Betroffene Startzeiten werden nachfolgend aufgelistet.>>%log_file% 
227.
echo. 
228.
echo Liste der aktiven Laufzeitberechnungen 
229.
call :ActiveProcess 
230.
echo. 
231.
goto :MenuOptionen 
232.
 
233.
:ActiveProcess 
234.
:: Listet betroffene Prozesse [Startzeiten] 
235.
FOR /R %RTC_FilePath% %%I in (%ProgName%_TEMP_*.cmd) do set "RunProzess=%%I" 
236.
if "%RunProzess%" == "" ( 
237.
	echo %MessageID%;Es wurden keine laufenden Prozesse gefunden. 
238.
	echo [%ProcessID%];%MessageID%;Es wurden keine laufenden Prozesse gefunden.>>%log_file%  
239.
	goto :eof 
240.
241.
setlocal enabledelayedexpansion 
242.
for /R %RTC_FilePath% %%I in (%ProgName%_TEMP_*.cmd) do ( 
243.
	set "RunProzess=%%~nI" 
244.
	echo %MessageID%;[!RunProzess:%ProgName%_TEMP_=!] 
245.
	echo [%ProcessID%];%MessageID%;[!RunProzess:%ProgName%_TEMP_=!]>>%log_file% 
246.
247.
setlocal disabledelayedexpansion 
248.
goto :eof 
249.
 
250.
 
251.
:MenuOptionen 
252.
echo. 
253.
echo --------------- 
254.
echo OPTIONS - MENUE 
255.
echo --------------- 
256.
echo. 
257.
echo Die Optionen koennen durch Eingabe von 1, 2, 3 oder 4 gewaehlt werden 
258.
echo ------------------------------------------------------------------------- 
259.
echo 1. Loeschen aller Startzeiten, %ProgName% beenden (empfohlen)        [1] 
260.
echo 2. Loeschen der aktuellen Startzeit, %ProgName% beenden              [2] 
261.
echo    aktueller Prozess ist:  [%ProcessID%] 
262.
echo 3. Fortsetzen von %ProgName% - Ueberschreiben der Startzeit          [3] 
263.
echo 4. Beenden von %ProgName%                                            [4] 
264.
echo. 
265.
set /p "input=" 
266.
	if "%input%" EQU "1" set "MenuOption=1" & goto :MenuSet1 
267.
	if "%input%" EQU "2" set "MenuOption=2" & goto :MenuSet2 
268.
	if "%input%" EQU "3" set "MenuOption=3" & goto :MenuSet3 
269.
	if "%input%" EQU "4" set "MenuOption=4" & goto :MenuSet4 
270.
echo. 
271.
echo   --------mistake: [%input%]-------------------------------------------------- 
272.
echo   Incorrect input                                 Select [1] [2] [3] [4] 
273.
echo. 
274.
echo [%ProcessID%];Eingabefehler - Option nicht vorhanden.>>%log_file% 
275.
goto :MenuOptionen 
276.
:MenuSet1 
277.
if not exist "%RTC_FilePath%%ProgName%_TEMP_*.cmd" ( 
278.
	echo %MessageID%;%MenuOption%;Option steht nicht zur Verpfuegung. 
279.
	echo [%ProcessID%];%MessageID%;%MenuOption%;Fehleingabe durch Benutzer.>>%log_file% 
280.
	goto :MenuOptionen 
281.
282.
setlocal enabledelayedexpansion 
283.
for /R %RTC_FilePath% %%I in (%ProgName%_TEMP_*.cmd) do ( 
284.
	set "RunProcess=%%~I" 
285.
	del %%I 
286.
	set "ShortName=!RunProcess:%RTC_FilePath%%ProgName%_TEMP_=!" 
287.
	set "RunProcess=!ShortName:.cmd=!" 
288.
	echo %MessageID%;%MenuOption%;[!RunProcess!] wurde geloescht. 
289.
	echo [%ProcessID%];%MessageID%;%MenuOption%;[!RunProcess!] wurde geloescht.>>%log_file% 
290.
291.
setlocal disabledelayedexpansion 
292.
echo %MessageID%;%MenuOption%;%ProgName% wird automatisch beendet. 
293.
echo %MessageID%;%MenuOption%;Eintragung der geloeschten Startzeiten in die Logdatei "%log_file%". 
294.
echo [%ProcessID%];%MessageID%;%MenuOption%;%ProgName% wurde automatisch beendet.>>%log_file% 
295.
goto :Exit 
296.
:MenuSet2 
297.
if not exist "%RTC_ProcFile%" ( 
298.
	echo %MessageID%;%MenuOption%;Option steht nicht zur Verpfuegung. 
299.
	echo [%ProcessID%];%MessageID%;%MenuOption%;Fehleingabe durch Benutzer.>>%log_file% 
300.
	goto :MenuOptionen 
301.
302.
if exist "%RTC_ProcFile%" ( 
303.
	del %RTC_ProcFile% 
304.
	echo %MessageID%;%MenuOption%;[%ProcessID%] wurde geloescht. 
305.
	echo [%ProcessID%];%MessageID%;%MenuOption%;[%ProcessID%] wurde geloescht.>>%log_file% 
306.
	echo %MessageID%;%MenuOption%;%ProgName% wird automatisch beendet. 
307.
	echo %MessageID%;%MenuOption%;Eintragung der geloeschten Startzeit in die Logdatei "%log_file%". 
308.
	echo [%ProcessID%];%MessageID%];%MenuOption%;%ProgName% wurde automatisch beendet.>>%log_file% 
309.
goto :Exit 
310.
311.
:MenuSet3 
312.
if not exist "%RTC_ProcFile%" ( 
313.
	echo %MessageID%;%MenuOption%;Option steht nicht zur Verpfuegung. 
314.
	echo [%ProcessID%];%MessageID%;%MenuOption%;Fehleingabe durch Benutzer.>>%log_file% 
315.
	goto :MenuOptionen 
316.
317.
if exist "%RTC_ProcFile%" ( 
318.
	echo %MessageID%;%MenuOption%;%ProgName% wird fortgesetzt und Startzeit ueberschrieben. 
319.
	echo %MessageID%;%MenuOption%;Eintragung der ueberschriebenen Startzeit in die Logdatei "%log_file%". 
320.
	echo [%ProcessID%];%MessageID%;%MenuOption%;%ProgName% wird fortgesetzt und Startzeit ueberschrieben.>>%log_file% 
321.
	call :GetTime 
322.
	goto :WriteProcess 
323.
324.
:MenuSet4 
325.
echo %MessageID%;%MenuOption%;%ProgName% wird durch Benutzer beendet. 
326.
echo %MessageID%;%MenuOption%;Eintragung erfolgt in die Logdatei "%log_file%". 
327.
echo [%ProcessID%];%MessageID%;%MenuOption%;%ProgName% wurde durch Benutzer beendet.>>%log_file% 
328.
goto :Exit 
329.
 
330.
 
331.
:Reference 
332.
echo. 
333.
echo. 
334.
echo TIP: 
335.
echo Die Batch "%~f0" 
336.
echo wurde ohne Startarameter ausgefuehrt. Fuer die Berechnung 
337.
echo der Laufzeit wird das Skript INNERHALB der Batch verwendet. 
338.
echo ----------------------------------------------------------- 
339.
echo. 
340.
echo. 
341.
goto :eof 
342.
 
343.
:Help 
344.
echo. 
345.
echo. 
346.
echo. 
347.
echo  HILFE: 
348.
echo  Diese Batch "%ProgName%.cmd" berechnet die Laufzeit eines 
349.
echo  Skriptes. Wird die Batch ohne Parameter ausgefuehrt, 
350.
echo  muss sich dieses Skript innerhalb dieser Batch befinden. Der 
351.
echo  Bereich fuer das Skript ist entsprechend gekennzeichnet. 
352.
echo  Mit gesetzten Parameter muss diese Batch aus einem externen 
353.
echo  Skript aufgerufen werden. Der Parameter "-S" speichert die 
354.
echo  Startzeit in nachfolgender Datei. 
355.
echo  "%RTC_ProcFile%" 
356.
echo  Die Batch wird beendet und das zu berechnende Skript laeuft 
357.
echo  ab. Mit dem Parameter "-E" wird diese Batch wiederholt  
358.
echo  aufgerufen. Die gespeicherte Startzeit wird ausgelesen, 
359.
echo  die Laufzeit berechnet und angezeigt. Mit Startparameter wird 
360.
echo  das Ergebnis in nachfolgender Datei geloggt. 
361.
echo  "%log_file%" 
362.
echo  Zum Abschluss wird die Datei mit der Startzeit geloescht. 
363.
echo  ANMERKUNG: 
364.
echo  Ist %ProgName% noch nicht geladen, kommt es in einigen Faellen 
365.
echo  zu unerwarteten Ergebnissen. Ein einfaches 
366.
echo   call %ProgName%.cmd^>NUL 
367.
echo  am Anfang des zu messenden Skriptes behebt diese Koriositaet. 
368.
echo. 
369.
echo. 
370.
echo  SYNTAX: 
371.
echo  [Batchname] [-Parameter] [@ProcessID] 
372.
echo  Batchname     = Name der dieser Batch 
373.
echo  Parameter: -C = Listet Prozesse und stellt ein Menue 
374.
echo             -E = Beendet Laufzeitzeitberechnung 
375.
echo                  (Startzeit muss gespeichert sein) 
376.
echo                  gilt fuer externes Skript 
377.
echo             -H = Ruft diese Hilfe auf. 
378.
echo             -S = Start der Batch (speichert nur die Startzeit) 
379.
echo                  gilt fuer externes Skript 
380.
echo  ProcessID     = Identifikator der Laufzeitberechnung, dient zur 
381.
echo                  Bezeichnung der Logs, darf keine Leerzeichen haben. 
382.
echo                  Ohne ProcessID wird kein Log geschrieben. 
383.
echo. 
384.
pause 
385.
echo. 
386.
echo  HINWEIS: 
387.
echo  Grundsaetzlich gilt: 
388.
echo  - Der Startparameter bestimmt die Verwendung der Batch 
389.
echo    (externe, interne Berechnung, Hilfe oder Kontrolle) 
390.
echo  Die ProzessID identifiziert den Prozess und regelt das Log. 
391.
echo  Die Logdatei befindet sich immer im Verzeichnis dieser Batch. 
392.
echo  Siehe hierzu die Standardeinstellung: 
393.
echo  set "log_file=%~dp0%ProgName%.log" 
394.
echo   
395.
echo  - Keine ID - kein Log - keine Mehrfachberechnungen 
396.
echo. 
397.
echo  Diese Batch benoetigt bei externen Aufruf und Fehl- Eingaben 
398.
echo  Schreibrechte in dem Verzeichis in dem sie ausgefuehrt wird. 
399.
echo. 
400.
echo  Startzeit:        -^> Bezeichnet den Anfang der Berechnung 
401.
echo  Endzeit:          -^> Bezeichnet das Ende der Berechnung 
402.
echo  Dauer:            -^> Differenz aus Ende-Anfang 
403.
echo. 
404.
pause 
405.
echo. 
406.
echo  MEHRFACHBERECHNUNGEN 
407.
echo  Kreuzungen von Berechnungen sind moeglich. Dabei gilt folgendes: 
408.
echo  - Jede Laufzeitberechnung die innerhalb einer aktiven Laufzeitberechnung 
409.
echo    gestartet wird, benoetigt eine eigene ProcessID. 
410.
echo  - Werden die Laufzeitberechnungen innerhalb eines Skriptes verschachtelt, 
411.
echo    addiert sich die Abweichung. Ein direkter Vergleich ist nicht mehr objektiv. 
412.
echo. 
413.
echo  Verschachtelung von Berechnungen: 
414.
echo      ----------------------------------------- 
415.
echo      @echo off 
416.
echo      echo ... 
417.
echo. 
418.
echo      call %ProgName%.cmd -S @ScriptTime 
419.
echo      :: Start einer verschachtelten Berechnung 
420.
echo      echo ... 
421.
echo. 
422.
echo      call %ProgName%.cmd -S @Snippet01 
423.
echo      :: Laufzeitberechnung "@Snippet01" 
424.
echo      echo ... 
425.
echo      call %ProgName%.cmd -E @Snippet01 
426.
echo      echo ... 
427.
echo. 
428.
echo      call %ProgName%.cmd -S @Snippet02 
429.
echo      :: vergleichbar mit "@Snippet01" 
430.
echo      echo ... 
431.
echo      call %ProgName%.cmd -E @Snippet02 
432.
echo      echo ... 
433.
echo. 
434.
echo      :: Ende der verschachtelten Berechnung 
435.
echo      call %ProgName%.cmd -E @ScriptTime 
436.
echo      goto eof 
437.
echo      ----------------------------------------- 
438.
echo. 
439.
pause 
440.
echo. 
441.
echo  BEISPIELE: 
442.
echo  call %ProgName%.cmd -S @time01 
443.
echo    Startet die Batch aus einer externen Datei mit ID "time01". 
444.
echo    Setzt den Anfang der Berechnung, speichert "process". 
445.
echo. 
446.
echo  call %ProgName%.cmd -E @time01 
447.
echo    Startet die Batch aus einer externen Datei mit ID "time01". 
448.
echo    Berechnet die abgelaufene Zeit und loescht "process". 
449.
echo. 
450.
echo  %ProgName%.cmd -C 
451.
echo    Listet alle ueber Schalter [-C] angelegten Prozesse und. 
452.
echo    stellt ein Menue zur Verfuegung. Dieser Vorgang wird 
453.
echo    grundsaetzlich geloggt 
454.
echo. 
455.
echo  %ProgName%.cmd @time01 
456.
echo    Startet die Batch von der Konsole mit ID "time01". 
457.
echo    Berechnet die Laufzeit des IN DER BATCH liegenden Skriptes. 
458.
echo    Ohne Startparameter wird keine Startzeit gespeichert. Das Log 
459.
echo    erfolgt erst nach der Berechnung.  
460.
echo. 
461.
echo  %ProgName%.cmd 
462.
echo    Startet die Batch von der Konsole ohne ID. 
463.
echo    Berechnet die Laufzeit des IN DER BATCH liegenden Skriptes. 
464.
echo    Fuehrt die Batch ohne Schreibprozesse aus. Die ermittelten Daten 
465.
echo    werden auf dem Bildschirm ausgegeben. 
466.
echo. 
467.
echo. 
468.
goto :Exit 
469.
 
470.
 
471.
:Exit 
472.
popd 
473.
endlocal 
474.
goto :eof 
475.
 
476.
 
477.
:StartRunTimeSkript 
478.
:: Startmarke der Laufzeitberechnung 
479.
:: ... Skriptbereich optional 
480.
::---------------------------------------------------- 
481.
 
482.
REM Skriptbereich zum Testen der Laufzeit 
483.
 
484.
::---------------------------------------------------- 
485.
:: beendet Laufzeitskript als Subroutine 
486.
:: ... Der nachfolgende Befehl darf nicht entfernt werden. 
487.
goto :eof
aktualisiert am 27.11.2012


Anwendung

Immer wenn es nicht zügig vorangeht wird geschraubt, gestöpselt, aufgerüstet und weniger in den Code geschaut. Manchmal sind es einfach nur Zeilenumbrüche oder missratene Datenausgaben. Zum Vergleichen des Codes mit Alternativen, bedarf es Werkzeuge. Zwei davon sind ein Laufzeitrechner und eine Routine zur Berechnung der Schleifen. Beide sind im Anwendungsbeispiel enthalten.
„RunTimeCalc“ läßt mit folgenden Schritten einfach in das Testskript einbauen.
1. Einbindung in die Umgebung des Testskriptes
01.
set "log_file=%~dp0%~n0.log" 
02.
set „RunTimeCalc=Drive:\Path zu RunTimeCalc“ 
03.
call %RunTimeCalc%>NUL
Wird die Variable %log_file% im Testskript verwendet, schreibt RunTimeCalc bei gesetztem @Prozessnamen die Messergebnisse in das Logfile des Testskriptes.
„set RunTimeCalc=...“ setzt die Variable zum Aufruf des Tools. Wird der Computer neu gestartet und RunTimeCalc das erste mal ausgeführt wird manchmal die erste Messung verzögert. Innerhalb der Routine kann dieses nur mit Verlust an Performance verhindert werden. Daher ist der bessere Weg ein blinder Aufruf mit „call“
2. Starten der Messung mit Schalter „-S“
01.
call %RunTimeCalc% -S @Name-des-Prozesses
Es sind nur Buchstaben ohne Umlaute, Zahlen und keine Leerzeichen erlaubt.
Jeder Prozess muss einen eindeutigen Namen besitzen
3. Beenden der Messung mit Schalter „-E“
01.
call %RunTimeCalc% -E @Name-des-Prozesses
Der Prozessname muss identisch mit dem Namen bei Schalter „-S“ sein.

Hinweis
RunTimeCalc besitzt eine Fehlerroutine und ein Protokollsystem. Fluch und Segen. Der zu testende Code sollte vollständig ausführbar sein. Meldet sich RunTimeCalc mit einem Menü, liegt ein Fehler vor. Der Laufzeitrechner gibt einen Hinweis. RunTimeCalc testet nur Zeit, nicht den Code.

Anwendungsbeispiel

Es kommt der Tag, da zählt nur das kleinste Gemeinsame zwischen Windows. Bislang ist das noch cmd.exe.

Schreibrechte prüfen
Es sollen die Schreibrechte des aktuellen Users im Arbeitsverzeichnis rekursiv ermittelt werden. Ein hervorragendes Beispiel zum Einsatz einer Laufzeitberechnung. Diese soll helfen, performanten Code zu finden. Bei Vergleichen zwischen den Ausgaben von „icacls“ und „whoami“ spielt dieses Thema keine Rolle. Der schlichte Entwurf endet in einer Kathastrophe irgendwo zwischen Unix und Microsoft. Die Beispieldatei, beinhaltet den Entwurf und dessen Ueberarbeitung sowie die gesamte Vergleichsroutine

PermWrite
Sucht nach Schreibberechtigung des angemeldeten Benutzers an Dateien und Verzeichnissen, gibt bei erfolgloser Suche eine Ziel-weisende Mitteilung aus und bei Versagen eine Fehlermeldung.
Ablauf
  • Speichert den angemeldeten User und seine Relationen (Zugehoerigkeit) in eine Listen-Variable
  • Gibt alle erreichbaren Verzeichnisse rekursiv und Dateien aus
  • Liest Dateiberechtigungen aus
  • Formatiert „LF“ zu „CR LF“
  • Formatiert Datenbrei
  • Filtert nach Schreibberechtigung
  • Vergleicht „icacls“- Ausgabe mit Listen-Variable
  • Trefferanzahl kann mit interaktiven Match- Counter gesteuert werden
  • Fehlermeldungen werden nach Priorität ausgegeben

Priorität wie folgt:
1. keine Berechtigung
2. keine Schreibberechtigung
3. keine Schreibberechtigung für aktuellen User

PermFile
Ablauf
  • Gibt alle Dateien aus Verzeichnissen mit Berechtigung aus
  • Verarbeitet gefundene Dateien mit "icacls"
  • Ermittelt den angemeldeten User und seine Relationen (Zugehoerigkeit)
  • Vergleicht Ausgaben von "icacls" und "whoami"
  • Erzeugt Fehlermeldung bei fehlenden Schreibrechten

Anwendungsbeispiel "PermWrite" Vergleich "PermFile" (Code)

01.
:Environment 
02.
@echo off 
03.
setlocal 
04.
pushd %~dp0 
05.
setlocal enabledelayedexpansion 
06.
	set "file_path=F:\Public\Projects\WWW\testbasis\Test" 
07.
	set "log_file=%~dp0%~n0.log" 
08.
	set "TimeStamp=%date%;%time%" 
09.
:Tools 
10.
	set "RunTimeCalc=F:\Public\Projects\WWW\testbasis\script-local\runtime\RunTimeCalc.cmd" 
11.
	call %RunTimeCalc%>NUL 
12.
 
13.
 
14.
:Routine 
15.
call :PermWrite 
16.
call :Entwurf 
17.
 
18.
 
19.
:EXIT 
20.
setlocal disabledelayedexpansion 
21.
popd 
22.
endlocal 
23.
goto :eof	 
24.
 
25.
 
26.
 
27.
:PermWrite 
28.
echo. 
29.
echo ================================================================================ 
30.
echo PermWrite V01 - Schreibrechte des aktuellen Users an Verzeichnis, Datei pruefen 
31.
echo ================================================================================ 
32.
call %RunTimeCalc% -S @PermWrite-V01 
33.
 
34.
for /f "delims=, tokens=1,2" %%a in ('whoami /user /fo csv /nh') do ( 
35.
	set /a USERab+=1 
36.
	set ID_User=%%a,USER,%%b 
37.
	set ID_User=!ID_User:"=! 
38.
39.
set "NamesList=" 
40.
for /f "delims=, tokens=1" %%c in ('echo !ID_User!^& whoami /groups /fo csv /nh') do ( 
41.
	set /a NAMEcd+=1 
42.
	set Names=%%c 
43.
	set Names=!Names:"=! 
44.
	set NamesList=!NamesList!#!Names!#; 
45.
46.
echo. 
47.
echo %USERDOMAIN%\%USERNAME% - bitte warten. Die Routine arbeitet ... 
48.
echo. 
49.
:: Trefferanzahl n+1; nicht fuer normale "for %%I" 
50.
set match= 
51.
for /f "tokens=*" %%a in ('dir %file_path% /b /s') do ( 
52.
	set /a N_a+=1 
53.
	set Match_d= 
54.
	set Warn= 
55.
	set set Prot_b=& set Prot_c=& set Prot_d= 
56.
	set Prot_a=a 
57.
	for /f "tokens=* usebackq" %%b in (`icacls "%%a"`) do ( 
58.
		set /a N_b+=1 
59.
		if "!Match_d!" LEQ "!match!" ( 
60.
			set B=%%b 
61.
			set B=!B:%%a =! 
62.
			set B=!B:^(=[! 
63.
			set B=!B:^)=]! 
64.
			if "%%b" EQU "%%a " set Warn=b 
65.
			set Prot_b=b 
66.
			for /f "delims=:" %%c in ('echo !B!^|findstr /E /L "F] M] W]"') do ( 
67.
				set /a N_c+=1 
68.
				set Prot_c=c 
69.
				for /f "tokens=*" %%d in ('echo %NamesList%^|Findstr /I /C:"#%%c#"') do ( 
70.
					set /a N_d+=1 
71.
					set /a Match_d+=1 
72.
					::echo %%c 
73.
					set Prot_d=d 
74.
					)				 
75.
76.
77.
78.
	if "!Prot_b!" NEQ "b" ( 
79.
		echo ERRROR;Error;"icacls" Abfrage nicht moeglich mit "...\%%~nxa". 
80.
		echo %TimeStamp%;ERRROR;Error;"icacls" Abfrage nicht moeglich mit "%%a".>>%log_file% 
81.
82.
	if "!Warn!" EQU "b" ( 
83.
		echo NOTICE;Warn;Keine Rechte definiert fuer "...\%%~nxa". 
84.
		echo %TimeStamp%;NOTICE;Warn;Keine Rechte definiert fuer "%%a".>>%log_file% 
85.
86.
	if "-!Prot_b!-!Warn!-!Prot_c!-!Prot_d!-" EQU "-b----" ( 
87.
		echo NOTICE;Warn;Kein Schreibzugriff definiert auf "...\%%~nxa". 
88.
		echo %TimeStamp%;NOTICE;Warn;Kein Schreibzugriff definiert auf "%%a".>>%log_file% 
89.
90.
	if "-!Prot_b!-!Warn!-!Prot_c!-!Prot_d!-" EQU "-b--c--" ( 
91.
		echo NOTICE;Tip;USER "%USERNAME%" besitzt keine Schreibrechte an "...\%%~nxa". 
92.
		echo %TimeStamp%;NOTICE;Tip;USER "%USERNAME%" besitzt keine Schreibrechte an "%%a".>>%log_file% 
93.
94.
95.
if "!Prot_a!" EQU "" ( 
96.
	echo ERROR;Error;:PermWrite kann nicht ausgefuehrt werden. 
97.
	echo ERROR;Tip;Pruefen "icacls", "whoami" oder "%file_path%". 
98.
	echo %TimeStamp%;ERROR;Error;:PermWrite kann nicht ausgefuehrt werden.>>%log_file% 
99.
	echo %TimeStamp%;ERROR;Tip;Pruefen "icacls", "whoami" oder "%file_path%".>>%log_file% 
100.
101.
echo. 
102.
echo %N_a% Dateien und Verzeichnisse geprueft. 
103.
 
104.
call %RunTimeCalc% -E @PermWrite-V01 
105.
 
106.
for %%I in (N_a N_b N_c N_d) do ( 
107.
	if "!%%I!" EQU "" set %%I=0 
108.
	set /a Schleifenzahl+=!%%I! 
109.
110.
echo. 
111.
echo Dateien, Verzeichnisse ^= %N_a%^|Tokens Rechte ^= %N_b%^|Schreibrechte ^= %N_c%^|Uebereinstimmung ^= %N_d% 
112.
echo Schleifenzahl gesamt ^= %Schleifenzahl% 
113.
goto :eof 
114.
 
115.
::########################################### 
116.
 
117.
:Entwurf 
118.
echo. 
119.
echo ================================================================================ 
120.
echo PermFile ENTWURF              Schreibrechte des aktuellen Users an Datei pruefen 
121.
echo Kurz, uebersichtlich, langsam und falsch 
122.
echo ================================================================================ 
123.
call %RunTimeCalc% -S @Entwurf-PermFile 
124.
 
125.
for /r %file_path%\ %%Z in ("*") do ( 
126.
	set /a FOR_Z+=1 
127.
	set stop= 
128.
	for /f "tokens=* usebackq" %%a in (`icacls "%%Z"`) do ( 
129.
		set /a FOR_a+=1 
130.
		for /f %%b in ('whoami /user /groups /fo table /nh') do ( 
131.
			if "!stop!" NEQ "s" ( 
132.
			set /a FOR_b+=1 
133.
			for /f "tokens=*" %%c in ('echo %%a^|findstr /e "F) M) W)"^|findstr /i "%%b"') do ( 
134.
				set /a FOR_c+=1 
135.
				set stop=s 
136.
				)) 
137.
138.
139.
	if "!stop!" EQU "" echo USER "%USERNAME%" besitzt keine Schreibrechte an "...\%%~nxZ". 
140.
141.
echo. 
142.
echo %FOR_Z% Dateien geprueft. 
143.
 
144.
call %RunTimeCalc% -E @Entwurf-PermFile 
145.
 
146.
for %%I in (FOR_Z FOR_a FOR_b FOR_c) do ( 
147.
	if "!%%I!" EQU "" set %%I=0 
148.
	set /a Schleifenzahl_E+=!%%I! 
149.
150.
echo. 
151.
echo Dateien ^= %FOR_Z%^|Datei Rechte ^= %FOR_a%^|Namen ^= %FOR_b%^|Uebereinstimmung ^= %FOR_c% 
152.
echo Schleifenzahl gesamt ^= %Schleifenzahl_E% 
153.
goto :eof
angenehmes Testen wünscht
Viewfinder
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Windows 10
gelöst PCs über eine Batch Datei nach 2 Tagen Laufzeit automatisch herunterfahren (12)

Frage von Karsten70154 zum Thema Windows 10 ...

Batch & Shell
gelöst (Batch) Nummern vergleichen (3)

Frage von clragon zum Thema Batch & Shell ...

Batch & Shell
gelöst Textdateien vergleichen BATCH (2)

Frage von FeudelFred zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Änderungsdatum von Dateien vergleichen und ältere löschen (10)

Frage von 129528 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...