Auswertung bzw. Verwendung von Übergabeparametern.
Problem:
Auswertung von Übergabeparametern.
(OS = Windows XP)
Ein Programm benötigt beim Start einige Parameter, die mit Hilfe eine Batch auf Vorhandensein und Gültigkeit geprüft werden müssen.
Ein Programm benötigt beim Start einige Parameter, die mit Hilfe eine Batch auf Vorhandensein und Gültigkeit geprüft werden müssen.
MeineProgramm.exe -Parameter1 -Parameter2 -OptionalerParameter3
Werte der Parameter:
Parameter1: AUTO oder BUS oder ZUG -> Parametergruppe: Fahrzeug
Parameter2: BLOND oder ROTHAARIG -> Parametergruppe: Haarfarbe
OptionalerParameter3: ASSISTENTIN -> Opt. Parameter: Biber's Wunsch
Jeder Parameter kann/darf nur einen Wert haben, die Parameter 1 und 2 müssen gefüllt sein, der Parameter 3 ist optional.
Gültige Aufrufe wären:
MeinProgramm.exe -AUTO -ROTHAARIG -ASSISTENTIN
MeinProgramm.exe -BUS -BLOND
MeinProgramm.exe -ZUG -BLOND -ASSISTENTIN
. . .
Ungültige Aufrufe wären:
MeinProgramm.exe -AUTO -BUS -ASSISTENTIN
MeinProgramm.exe -ZUG -BLOND -ROTHAARIG
MeinProgramm.exe -BLOND -ROTHAARIG -ASSISTENTIN
Die zu erstellende Batch soll verhindern, dass ungültige Parameter beim Aufruf der EXE verwendet werden, es sollen daher
Allerdings wird ein einzelnes Minus jetzt auch als Parameter gewertet und bringt ein positives Ergebnis:
Dies kann man verhindern, in dem man in der for-Schleife die If-Abfrage folgendermaßen anpasst:
Danach erscheint dann die folgende Ausgabe:
A: Ist jede Gruppe in der Parameterliste vertreten?
B: Ist aus jeder Gruppe maximal ein Vertreter vorhanden?
Hinzufügen der folgenden Zeilen setzt jeweils einen Zähler hoch
Jetzt sind zwar alle Anzahlen bestimmt und das Vorhandensein verifiziert, allerdings welche gültigen Werte eingegeben wurden ist noch nicht bekannt.
Durch Einfügen jeweils einer weiteren Zeile in der obigen If-Abfrage wird das dann auch gelöst:
Doch da war noch was, der optionale dritte Parameter...
Tja, eigentlich wollte ich ja eine Frage stellen, nun, so wie es aussieht, funktioniert es jetzt, aber es gibt sicherlich noch etwas Optimierungspotential...
mfg
Axel
Auswertung von Übergabeparametern.
(OS = Windows XP)
Ein Programm benötigt beim Start einige Parameter, die mit Hilfe eine Batch auf Vorhandensein und Gültigkeit geprüft werden müssen.
Auswertung bzw. Verwendung von Übergabeparametern. (OS = Windows XP)
Ein Programm benötigt beim Start einige Parameter, die mit Hilfe eine Batch auf Vorhandensein und Gültigkeit geprüft werden müssen.
MeineProgramm.exe -Parameter1 -Parameter2 -OptionalerParameter3
Werte der Parameter:
Parameter1: AUTO oder BUS oder ZUG -> Parametergruppe: Fahrzeug
Parameter2: BLOND oder ROTHAARIG -> Parametergruppe: Haarfarbe
OptionalerParameter3: ASSISTENTIN -> Opt. Parameter: Biber's Wunsch
Jeder Parameter kann/darf nur einen Wert haben, die Parameter 1 und 2 müssen gefüllt sein, der Parameter 3 ist optional.
Gültige Aufrufe wären:
MeinProgramm.exe -AUTO -ROTHAARIG -ASSISTENTIN
MeinProgramm.exe -BUS -BLOND
MeinProgramm.exe -ZUG -BLOND -ASSISTENTIN
. . .
Ungültige Aufrufe wären:
MeinProgramm.exe -AUTO -BUS -ASSISTENTIN
MeinProgramm.exe -ZUG -BLOND -ROTHAARIG
MeinProgramm.exe -BLOND -ROTHAARIG -ASSISTENTIN
Aufgabe
Die zu erstellende Batch soll verhindern, dass ungültige Parameter beim Aufruf der EXE verwendet werden, es sollen daher
- auch vergessene Minuszeichen "-" erkannt werden
- die Reihenfolge der angegebenen Parameter soll so sortiert werden, dass sie für die EXE gültig sind, z. B.:
- StartMeinProgramm.cmd -BLOND -ASSISTENTIN -ZUG -> führt zu dem Aufruf der EXE: MeinProgramm.exe -ZUG -BLOND -ASSISTENTIN
- StartMeinProgramm.cmd -ROTHAARIG -AUTO -> führt zu dem Aufruf der EXE: MeinProgramm.exe -AUTO -ROTHAARIG
- die Anzahl der Parameter geprüft werden, da mehr als drei Parameter falsch sind
- jeder Parameter höchstens einmal vorkommen
- die ersten beiden Parameter müssen gefüllt sein
Erster Schritt: Ermittlung der Parameteranzahl
@echo off & setlocal enabledelayedexpansion
set /a mycount=0
rem Get the number of parameters
@for %%a in (%*) do (
set /a mycount=!mycount! + 1
)
echo Number of Parameters: %mycount%
if [%mycount%] GTR [3] GOTO :COUNTERR
GOTO :END
:COUNTERR
Echo Too many parameters ...
GOTO :END
:END
Zweiter Schritt: Prüfen, ob vor jedem Parameter auch ein Minus sitzt.
@echo off & setlocal enabledelayedexpansion
set /a mycount=0
set /a myminuscount=0
rem Get the number of parameters
@for %%a in (%*) do (
set /a mycount=!mycount! + 1
set minuscheck=%%a
if ["!minuscheck:~0,1!"] == ["-"] set /a myminuscount=!myminuscount! + 1
)
echo Number of Parameters: %mycount%
echo Number of Minus: %myminuscount%
if [%mycount%] GTR [3] GOTO :COUNTERR
if [%myminuscount%] NEQ [%mycount%] GOTO :MINUSERR
goto :END
:COUNTERR
Echo Too many parameters ...
GOTO :END
:MINUSERR
Echo Forgotton Minus "-" ...
GOTO :END
:END
Allerdings wird ein einzelnes Minus jetzt auch als Parameter gewertet und bringt ein positives Ergebnis:
StartMeinProgramm.cmd -ROTHAARIG -AUTO -
Number of Parameters: 3
Number of Minus: 3
Dies kann man verhindern, in dem man in der for-Schleife die If-Abfrage folgendermaßen anpasst:
if ["!minuscheck:~0,1!"] == ["-"] (
if not ["!minuscheck:~1,2!"] == [""] set /a myminuscount=!myminuscount! + 1)
Danach erscheint dann die folgende Ausgabe:
StartMeinProgramm.cmd -ROTHAARIG -AUTO -
Number of Parameters: 3
Number of Minus: 2
Forgotton Minus "-" ...
Dritter Schritt: Prüfen, ob für jeden der ersten beiden Parameter auch nur ein Wert gesetzt wurde.
A: Ist jede Gruppe in der Parameterliste vertreten?
B: Ist aus jeder Gruppe maximal ein Vertreter vorhanden?
Hinzufügen der folgenden Zeilen setzt jeweils einen Zähler hoch
set "FAHRZEUGE=AUTO BUS ZUG"
set "HAARFARBE=BLOND ROTHAARIG"
set "OPTIONAL=ASSISTENTIN"
set /a FAHRZEUGE_Count=0
set /a HAARFARBE_Count=0
...
for %%i in (%FAHRZEUGE%) do (
for %%m in (%*) do (
rem To compare the string, add the minus as first letter for %%i
if /i "-%%i"=="%%m" (set /a FAHRZEUGE_Count=!FAHRZEUGE_Count! + 1)
)
)
for %%i in (%HAARFARBE%) do (
for %%m in (%*) do (
rem To compare the string, add the minus as first letter for %%i
echo m: %%m; i: %%i
if /i "-%%i"=="%%m" (set /a HAARFARBE_Count=!HAARFARBE_Count! + 1)
)
)
if %FAHRZEUGE_Count% LSS 1 (set msg=No parameter for Fahrzeuge & GOTO :PARAMCOUNTERR)
if %HAARFARBE_Count% LSS 1 (set msg=No parameter for Haarfarbe & GOTO :PARAMCOUNTERR)
if %FAHRZEUGE_Count% GTR 1 (set msg=To many parameters for Fahrzeuge & GOTO :PARAMCOUNTERR)
if %HAARFARBE_Count% GTR 1 (set msg=To many parameters for Haarfarbe & GOTO :PARAMCOUNTERR)
...
:PARAMCOUNTERR
ECHO %msg%
GOTO :END
Jetzt sind zwar alle Anzahlen bestimmt und das Vorhandensein verifiziert, allerdings welche gültigen Werte eingegeben wurden ist noch nicht bekannt.
Durch Einfügen jeweils einer weiteren Zeile in der obigen If-Abfrage wird das dann auch gelöst:
...
if /i "-%%i"=="%%m" (
set /a FAHRZEUGE_Count=!FAHRZEUGE_Count! + 1
set parmFahrzeug=%%m)
...
if /i "-%%i"=="%%m" (
set /a HAARFARBE_Count=!HAARFARBE_Count! + 1
set parmHaarfarbe=%%m)
...
echo Fahrzeug: %parmFahrzeug%; Haarfarbe: %parmHaarfarbe%
Doch da war noch was, der optionale dritte Parameter...
for %%m in (%*) do (
rem To compare the string, add the minus as first letter for %%i
if /i "-%OPTIONAL%"=="%%m" (set parmOptional=%%m)
)
echo Fahrzeug: %parmFahrzeug%; Haarfarbe: %parmHaarfarbe%; Optional: %parmOptional%
Vierter Schritt: Zusammenfügen der Kommandozeile.
start /wait MeinProgramm.exe %parmFahrzeug% %parmFahrzeug% %parmOptional%
Tja, eigentlich wollte ich ja eine Frage stellen, nun, so wie es aussieht, funktioniert es jetzt, aber es gibt sicherlich noch etwas Optimierungspotential...
mfg
Axel
Der vollständige Code:
@echo off & setlocal enabledelayedexpansion
set /a mycount=0
set /a myminuscount=0
set msg=
set "FAHRZEUGE=AUTO BUS ZUG"
set "HAARFARBE=BLOND ROTHAARIG"
set "OPTIONAL=ASSISTENTIN"
set /a FAHRZEUGE_Count=0
set /a HAARFARBE_Count=0
rem Get the number of parameters
for %%a in (%*) do (
set /a mycount=!mycount! + 1
set minuscheck=%%a
if ["!minuscheck:~0,1!"] == ["-"] (
if not ["!minuscheck:~1,2!"] == [""] set /a myminuscount=!myminuscount! + 1)
)
echo Number of Parameters: %mycount%
echo Number of Minus: %myminuscount%
if [%mycount%] GTR [3] GOTO :COUNTERR
if [%myminuscount%] NEQ [%mycount%] GOTO :MINUSERR
for %%i in (%FAHRZEUGE%) do (
for %%m in (%*) do (
rem To compare the string, add the minus as first letter for %%i
if /i "-%%i"=="%%m" (
set /a FAHRZEUGE_Count=!FAHRZEUGE_Count! + 1
set parmFahrzeug=%%m)
)
)
for %%i in (%HAARFARBE%) do (
for %%m in (%*) do (
rem To compare the string, add the minus as first letter for %%i
if /i "-%%i"=="%%m" (
set /a HAARFARBE_Count=!HAARFARBE_Count! + 1
set parmHaarfarbe=%%m)
)
)
if %FAHRZEUGE_Count% LSS 1 (set msg=No parameter for Fahrzeuge & GOTO :PARAMCOUNTERR)
if %HAARFARBE_Count% LSS 1 (set msg=No parameter for Haarfarbe & GOTO :PARAMCOUNTERR)
if %FAHRZEUGE_Count% GTR 1 (set msg=To many parameters for Fahrzeuge & GOTO :PARAMCOUNTERR)
if %HAARFARBE_Count% GTR 1 (set msg=To many parameters for Haarfarbe & GOTO :PARAMCOUNTERR)
for %%m in (%*) do (
rem To compare the string, add the minus as first letter for %%i
if /i "-%OPTIONAL%"=="%%m" (set parmOptional=%%m)
)
echo Fahrzeug: %parmFahrzeug%; Haarfarbe: %parmHaarfarbe%; Optional: %parmOptional%
GOTO :END
:COUNTERR
Echo Too many parameters ...
GOTO :END
:MINUSERR
Echo Forgotton Minus "-" ...
GOTO :END
:PARAMCOUNTERR
ECHO %msg%
GOTO :END
:END
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 105396
Url: https://administrator.de/contentid/105396
Ausgedruckt am: 25.11.2024 um 05:11 Uhr
5 Kommentare
Neuester Kommentar
Hallo ahe!
Hab' zwar nur kurz drübergeschaut - sieht aber für mich sehr gut aus ...
2 Kleinigkeiten:
- Falls die Varaiable %allparameters% überhaupt benötigt wird, sollte als Ersatz der Zeilen 27 und 28
genügen.
- Ich tendiere eher zur Schreibweise
erspart - zumindest dafür - die "delayedExpansion", ist hier aber eher Geschmackssache.
Grüße
bastla
Hab' zwar nur kurz drübergeschaut - sieht aber für mich sehr gut aus ...
2 Kleinigkeiten:
- Falls die Varaiable %allparameters% überhaupt benötigt wird, sollte als Ersatz der Zeilen 27 und 28
set "allparameters=%*"
- Ich tendiere eher zur Schreibweise
set /a mycount+=1
Grüße
bastla
Moin ahe,
also hömma - Du kannst Doch hier nicht einfach ein Tutorial als normalen Beitrag ins Forum stellen.
Ich habe es für Dich mal umgestuft von "Beitrag" auf "Anleitung".
Heute morgen habe ich in einem anderen Beitrag ein Negativ-Beispiel für unleserlichen, unwartbaren und nicht nachvollziehbaren Code angemeckert.
Nun möchte nun auch das Lob für einen sauber hergeleiteten Skriptschnipsel nicht unter den Tisch falllen lassen..
Vielen Dank für Deine Mühe und Sorgfalt
Biber
also hömma - Du kannst Doch hier nicht einfach ein Tutorial als normalen Beitrag ins Forum stellen.
Ich habe es für Dich mal umgestuft von "Beitrag" auf "Anleitung".
Heute morgen habe ich in einem anderen Beitrag ein Negativ-Beispiel für unleserlichen, unwartbaren und nicht nachvollziehbaren Code angemeckert.
Nun möchte nun auch das Lob für einen sauber hergeleiteten Skriptschnipsel nicht unter den Tisch falllen lassen..
Vielen Dank für Deine Mühe und Sorgfalt
Biber
@Biber
Grüße
bastla
also hömma - Du kannst Doch hier nicht einfach ein Tutorial als normalen Beitrag ins Forum stellen.
Annähernd so hatte ich es auch schon in meinem obigen Kommentar formuliert, mir aber dann gedacht: "Das ist Chefsache." und den Teil wieder rausgeschmissen ...Grüße
bastla