andreasa
Goto Top

übergebene Parameter auf Gültigkeit prüfen in Batch

back-to-topHallo allerseits,

Ich hab mich hier inzwischen angemeldet, um auch mal eine Frage loszuwerden. Leider bin ich für mein folgendes Problem noch nicht fündig geworden. Ich hoffe ihr könnt mir da weiter helfen face-wink

back-to-topAlso hier mal kurze Einleitung zum bisherigen Stand:

- ich habe ein Batch-Script (Windows) erstellt welches mit 2 Parametern gestartet werden soll
test.cmd parm1 parm2.
- im Script selbst sollen beide Parameter auf Existenz bzw Gültigkeit geprüft werden.
- Prüfung auf Existenz habe ich erfolgreich hinbekommen und setze daraufhin Default-Werte mittels einer Subroutine PARAMCHECK
IF ()==(%*) goto PARAMCHECK
IF ()==(%1) goto PARAMCHECK
IF ()==(%2) goto PARAMCHECK

back-to-topNun zu meinem bisher noch nicht gelösten Problem:

der 2. Parameter (parm2) muss überprüft werden auf Gültigkeit (Wert zwischen 1 und 1000)

Da diese Parameter aus anderen Scripten übergeben ja prinzipiell frei wählbar sind (auch Programmierer machen Fehler face-wink) will ich zumindest in diesem Script eine fehlerhaften Aufruf mit Defaultwerten korrigieren. Dazu bräuchte ich nun eine intelligente Lösung.
Ich wollte mit ürsprünglich mittels numerischer Umwandlung
(SET /a Var2=%2)
und IF-Abfragen
(IF NOT Var2 GEQ 1)
bzw
(IF NOT Var2 LEQ 1000)
arbeiten.
Das würde aber zum Fehlern bei der Verarbeitung führen, wenn Parm2 z.B. alphanumerische Werte hätte (wie: 12XY) oder reine Strings

Deshalb meine Hoffnung auf Euch Experten hier
Wie bekomme ich zusätzlich hin alle andren Werte (Zeichen) aus Parm2 auszuschließen und ebenfalls mit PARAMCHECK zu verarbeiten?

Bin für jede Anregung dankbar

MfG Andreas

Content-ID: 64236

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

Ausgedruckt am: 21.11.2024 um 22:11 Uhr

Biber
Biber 19.07.2007 um 17:39:14 Uhr
Goto Top
Moin AndreasA,

willkommen im Forum.
Ich denke, die handwerklichen Details wirst Du ohnehin lieber selbst ausprobieren.

Als Strategieempfehlung würde ich anraten:

  • die Parameter %1 %2... umzukopieren in %Var1%, %Var2%...
  • aber anders als Du geschrieben hast - ohne "/a" ---> Set "Var1=%1"
  • danach mit Set /a "Var1+=0 eine "numerische" Variable daraus machen.

  • Wenn in Parameter %1 eine 199 drin stand ----> ist %Var1% jetzt 199
  • Wenn in Parameter %1 "Augsburg" stand ----> ist %Var1% jetzt 0

