Frage deutsch
~~~~~~~~~~~~~
Wie kann ich Parameter an ein QuickBasic-Programm beim Aufruf übergeben?
 

Question English
~~~~~~~~~~~~~~
How do I transfer and evaluate runtime parameters from the command line?
 

Antwort 1
~~~~~~~~~
[ von Thomas Antoni, 11.1999 - 12.3.2006 ]
.
Ein compiliertes QuickBasic-Programm kann die übergebenen Aufrufparameter mit der Funktion COMMAND$ abfragen. Dies ist nur bei kompilierten QuickBASIC-, nicht bei QBasic-Programmen möglich.

COMMAND$ liefert den Text der Aufrufzeile, mit der das EXE-Programm aufgerufen wurde, als Textstring zurück. Lautet der Aufruf z.B. "programm.exe datei.txt" , dann gibt COMMAND$ den String "DATEI.TXT" zurück. Beachte, dass QuickBASIC alle übergeben Zeichen automatisch in Großbuchstaben umwandelt
 
Wenn es sich um mehr als einen Übergabeparameter handelt , dann ist es eine etwas fummelige Arbeit, die einzelnen Parmeter aus dem COMMAND$-String zu "isolieren". Zum Glück gibt es aber in der Unterprogrammsammlung QSUBFUN.BAS für diesen Zweck die SUBroutine
GetArguments, die genau das übernimmt. Oder Du orientierst Dich an dem unten stehenden Programm COMMANDP.BAS.
 
Diese sehr nüzliche Unterprogrammsammlung steht auf
http://www.qbasic.de unter "Download -> Sonstiges -> QSUBFUN.ZIP" zum Herunterladen bereit.
 
Während Du programmierst, kannst du in der QB-Entwicklungsumgebung zu Testzwecken auch über den Menüpunkt
"Ausführen | Ändere Command$"
 
den Übergabe-Parameter ändern und im Interpreter-Modus verwenden. Oder Du rufts die QB-Entwicklungsumgebung QB.exe (bzw. bei QB 7.1 QBX.EXE) auf der Kommandozeile mit der Option
QB.EXE /CMD <Parameter-Zeichenkette>
 
auf und übergibst in der "Parameter-Zeichenkette" den COMMAND$-String. Diese Option muß die letzte Option in der Kommandozeile sein.
 
*** Kommadozeilen-Parser COMMANDP.BAS
Und nun zu dem angekündigten Programm COMMANDP.BAS, das den durch die COMMAND$-Funktion übergebenen String auswertet ("parst" , siehe -> Parser ) und in ein Sring-Feld einträgt. Dieses Programm kann eine Hilfe sein, wenn mehr als ein Parameter übergeben wird.
 
 
'***************************************************************************
' COMMANDP.BAS = COMMAND LINE PARSER, delivers the COMMAND$ line elements
' ============ Liefert die einzelnen Parameter der COMMAND$-Kommandozeile
'
' Deutsche Beschreibung
' ----------------------
' (von Thomas Antoni, 12.3.2006)
' Dieser "Kommandozeilen-Parser" für QuickBASIC analysiert den durch die
' COMMAND$-Funktion gelieferten Kommandozeilen-String. Die Funktion
' DimParse liefert die Anzahl der mit dem EXE-Programm uebergebenen
' Kommandozeilenparameter. Die Funktion Parse liefert den Inhalt des
' i-ten Parameters, wobei i als Parameter an die Funktion uebergeben wird.
' Als Trennzeichen zwischen den einzelnen Parameter wird nur ein
' Leerzeichen anerkannt. Sollen mhrere Leerzeichen oder andere
' Trennzeichen erlaubt sein, dann kannst Du das Program leicht
' entsprechend anpassen.
'
' English Description
' ----------------------
' QUESTION: Hi, I was wondering if anyone had a good (or halfway
' decent) routine or sub for dissecting the COMMAND$ returned by
' QuickBasic 4.5. I am looking for something that will find two
' filenames and a few flags.
'
' ANSWER: Here you go....
' The DimParse function returns the number of elements in the string, (to
' DIM an array or whatever) the Parse function returns the individual
' parts of the given COMAND$ string, one part per call, until the end of
' the string is entered, then starts over. It works fast and easy. Because
' of my personal preference only a space is recognized as the separation
' between elements. Feel free to change that if you wish, should be easy.
'
' (c) July 24, 1993
'***************************************************************************
DECLARE FUNCTION Parse$ (In$)
DECLARE FUNCTION DimParse% (In$)
'Parse and DimParse functions by Andy Thomas
'
DEFINT A-Z
'
CLS
A$ = "Hello this is a test /d /a" 'test string
PRINT "Teststring: A$ = "; A$
PRINT
PRINT "Elements in A$ = "; DimParse%(A$)
FOR I = 1 TO DimParse%(A$)
PRINT "Parse$("; I; ") = "; Parse$(A$)
NEXT I
'----------
'The above would generate the following display
'---------
'Elements in A$= 7
'Hello
'this
'is
'a
'test
'/d
'/a
'
SLEEP
END
FUNCTION DimParse% (In$)
In$ = RTRIM$(LTRIM$(In$))
Parses = 0
Length = LEN(In$)
IF Length = 0 THEN
DimParse% = 0
EXIT FUNCTION
END IF
FOR I = 1 TO Length
IF MID$(In$, I, 1) = " " THEN Parses = Parses + 1
NEXT I
DimParse% = Parses + 1
END FUNCTION
'
'
FUNCTION Parse$ (In$)
DEFINT A-Z
STATIC ParseAt%, Length
IF ParseAt% = 0 THEN
ParseAt% = 1
Length = LEN(In$)
END IF
IF Length = 0 OR ParseAt% > Length THEN EXIT FUNCTION
Offset% = INSTR(ParseAt%, In$, " ")
IF Offset% = 0 THEN Offset% = Length + 1
Parse$ = MID$(In$, ParseAt%, Offset% - ParseAt%)
ParseAt% = Offset% + 1
IF ParseAt% = Length + 2 THEN ParseAt% = 0
END FUNCTION
 
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online unter www.antonis.de/faq/progs/commandp.bas .
 
