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
GELÖST

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

Frage Entwicklung Batch & Shell

Mitglied: AndreasA

AndreasA (Level 1) - Jetzt verbinden

19.07.2007, aktualisiert 23:58 Uhr, 18225 Aufrufe, 5 Kommentare

Hallo 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

Also 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

Nun 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 ) 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

Mit freundlichen Grüßen Andreas
Mitglied: Biber
19.07.2007 um 17:39 Uhr
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
Bitte warten ..
Mitglied: AndreasA
19.07.2007 um 17:59 Uhr
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

Kann man das auch noch irgendwie ausschließen??

Gruß Andreas
Bitte warten ..
Mitglied: bastla
19.07.2007 um 18:36 Uhr
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:
01.
set "var2=%2" 
02.
set "var2=%var2:0=%" 
03.
if not defined var2 goto :ok 
04.
set "var2=%var2:1=%" 
05.
if not defined var2 goto :ok 
06.
set "var2=%var2:2=%" 
07.
if not defined var2 goto :ok 
08.
set "var2=%var2:3=%" 
09.
if not defined var2 goto :ok 
10.
set "var2=%var2:4=%" 
11.
if not defined var2 goto :ok 
12.
set "var2=%var2:5=%" 
13.
if not defined var2 goto :ok 
14.
set "var2=%var2:6=%" 
15.
if not defined var2 goto :ok 
16.
set "var2=%var2:7=%" 
17.
if not defined var2 goto :ok 
18.
set "var2=%var2:8=%" 
19.
if not defined var2 goto :ok 
20.
set "var2=%var2:9=%" 
21.
if not defined var2 goto :ok 
22.
 
23.
echo Fehler 
24.
goto :eof 
25.
 
26.
:ok 
27.
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
Bitte warten ..
Mitglied: AndreasA
19.07.2007 um 22:26 Uhr
Problem erstmal gelöst

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

  • 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

Wünsche noch nen gemütlichen Feierabend

Gruß Andreas
Bitte warten ..
Mitglied: Biber
19.07.2007 um 23:58 Uhr
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...

Grüße
Biber
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...