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.
[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
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 184736
Url: https://administrator.de/contentid/184736
Ausgedruckt am: 25.11.2024 um 03:11 Uhr