Es geht aber auch etwas einfacher, wie der folgende Programmvorschlag von Quinn Tyler Jackson zeigt:
 
 
DEFINT A-Z
'SUB procedure to get command line and split into arguments.
'Parameters: NumArgs : Number of command line args found.
' Args$() : Array in which to return arguments.
' MaxArgs : Maximum number of arguments array can return.
STATIC SUB Comline (NumArgs, Args$(), MaxArgs)
CONST TRUE = -1, FALSE = 0
NumArgs = 0: In = FALSE
'Get the command line using the COMMAND$ function.
Cl$ = COMMAND$
L = LEN(Cl$)
'Go through the command line a character at a time.
FOR I = 1 TO L
C$ = MID$(Cl$, I, 1)
'Test for character being a blank or a tab.
IF (C$ <> " " AND C$ <> CHR$(9)) THEN
'Neither blank nor tab. Test if you're already inside an argument.
IF NOT In THEN
'You've found the start of a new argument.
'Test for too many arguments.
IF NumArgs = MaxArgs THEN EXIT FOR
NumArgs = NumArgs + 1
In = TRUE
END IF
'Add the character to the current argument.
Args$(NumArgs) = Args$(NumArgs) + C$
ELSE
'Found a blank or a tab.
'Set "Not in an argument" flag to FALSE.
In = FALSE
END IF
NEXT I
END SUB
 
Antwort 2
~~~~~~~~~~~~~~~~
[ von verschiedenen Teilnehmern im QB-Forum, 7.2005 ]
.
Wenn Du an der Kommandozeile oder über ein Batch-Programm oder die Kommandozeile einen Parameter an Dein QuickBASIC-Programm übergeben willst, dann musst dann einfach COMMAND$ in deinem Programm abfragen, etwa so:
IF COMMAND$ = "Hallo" THEN PRINT "Hallo zurück."
 
Also: Der COMMAND$- Befehl in einem selbstausführenden QB-Programm speichert sozusagen den Anhang der Programmaufrufs. In einer Batch-Datei könnte das so aussehen:
C:\Basic\Com.exe Blaubeerkuchen
 
Das Wort "Blaubeerkuchen" ist jetzt in COMMAND$ (in dem Beispiel-Programm Com.exe ) automatisch gespeichert. Wenn Du a$=COMMAND$ geschrieben hättest, wäre es auch in a$ gespeichert.
 
Wenn Du eine Zahl übergeben willst, dann musst Du berücksichtigen, dass diese Zahl als Textstring in COMMAND$ gespeichert ist und erst noch in eine Zahl umgewandelt werden muß.
 
In der Batch-Datei steht z,B,:
C:\Basic\Com.exe 2005
 
In COMMAND$ ist dann das "Wort" (bzw, der Textstring) "2005" gespeichert und nicht der Zahlenwert, wie oben erklärt.
 
Mit
Variable% = LTRIM$(VAL(COMMAND$))
 
kannst Du statt des Teststrings den Zahlenwert in der Variablen
Variable% speichern. Also Variable% = 2005.
 
Willst Du in der QuickBASIC-Entwicklungsumgebung einen Parameterwert "Esel" im Interpretermodus zum Testen vorgeben, so machst Du das über das "Ausführen"-Menü wie folgt:
"Ausführen | Ändere COMMAND$...| Esel" .
 
Oder Du rufst die Entwicklungsumgebung Qb.EXE mit folgender Option auf:
qb /cmd Esel
 
Diese Option muß die letzte Option in der Kommandozeile sein.
 
 

Answer 2
~~~~~~~~~
How do I make runtime parameters?
 
Runtime parameters, for those who don't know, are things like dir /w, the /w is a runtime parameter, or switch. In Qb, you can parse these with the COMMAND$ function.
 
COMMAND$ works for QuickBasic and higher only and returns the command line which launched the EXE-programm as a string.
 
To give you a basic idea ...
 
IF COMMAND$ = "stuff" THEN CALL DoActions
 
But be careful: COMMAND$ returns the entire command line. You must "isolate" the transferred parameter(s) from it.
 
And now, of course, your next question will be: "How do I seperate command line arguments?"
 
Well, the answer ist as follows:
 
You can use the following routine to seperate anything in a string variable that is seperated by spaces:
'
'
DIM SHARED arg$(20) 'Max of 20 arguments, increase/decrease for your app.
'Set up string and make call:
TheString$="This is a test of the EBS system."
NumOfWords%=ArgSplit%(TheString$)
For x%=0 to NumOfWords%
Print arg$(x%)
Next x%
'
SUB ArgSplit%(cline$)
I = 1: arg = LBOUND(arg$): inword = -1
WHILE I <= LENGTH
ch$ = MID$(cline$, I, 1)
IF ch$ <> " " THEN
IF NOT inword THEN inword = -1
arg$(arg) = arg$(arg) + ch$
ELSEIF inword THEN
arg = arg + 1
inword = 0
END IF
I = I + 1
WEND
ArgSplit% = arg
END SUB
 
 

[ The QBasic-MonsterFAQ --- Start Page: www.antonis.de/faq ]