pieh-ejdsch
Goto Top

Batchcode erstellen - Fehler im Batch leichter finden

Hallo Welt!

Beim schnellen Daher Schreiben von Batches kann es schonmal vorkommen, den ein oder anderen Fehler zu produzieren.
Mal wird eine Marke nicht gefunden oder eine Variable hat einen Vertipper.

Um diese Fehler leichter ausfindig zu machen, sind übersichtlich Angeordnete Informationen besser lesbar, als wenn diese über mehrere Zeilen verstreut sind.
Dieser Batch Listet solche wesentlichen Zeilen auf.
Er ersetzt aber nicht das Debugging von den Batches und macht auch darüber keine Syntaxprüfung.
Vielmehr soll es als Hilfe zur Fehlersuche angesehen werden.

Zum erstellen und ergänzen von größeren Batches ist es wärendessen eine Erleichterung.
@setlocal
:checkEchoOn
@ :: Liest ob ECHO ON oder OFF geschalten ist um Variablen zu setzen
@(
echo>"%temp%\isOn.Ft"  
for /f "usebackq tokens=2 delims=()" %%E in ("%temp%\isOn.FT") do @set "EchoBack=echo %%E &"  
del "%temp%\isOn.Ft"  
)

@echo off
setlocal disabledelayedexpansion

:checkCMDline
:: setzt eine Variable CMDPause wenn im Batchmodus
@echo off
setlocal disabledelayedexpansion
 rem CMD-Kontex ?
set "CMDPause=%~f0"  
set "CMDPause=%CMDPause:\=\\%"  
set "CMDPause=%CMDPause:.=\.%"  
setlocal enabledelayedexpansion
for /f delims^= %%i in ("!CMDcmdLine!") do endlocal &set "CMDPin=%%i"  
cmd /von /c "echo !CMDPin!" |findstr /irc:"cmd .*\/c \"\"%CMDPause%\" .*\"" /c:"cmd\.exe .*\/c \"\"%CMDPause%\" .*\"" >nul  
endlocal
if not errorlevel 1 set "CMDPause=pause &"  
if     errorlevel 1 set "CMDPause="  


:: rem Testzeile aktivieren wenn Variable Debug gesetzt ?
if defined Debug echo on

:checkEchoOn
@ :: Liest ob ECHO ON oder OFF geschalten ist um Variablen zu setzen
@(
rem ^%Mon% Zeilen bei Echo on auf REM umschalten
echo>"%temp%\isOn.Ft"  
< "%temp%\isOn.Ft" find "ON" >nul && set "Mon=rem" || set "Mon=echo("  
del "%temp%\isOn.Ft"  
)