--> Wenn also in %Var1%...%VarN% 0 bei erneuter Orüfung steht, dann war die Eingabe ungültig (entweder der nicht erlaubte Wert 0 oder gar keine Zahl.

Grüße
Biber
AndreasA
AndreasA 19.07.2007 um 17:59:29 Uhr
Goto Top
Hallo Biber,

vielen Dank für deine schnelle und hilfreiche Antwort.
Habe soeben mal deine Vorschläge probiert und es funktioniert soweit :
  • bei Zahlen und bei Strings bzw. alphanumerischen Werten (die mit einem Buchstaben beginnen)
kommen die von Dir beschriebenen Ergebnisse heraus.
  • bei alphanumerischen Werten jedoch die mit Ziffern beginnen z.B. var1 hat den Wert 12xy34 nach Set /a Var1+=0 erhält man für Var1 den Wert 12

Somit könnte ich keine Fehlerprüfung mehr auf "0" machen face-sad

Kann man das auch noch irgendwie ausschließen??

Gruß Andreas
bastla
bastla 19.07.2007 um 18:36:44 Uhr
Goto Top
Hallo AndreasA!

Wie wahrscheinlich ist es denn, dass ein derart "deformierter" Parameter übergeben wird?

Wenn Du "wasserdicht" alles außer den Ziffern ausschließen willst, hätte ich eine (allerdings ohne Verwendung einer Schleife und dadurch weiterhin bedingt von "delayedexpansion") nicht sehr ansehnliche Variante anzubieten:
set "var2=%2"  
set "var2=%var2:0=%"  
if not defined var2 goto :ok
set "var2=%var2:1=%"  
if not defined var2 goto :ok
set "var2=%var2:2=%"  
if not defined var2 goto :ok
set "var2=%var2:3=%"  
if not defined var2 goto :ok
set "var2=%var2:4=%"  
if not defined var2 goto :ok
set "var2=%var2:5=%"  
if not defined var2 goto :ok
set "var2=%var2:6=%"  
if not defined var2 goto :ok
set "var2=%var2:7=%"  
if not defined var2 goto :ok
set "var2=%var2:8=%"  
if not defined var2 goto :ok
set "var2=%var2:9=%"  
if not defined var2 goto :ok

echo Fehler
goto :eof

:ok
set /a var2=%2
Spätestens nach der Ersetzung auch der Ziffer 9 durch "Nichts" dürfte nur mehr ein set "var2=" verbleiben, wodurch die Variable nicht mehr definiert wäre. Hat sie jetzt immer noch einen Inhalt, kann dies keine Ziffer sein.

Solltest Du an anderer Stelle schon sichergestellt haben, dass keine Leerstellen enthalten sind, könntest Du zumindest die Anführungszeichen einsparen.

Grüße
bastla
AndreasA
AndreasA 19.07.2007 um 22:26:23 Uhr
Goto Top
back-to-topProblem erstmal gelöst face-smile

Also Dank eurer Anregungen und eigner Probierereien bin ich nun auf folgende praktikable Lösung gekommen. Ist vielleicht noch nicht optimiert aber immerhin sie funktioniert.

@echo OFF
REM Testscript Aufruf mit 2 übergebenen Parametern %1 und %2
REM
REM test.cmd %1 %2
REM
REM SET DebugMyBatches=1
IF Defined DebugMyBatches ((set ECHO_D=@ECHO) & (set PAUSE_D=pause) ) else ( set ECHO_D=REM)

SET RC_LIST=
SET RC_EVENT=
SET QUELLE=
SET RC_DIR=C:\BATCH

@Biber wie du siehst hab ich mir einiges abgeschaut face-wink

  • erstmal die obligatorische Existenzprüfung......
REM ------ Abfangen der šbergabeparameter----------------------------

IF ""=="%*" goto PARAMCHECK
IF ""=="%1" goto PARAMCHECK
IF ""=="%2" goto PARAMCHECK


  • Setzen von Zwischenvariablen......

%echo_d% "%1" "%2"
SET QUELLE=%1
SET RC_LIST=%RC_DIR%\%QUELLE%.RC
SET RC_EVENT=%2

  • obligatorischer Check ob eine entsprechende Parameterdatei existiert

REM ------ Check ob eine Parameterdatei existiert -----------------------------------------

IF NOT EXIST %RC_LIST% GOTO PARAMCHECK

  • nun der hilfreiche Tip von Biber

REM ------ Check ob Parameter %2 eine Zahl zwischen 1 und 1000 ist -------------------------

SET PARM2=%RC_EVENT%

REM -------- Umwandlung Parm2 zu Zahl ----------------------------------
REM wenn Wert von Parm2 keine "numerische" Zahl ist ergibt SET /a PARM2+=0
REM "0" <-- bei Strings
REM "0" <-- bei Alphanumerischen Werte die mit Buchstaben beginnen
REM "NNN" <-- Alphanumerische Werte die mit Ziffern beginnen werden auf diese Ziffern "NNN" gekürzt

SET /a PARM2+=0

%echo_d% "%RC_EVENT%" und "%PARM2%"
%pause_d%

  • und nun meine Variante der Gültigkeits-Prüfungen

REM --- 1.Check auf "0" (alle buchstabigen Werte und die "0" selbst werden eliminiert)
REM --- 2.Check Vergleich Wert<-->String (alphanumerische Werte mit Zahlen werden eliminiert)
REM --- 3.Check ob grӇer 1 (alle negativen Werte werden auch eliminiert)
REM --- 4.Check ob kleiner 1000 (alle grӇeren werden eliminiert)

IF %PARM2% EQU 0 ((%echo_d% %parm2%) & goto PARAMCHECK)
IF NOT "%PARM2%"=="%RC_EVENT%" ((%echo_d% %parm2%) & goto PARAMCHECK)
IF %PARM2% LSS 1 ((%echo_d% %parm2%) & GOTO PARAMCHECK)
IF %PARM2% GTR 1000 ((%echo_d% %parm2%) & GOTO PARAMCHECK)

REM ------ Ende Check ----------------------------------------------------------------------

Ab hier dürften nur noch gültige Werte für %parm2% existieren, sonst wär ja eine der obigen Bedingungen erfüllt gewesen.
Meine Tests ergaben für folgende Parameter-Varainaten jedenfalls immer das richtige Ergebnis *puuhh*

  1. keine Parameter bzw. fehlender Parameter2
  2. Parameterdatei %RC_LIST% existiert nicht
  3. %2 ist String z.B. abcd
  4. %2 ist alphanumerisch der Form xy12Ta
  5. %2 ist alphanumerisch der Form 23xy80
  6. %2 ist alpahnumerisch der Form -123x
  7. %2 ist alphanumerisch mit Sonderzeichen $234
  8. %2 ist 0
  9. %2 ist negativ -1234
  10. %2 ist größer 1000

Falls noch jemand ne andre Variante kennt, kann er dieses Beispiel Script gerne mal ausprobieren und auf Fehler checken.

  • und noch der Rest des Scriptes zum allgemeinen Verständnis
:main

REM Hauptroutine
REM Ermitlung weiterer Parameter aus %RC_LIST% wenn vorhanden
REM mit Anweisungen a la prog %Quelle% %RC_EVENT% var3 var4 var5...varx

goto ende

:PARAMCHECK

REM Subroutine zum Setzen von Default-Werten für %QUELLE% %RC_EVENT% var3 bis varx

goto main

:ende

Da ich auch gerne optimiere bzw versuche Scripte zu standardisieren, bin ich für jede Anregung dieses noch eleganter zu lösen dankbar.
Für die Umlaute in den Textblöcken bitte ich um Nachsicht. Dieses Script wurde ja mit DOS-Editor (edit.com) für die CMD geschrieben und nicht mit Notepad für Windows.

@bastla die Wahrscheinlichkeit (fehlerhafter Parameter) sollte eigentlich sehr gering sein, aber meine Berufserfahrung und die Kenntnis von "Murphy's Gesetzen" veranlassen mich zu solchen "DAU-Verhinderungs"-Maßnahmen face-wink

Wünsche noch nen gemütlichen Feierabend face-wink

Gruß Andreas
Biber
Biber 19.07.2007 um 23:58:10 Uhr
Goto Top
Moin AndreasA,

danke für diese musterhafte Lösung.

Nur eine OffTopic-Anmerkung dazu:
>..Dieses Script wurde ja mit DOS-Editor (edit.com) für die CMD geschrieben ..

Na ja, soooo nostalgisch/selbstquälerisch musst Du auch nicht sein...
Mit den handelsüblichen Top-Rated-Shareware-Programmers-Editoren wie TextPad, NotePad+ und UltraEdit hast Du auch für Batches oder CmdLets Code-Formatierung, Syntax-Highlightning und vor allem die Möglichkeit, eine Plain-Text-Datei im ANSI/ASCII/DOS/UNIX/Mac-Format zu speichern.

Ich weiß zwar nicht, ob man/frau die edit.com einfach herunterlöschen darf vom Rechner, aber meistens ist das doch eine der ersten Handlungen bei Rechner-Inbetriebnahme...face-wink

Grüße
Biber