Donnerstag, 29. November 2007

Arbeiten mit Umgebungsvariablen / Working with Environment Variables

Als Umgebungsvariablen werden solche Werte angesehen, die vom BS bereitgestellt werden. Die meisten dieser Variablen können über START/Systemsteuerung/System/Erweitert/Umgebungsvariablen eingesehen und auch den eigenen Bedürfnissen entsprechend angepasst werden.

Die Funktion GetEnv() kommt in VFP schon lange zum Einsatz. Sie stellt nicht nur die zur Verfügung stehenden Variablen des BS dar, sondern zeigt gleichzeitig als Tooltip den aktuellen Inhalt dieser Variablen an. Benötigen wir nun bspw. eine Liste der auf unserem Rechner freigegebenen Verzeichnisse, dann ist dies über eine Kombination von GetEnv() und ANetResources() möglich.

ANETRESOURCES(myResources,[\\] + GETENV([COMPUTERNAME]),1)
DISPLAY MEMORY LIKE myResources

Oben stehender Code liefert ein 1-Dimensionales Array mit dem Namen 'myResources' in dem sämtliche Netzwerkfreigaben des eigenen Rechners aufgelistet sind.

Wie erhalte ich nun die aktuell gesetzten Umgebungsvariablen in einer Liste?

In 2002 wurde von Michael Reynolds im fox wiki eine ausgesprochen einfache Lösung gepostet. Wissend, dass in der DOS-Shell über den Befehl SET sämtliche Umgebungsvariablen abrufbar sind:

RUN set > setlist.txt
lnFile = FOPEN('setlist.txt')
DO WHILE !FEOF(lnFile)
    lcString = FGETS(lnFile)
    lcVar = LEFT(lcString, AT('=', lcString) - 1)
    ? lcVar + ' = ' + GETENV(lcVar)
ENDDO
FCLOSE(lnFile)

Als Fan der Funktion FileToStr() (Wer diesen Blog verfolgt wird dies sicherlich schon bemerkt haben), habe ich Michael's Code auf diese Funktion umgestellt. Die Routine liefert ein 2-Dimensionales Array das in Spalte 1 den Namen und in Spalte 2 den Wert der Umgebungsvariablen enthält.

RUN set > c:\temp\setlist.txt

LOCAL lcSetList as String, i as Integer

* Einlesen der Ergebnisdatei
lcSetlist = FILETOSTR([c:\temp\setlist.txt])
* Ergebnisdatei loeschen
DELETE FILE ([c:\temp\setlist.txt])

* Abarbeitungsschleife für jede Zeile innerhalb der Ergebnisdatei
FOR i = 1 TO GETWORDCOUNT(lcSetList,CHR(13)+CHR(10))

    * Array redimensionieren
    DIMENSION laSetArray(i,2) as String
    * Variablenname auslesen
    laSetArray(i,1) = GETWORDNUM(GETWORDNUM(lcSetList,i,CHR(13)+CHR(10)),1,[=])
    * Variablenwert auslesen
    laSetArray(i,2) = GETWORDNUM(GETWORDNUM(lcSetList,i,CHR(13)+CHR(10)),2,[=])

ENDFOR

* Schleifenergebnis anzeigen
DISPLAY MEMORY LIKE laSetArray

RELEASE lcSetList, i, laSetArray

Im selben wiki-Beitrag (s.o.) zeigte Ed Rauh ein Codemuster auf Basis von Pointern und API-Aufrufen zur Arbeit mit statischen Blöcken wie sie im Zusammenspiel mit Umgebungsvariablen zum Tragen kommen.

Der API-Aufruf GetEnvironmentStrings() liefert einen vom OS verwalteten Datenblock.

Die VFP-Funktion GetEnv() ruft den Wert einer spezifischen Variablen gezielt ab. Hierfür muss jedoch deren genauer Name bekannt sein. GetEnv() unterstützt zwar Intellisense, je nach Einsatzgebiet steht Intellisense jedoch nicht zur Verfügung.

Der u.a. Code liefert ebenfalls einen 2-Dimensionalen Array der in Spalte 1 den Namen und in Spalte 2 den Wert der Umgebungsvariablen enthält.

DECLARE aEnv[1,2]
? GetAllEnvStrings(@aEnv)
DISPLAY MEMORY LIKE aENV

FUNCTION GetAllEnvStrings
LPARAMETER aEnvArray
DECLARE INTEGER GetEnvironmentStrings IN WIN32API
DECLARE SHORT FreeEnvironmentStrings IN WIN32API INTEGER lpszEnvironmentBlock
DECLARE INTEGER lstrcpyn IN WIN32API AS StrCpyN ;
    STRING @ lpDestString, ;
    INTEGER lpSource, ;
    INTEGER nMaxLength
LOCAL nOffset, nEnvironmentBlock, cEnvString, nNumEntries, cEqualPos
DECLARE aEnvArray(1,2)
nNumEntries = 0
cEnvString = ' '
nOffset = 0
nEnvironmentBlock = GetEnvironmentStrings()
DO WHILE LEN(cEnvString) > 0
   cEnvString = REPL(CHR(0), 512)
   IF StrCpyN(@cEnvString, nEnvironmentBlock + nOffset, 512) # 0
      cEnvString = LEFT(cEnvString, MAX(0,AT(CHR(0),cEnvString) - 1))
      nEqualPos = AT('=',cEnvString)
      IF nEqualPos > 0
         nNumEntries = nNumEntries + 1
         DECLARE aEnvArray(nNumEntries,2)
         aEnvArray[nNumEntries,1] = LEFT(cEnvString,nEqualPos - 1)
         aEnvArray[nNumEntries,2] = SUBST(cEnvString, nEqualPos + 1)
         nOffset = nOffset + LEN(cEnvString) + 1
      ENDIF
   ENDIF
ENDDO
=FreeEnvironmentStrings(nEnvironmentBlock)

Keine Kommentare:

Kommentar veröffentlichen