::CheckCMD
if "%~1" neq "/?" goto :noHelp  
echo Zum leichten Check von Batchcode. Listet gefundene Werte mit Zeilennummer auf.
echo(&<nul set /p ="%~n0 [Laufwerk:][Pfad]Dateiname  "  
for /f "delims=: " %%i in ('findstr /irc:"^[ 	]*:[^:]* 	.* " "%~f0"') do (  
  %= Auflistung der Gefundenen Ergebnisse in einer Zeile =%
  <nul set /p "=[%%i] "  
)
echo(&echo(
echo 	Ohne Suchwert werden alle Werte aufgelistet.
echo(&echo 	Folgende Werte werden bei Angabe seperat aufgelistet. &echo( 
for /f "tokens=*delims=:" %%i in ('findstr /irc:"^[ 	]*:[^:]* 	.* " "%~f0" ') do echo  %%i  
echo(
%CMDPause%%EchoBack%exit /b 0
:noHelp
if not exist "%~1" echo Syntaxfehler. Datei nicht gefunden! 1>&2 &%CMDPause%%EchoBack%exit /b1  

 %mon% Ueberpruefe %1
echo(
:wieder
 rem Suche :Sprungmarke Leerzeichen TAB
findstr /i /r /c:"^ *:%~2 	*" "%~f0" >nul && (call :%~2 %1 %2  
if "%~3" neq "" shift /2 & goto :wieder  
%CMDPause%exit /b 0
) || if "%~2" neq "" (echo Keine Gueltige Abfrage: %2  
if "%~3" neq "" shift /2 & goto :wieder  
%CMDPause%exit /b 1
)


 rem :Sprungmarke Leerzeichen TAB(TAB) Beschreibung

:ECHO 		ECHO Zustand @/on/off Zeilen
 %Mon% ECHO 
findstr /nvrc:"^[ 	]*:*:" %1 |findstr /irc:"[@]*[^a-Z]echo on[^a-Z]*" /c:"[@]*[^a-Z]*echo off[^a-Z]*" /c:"[^a-Z]*[@][a-Z(]"  
if not errorlevel 1 echo(&echo(
if errorlevel 1 echo Keine ECHO/Silent Befehle gefunden!&echo(
if /i "%~0" equ ":ECHO" goto :eof  

:LOCAL 		setLOCAL en/disAble EXTensions/DELAYedExpansion ;EXIT
%Mon% LOCAL
findstr  /nirc:"[^a-Z]*setlocal\>" /C:"[^a-Z]*endlocal\>"^  
 /c:"[^a-Z]*setlocal EnableDelayedExpansion\>" /c:"[^a-Z]*setlocal DisableDelayedExpansion\>" ^  
 /c:"[^a-Z]*setlocal EnableExtensions\>" /c:"[^a-Z]*exit[ ]*\/b" ^  
 %1
if not errorlevel 1 echo(&echo(
if     errorlevel 1 echo Keine Local/exit gefunden!&&echo(
if /i "%~0" equ ":%2" goto :eof  

:CALL 		Sprunganfang Positionen Unteroutinen
 %Mon% CALL
 rem :::: Notiz: Findstr regulaer: Zeilenanfang und Wortanfang nicht gleichzeitig nehmen
findstr  /nirc:"^[^:].*[(&|]*[^:][ 	]*call\>" /c:"^call\>" %1 &&echo(&&echo(||echo Keinen CALL Sprunganfang gefunden!&&echo(  
if /i "%~0" equ ":%2" goto :eof  

:GOTO 		Sprunganfang Positionen Fortsetzung ab :Marke
 %Mon% GOTO 
 rem :::: Notiz: GOTO[;:= 	][;:= 	]*.*
findstr /nvrc:"^[ 	]*:" %1 |findstr /irc:"[^a-Z]*goto\>" &&echo(&&echo(||echo Keinen GOTO Sprunganfang gefunden!&&echo(  
if /i "%~0" equ ":GOTO" goto :eof  

:MARKE 		SprungMarke
 %Mon% :MARKE
findstr /nirc:"^[;= 	]*:[^:#].*" %1 &&echo(&&echo(||echo Keine :MARKE Sprungposition gefunden!&&echo(  
if "%~2" neq "" goto :eof  

:PARENTH 	Klammern ( )
%Mon% PARENTH
findstr /nirc:"^[;= 	]*[^:#][^:]*.*[^a-Z][()]" /c:"^[;= 	@]*[()]" %1  
if not errorlevel 1 echo(&echo(
if errorlevel 1 echo keine Klammern gefunden!&echo(
if /i "%~2" neq "" goto :eof  

:PIPE 		Eingabe Zeilen
 %Mon% PIPE 
findstr /nirc:"^[;= 	]*[^:#].*[^|]|[^|].*" /c:"^[;= 	]*[^:#].*[^^][^|]^|[^^][^|].*" %1  
if not errorlevel 1 echo(&echo(
if errorlevel 1 echo Keine Eingabe gefunden!&echo(
if /i "%~0" equ ":ECHO" goto :eof  

:REDIRECT 	Handle Umleitung
 %Mon% REDIRECT 
findstr /nivrc:"^[,;= 	]*:" /c:"^[,;= 	]*rem" %1 |findstr /irc:"[<>]&[1-9]" /c:"[1-9]>" /c:"[<>]." ^  
 /c:"^[<>]^&[1-9]" /c:"[1-9]^>^>" /c:"[1-9]^>" /c:"^>."  
if not errorlevel 1 echo(&echo(
if errorlevel 1 echo Keine Handle Umleitung gefunden!&echo(
if /i "%~0" equ ":REDIRECT" goto :eof  

:COMMENT 	Kommentarzeilen mit ::
 %Mon% :: KOMMENTAR
findstr /nirc:"^[,;= 	]*::" %1 &&echo(&&echo(  
if errorlevel 1 echo Keine Kommentarzeile :: gefunden!&echo(
if "%~2" neq "" goto :eof  

:REM 		Kommentarzeilen mit REM
 %Mon% REM
findstr /nirc:"^[ 	,;=]*rem\>" %1 &&echo(&&echo(  
if errorlevel 1 echo Keine REM Kommentar gefunden!&echo(
if "%~2" neq "" goto :eof  

:LoopCOMMENT 	Kommentare in Schleifen %= Loop Comment % werden aufgelistet
 %Mon% %%= LOOPCOMMENT =%%
findstr /nirc:"^[ 	,;=]*[^%%a-Z]%%==*[a-Z]*.*%%" %1 &&echo(&&echo(  
if errorlevel 1 echo Kein %%= Loop Kommentar %% gefunden!&echo(
if "%~2" neq "" exit /b  

:OneLINE 	Einanderfolgende Zeilen (ohne Zeilenumbruch)
 %Mon% OneLine^^
findstr /nirc:".*\^$" %1 &&echo(&&echo(  
if errorlevel 1 echo Kein OneLine gefunden!&echo(
if "%~2" neq "" exit /b  

:SET 		Variablen werden Definiert
 %Mon% SET
findstr /nvrc:"^[ 	]*:*:" %1 |findstr /irc:"[^a-Z]set[^a-Z]" &&echo(&&echo(||echo Keine SET Anweisung gefunden!&&echo(  
if "%~2" neq "" goto :eof  

:VARS 		Variablennamen werden aufgelistet
 %Mon% %%VARIABLEN%%
findstr /nvrc:"^[ 	]*:" /c:"%%.*:~%%" %1 |findstr /irc:"%%[a-Z§$.\_+#?-][^0-9~=%% ]*[a-Z§$./_+'?-]*%%"^  
 /c:"%%[a-Z§$.\_+#?-][^0-9~=%% ]*[a-Z]*:[ ~0-9].*%%" /c:"%%[a-Z§$.\_+#?-][^0-9~=%% ]*[a-Z]*:[a-Z§$._+'?-].*%%" &&echo(&&echo(||echo Keine %%Variable%% gefunden!&&echo(  

 %Mon% !VARIABLEN!
findstr /nvrc:"^[ 	]*::" %1 |findstr /irc:"[^^]![a-Z§$._+#?\-][a-Z§$._+#?\-]*[^0-9~= ]*.*[^^]!" &&echo(&&echo(||echo Keine !Variable! gefunden!&&echo(  
if "%~2" neq "" goto :eof  

:ForVARS 	Auflistung von For Schleifen Variablen 
 %Mon% FOR VARIABLEN
findstr /nirc:"^[ ]*[^:].*[^a-Z]%%%%~*[dpnxf]*[?#@a-Z][^0-9]*[^a-Z]*" %1 &&echo(&&echo(||echo Keine FOR -Variable gefunden!&&echo(  
if "%~2" neq "" goto :eof  

:PARAM 		die Verwendung von Parametern
 %Mon% PARAMETER
findstr /nirc:"^[ 	]*[^:].*[^a-Z]%%~*[dpnxf]*[0-9\*][^a-Z]*" %1 &&echo(&&echo(||echo Kein Parmeter gefunden!&&echo(  
if "%~2" neq "" goto :eof  

:NoCOMMENT 	der Batch ohne Kommentarzeilen mit :: rem %%=
 %Mon% KEIN :: rem KOMMENTAR ^(Script ohne Kommentar^)
findstr /nvrc:"^[,;= 	]*::" /c:"^[ 	,;=]*rem\>" /c:"^[ 	,;=]*[^%%a-Z]%%==*[a-Z]*.*%%" %1 &&echo(&&echo(  
if "%~2" neq "" goto :eof  


::Weitere Pruefungen ...
 rem :Sprungmarke Leerzeichen TAB(TAB) Beschreibung

%CMDPause%rem Scriptende
[Edit]
Filter erweitert
[/Edit]

Es lassen sich leicht Ergänzende Suchbegriffe am Ende einfügen.

In einen älteren Beitrag hier ist eine Überprüfung von echo Zeilen auf nichtmaskierte Sonderzeichen.

Viel Erfolg bei der Fehlersuche und beim erstellen.

Gruß Phil

Content-ID: 184736

Url: https://administrator.de/contentid/184736

Ausgedruckt am: 23.11.2024 um 12:11 Uhr