Top-Themen

Aktuelle Themen (A bis Z)

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

Auswertung bzw. Verwendung von Übergabeparametern.

Mitglied: ahe

ahe (Level 1) - Jetzt verbinden

07.01.2009, aktualisiert 16:01 Uhr, 9098 Aufrufe, 5 Kommentare

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.

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


01.
@echo off & setlocal enabledelayedexpansion 
02.
set /a mycount=0 
03.
 
04.
rem Get the number of parameters 
05.
@for %%a in (%*) do ( 
06.
	set /a mycount=!mycount! + 1 
07.
08.
echo Number of Parameters: %mycount% 
09.
 
10.
if [%mycount%] GTR [3] GOTO :COUNTERR 
11.
 
12.
GOTO :END 
13.
 
14.
:COUNTERR 
15.
Echo Too many parameters ... 
16.
GOTO :END 
17.
 
18.
:END

Zweiter Schritt: Prüfen, ob vor jedem Parameter auch ein Minus sitzt.


01.
@echo off & setlocal enabledelayedexpansion 
02.
set /a mycount=0 
03.
set /a myminuscount=0 
04.
 
05.
rem Get the number of parameters 
06.
@for %%a in (%*) do ( 
07.
	set /a mycount=!mycount! + 1 
08.
	set minuscheck=%%a 
09.
	if ["!minuscheck:~0,1!"] == ["-"] set /a myminuscount=!myminuscount! + 1 
10.
11.
echo Number of Parameters: %mycount% 
12.
echo Number of Minus: %myminuscount% 
13.
 
14.
 
15.
if [%mycount%] GTR [3] GOTO :COUNTERR 
16.
if [%myminuscount%] NEQ [%mycount%] GOTO :MINUSERR 
17.
goto :END 
18.
 
19.
:COUNTERR 
20.
Echo Too many parameters ... 
21.
GOTO :END 
22.
 
23.
:MINUSERR 
24.
Echo Forgotton Minus "-" ... 
25.
GOTO :END 
26.
 
27.
:END
Allerdings wird ein einzelnes Minus jetzt auch als Parameter gewertet und bringt ein positives Ergebnis:
01.
StartMeinProgramm.cmd -ROTHAARIG -AUTO - 
02.
 
03.
Number of Parameters: 3 
04.
Number of Minus: 3
Dies kann man verhindern, in dem man in der for-Schleife die If-Abfrage folgendermaßen anpasst:
01.
	if ["!minuscheck:~0,1!"] == ["-"] ( 
02.
		if not ["!minuscheck:~1,2!"] == [""] set /a myminuscount=!myminuscount! + 1)
Danach erscheint dann die folgende Ausgabe:
01.
StartMeinProgramm.cmd -ROTHAARIG -AUTO - 
02.
 
03.
Number of Parameters: 3 
04.
Number of Minus: 2 
05.
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
01.
set "FAHRZEUGE=AUTO BUS ZUG" 
02.
set "HAARFARBE=BLOND ROTHAARIG" 
03.
set "OPTIONAL=ASSISTENTIN" 
04.
 
05.
set /a FAHRZEUGE_Count=0 
06.
set /a HAARFARBE_Count=0 
07.
... 
08.
for %%i in (%FAHRZEUGE%) do ( 
09.
	for %%m in (%*) do ( 
10.
		rem To compare the string, add the minus as first letter for %%i 
11.
		if /i "-%%i"=="%%m" (set /a FAHRZEUGE_Count=!FAHRZEUGE_Count! + 1) 
12.
13.
14.
for %%i in (%HAARFARBE%) do ( 
15.
	for %%m in (%*) do ( 
16.
		rem To compare the string, add the minus as first letter for %%i 
17.
		echo m: %%m; i: %%i 
18.
		if /i "-%%i"=="%%m" (set /a HAARFARBE_Count=!HAARFARBE_Count! + 1) 
19.
20.
21.
if %FAHRZEUGE_Count% LSS 1 (set msg=No parameter for Fahrzeuge & GOTO :PARAMCOUNTERR)  
22.
if %HAARFARBE_Count% LSS 1 (set msg=No parameter for Haarfarbe & GOTO :PARAMCOUNTERR) 
23.
if %FAHRZEUGE_Count% GTR 1 (set msg=To many parameters for Fahrzeuge & GOTO :PARAMCOUNTERR)  
24.
if %HAARFARBE_Count% GTR 1 (set msg=To many parameters for Haarfarbe & GOTO :PARAMCOUNTERR) 
25.
... 
26.
:PARAMCOUNTERR 
27.
ECHO %msg% 
28.
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:
01.
... 
02.
		if /i "-%%i"=="%%m" ( 
03.
			set /a FAHRZEUGE_Count=!FAHRZEUGE_Count! + 1 
04.
			set parmFahrzeug=%%m) 
05.
... 
06.
		if /i "-%%i"=="%%m" ( 
07.
			set /a HAARFARBE_Count=!HAARFARBE_Count! + 1 
08.
			set parmHaarfarbe=%%m) 
09.
... 
10.
echo Fahrzeug: %parmFahrzeug%; Haarfarbe: %parmHaarfarbe%
Doch da war noch was, der optionale dritte Parameter...
01.
for %%m in (%*) do ( 
02.
	rem To compare the string, add the minus as first letter for %%i 
03.
	if /i "-%OPTIONAL%"=="%%m" (set parmOptional=%%m) 
04.
05.
echo Fahrzeug: %parmFahrzeug%; Haarfarbe: %parmHaarfarbe%; Optional: %parmOptional%

Vierter Schritt: Zusammenfügen der Kommandozeile.


01.
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:

01.
@echo off & setlocal enabledelayedexpansion 
02.
set /a mycount=0 
03.
set /a myminuscount=0 
04.
set msg= 
05.
 
06.
set "FAHRZEUGE=AUTO BUS ZUG" 
07.
set "HAARFARBE=BLOND ROTHAARIG" 
08.
set "OPTIONAL=ASSISTENTIN" 
09.
 
10.
set /a FAHRZEUGE_Count=0 
11.
set /a HAARFARBE_Count=0 
12.
 
13.
rem Get the number of parameters 
14.
for %%a in (%*) do ( 
15.
	set /a mycount=!mycount! + 1 
16.
	set minuscheck=%%a 
17.
	if ["!minuscheck:~0,1!"] == ["-"] ( 
18.
		if not ["!minuscheck:~1,2!"] == [""] set /a myminuscount=!myminuscount! + 1) 
19.
20.
echo Number of Parameters: %mycount% 
21.
echo Number of Minus: %myminuscount% 
22.
 
23.
if [%mycount%] GTR [3] GOTO :COUNTERR 
24.
if [%myminuscount%] NEQ [%mycount%] GOTO :MINUSERR 
25.
 
26.
for %%i in (%FAHRZEUGE%) do ( 
27.
	for %%m in (%*) do ( 
28.
		rem To compare the string, add the minus as first letter for %%i 
29.
		if /i "-%%i"=="%%m" ( 
30.
			set /a FAHRZEUGE_Count=!FAHRZEUGE_Count! + 1 
31.
			set parmFahrzeug=%%m) 
32.
33.
34.
for %%i in (%HAARFARBE%) do ( 
35.
	for %%m in (%*) do ( 
36.
		rem To compare the string, add the minus as first letter for %%i 
37.
		if /i "-%%i"=="%%m" ( 
38.
			set /a HAARFARBE_Count=!HAARFARBE_Count! + 1 
39.
			set parmHaarfarbe=%%m) 
40.
41.
42.
 
43.
if %FAHRZEUGE_Count% LSS 1 (set msg=No parameter for Fahrzeuge & GOTO :PARAMCOUNTERR)  
44.
if %HAARFARBE_Count% LSS 1 (set msg=No parameter for Haarfarbe & GOTO :PARAMCOUNTERR) 
45.
if %FAHRZEUGE_Count% GTR 1 (set msg=To many parameters for Fahrzeuge & GOTO :PARAMCOUNTERR)  
46.
if %HAARFARBE_Count% GTR 1 (set msg=To many parameters for Haarfarbe & GOTO :PARAMCOUNTERR) 
47.
 
48.
for %%m in (%*) do ( 
49.
	rem To compare the string, add the minus as first letter for %%i 
50.
	if /i "-%OPTIONAL%"=="%%m" (set parmOptional=%%m) 
51.
52.
 
53.
echo Fahrzeug: %parmFahrzeug%; Haarfarbe: %parmHaarfarbe%; Optional: %parmOptional% 
54.
GOTO :END 
55.
 
56.
:COUNTERR 
57.
Echo Too many parameters ... 
58.
GOTO :END 
59.
 
60.
:MINUSERR 
61.
Echo Forgotton Minus "-" ... 
62.
GOTO :END 
63.
 
64.
:PARAMCOUNTERR 
65.
ECHO %msg% 
66.
GOTO :END 
67.
 
68.
:END
Mitglied: bastla
07.01.2009 um 15:12 Uhr
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
set "allparameters=%*"
genügen.

- Ich tendiere eher zur Schreibweise
set /a mycount+=1
erspart - zumindest dafür - die "delayedExpansion", ist hier aber eher Geschmackssache.

Grüße
bastla
Bitte warten ..
Mitglied: ahe
07.01.2009 um 15:26 Uhr
Hallo bastla,

"allparameters" wird tatsächlich nicht gebraucht, war beim Entstehen wichtig, doch dann nicht mehr... (ist oben jetzt gelöscht!)

Nun die kurze Schreibweise des Hochzählens kam mir dann auch später in den Sinn, nur hatte ich es da bereits geschrieben...

mfg
Axel
Bitte warten ..
Mitglied: Biber
07.01.2009 um 16:13 Uhr
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
Bitte warten ..
Mitglied: ahe
07.01.2009 um 16:19 Uhr
Danke für die Blumen,

nachdem ich meine erste, nicht funktionierende Version hatte und nicht mehr durchblickte, habe ich mir erst einmal aufgeschrieben, was ich machen wollte und so ergab sich das Ganze fast von selbst. Außerdem habe ich dabei auch an Dich gedacht (s. a. der optionale Parameter...)

mfg
Axel
Bitte warten ..
Mitglied: bastla
07.01.2009 um 17:02 Uhr
@Biber
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
Bitte warten ..
Neue Wissensbeiträge
Multimedia & Zubehör
AVM Fritz USB WLAN Sticks schneller einschalten
Tipp von NetzwerkDude vor 4 StundenMultimedia & Zubehör

Die AVM Fritz WLAN Sticks haben in der Firmware 2 Modis: Einmal als Massenspeicher und einmal als WLAN Netzwerkkarte ...

Windows Server

Windows Server Backup schlögt Fehl -Lösung 2008-2016

Tipp von BiGnoob vor 7 StundenWindows Server

Hi zusammen , ich möchte gerne einen Lösungstipp abgeben für folgenden fehler: lösung ist folgende:

Humor (lol)
Telekom vs. O2 - 3:2
Erfahrungsbericht von the-buccaneer vor 20 StundenHumor (lol)3 Kommentare

Unglaublich aber wahr: Nachdem mein privater Anschluss am 19.04.18 auf VOIP und VDSL umgestellt wurde, hatte ich seitdem 1,5 ...

Batch & Shell

Windows 10 Heimnetzgruppe abgeschaft. Ein Script für einfache Netzwerk - Freigabe im Heimnetzwerk

Anleitung von treehe vor 22 StundenBatch & Shell3 Kommentare

Anleitung für eine einfache Netzwerkfreigabe unter Windows 10 Wie weiter hab mal ein kleines CMD - Script gebastelt. Womit ...

Heiß diskutierte Inhalte
Netzwerke
IP-Adresse am zweiten Domänencontroller fest vergeben - Server verschwunden
gelöst Frage von DanielG1974Netzwerke23 Kommentare

Ich hab ein Problem, was ich bisher noch nicht erlebt habe Ich habe erfolgreich einen zweiten Server mit ActiveDirectory ...

Windows Server
Windows Server 2012 - Update - Beim Booten bleibt der Server beim Windows Zeichen stehen
Frage von KeilbachWindows Server15 Kommentare

Hallo Zusammen, ich grüße euch, mein Name ist Michele. Ich bin hier ganz Neu - da ich einfach nicht ...

Windows Tools
Virtueller Drucker gesucht (Schnittstelle: USB oder Seriell)
Frage von chrisButterflyWindows Tools14 Kommentare

Hi, ich suche einen virtuellen Drucker, den ich über eine USB oder serieller Schnittstelle ansprechen kann. Dieser Drucker soll ...

Firewall
Sophos SG 125 nicht mehr erreichbar
Frage von GwaihirFirewall14 Kommentare

Hallo zusammen, ausgerechnet über die Feiertage stimmt etwas mit meiner Firmen-Firewall nicht. Es ist eine Sophos SG 125 und ...