Seite 1 von 1

Wie kann ich die Umgebungsvariablen auslesen?

Verfasst: 22.09.2004 13:21
von mcGeorge
Hallo zusammen,
unter Windowse kann man ja mit "set" Umgebungsvariablen setzen. Wie z.B. die PATH- oder die CLIENTNAME-Variable.

Wie kann ich die Variablen auslesen? :?:

Re: Wie kann ich die Umgebungsvariablen auslesen?

Verfasst: 22.09.2004 13:39
von Kiffi

Verfasst: 22.09.2004 13:41
von AndyMars
Da gibt's API-Funktionen - alles schon da gewesen - im alten Forum ;)

http://www.robsite.de/php/pureboard-arc ... php?t=1643

Edit: Muss immer einer schneller sein? <) Das PureAre.net ist natürlich auch immer 'ne gute Quelle... Siehe Links oben rechts ;>>

Verfasst: 22.09.2004 13:44
von bobobo
aber nur wenn man auf polinkerrors steht :) zumindest mit PB3.91

wenn die Environmentstring bekannt sind dann kann man die hiermit auslesen

Code: Alles auswählen

Procedure.s getenv(var.s)
buff$=Space(256)
GetEnvironmentVariable_(var,buff$,256 )
ProcedureReturn var+" -> "+buff$
buff$=""
EndProcedure


Debug getenv("NUMBER_OF_PROCESSORS")
Debug getenv("PROCESSOR_ARCHITECTURE")
Debug getenv("PROCESSOR_IDENTIFIER")
Debug getenv("PROCESSOR_LEVEL")
Debug getenv("PROCESSOR_REVISION")
Debug getenv("OS")
Debug getenv("COMSPEC")
Debug getenv("HOMEDRIVE")
Debug getenv("HOMEPATH")
Debug getenv("PATH")
Debug getenv("PATHEXT")
Debug getenv("PROMPT")
Debug getenv("SYSTEMDRIVE")
Debug getenv("SYSTEMROOT")
Debug getenv("WINDIR")
Debug getenv("TEMP")
Debug getenv("TMP")
;unvollständige Liste
;Name Description System User Process (NT/2000) Process (98/ME)
;NUMBER_OF_PROCESSORS   :: Number of processors running on the machine.
;PROCESSOR_ARCHITECTURE :: Processor type of the user's workstation.
;PROCESSOR_IDENTIFIER   :: Processor ID of the user's workstation.
;PROCESSOR_LEVEL        :: Processor level of the user's workstation.
;PROCESSOR_REVISION     :: Processor version of the user's workstation.
;OS                     :: Operating system on the user's workstation.
;COMSPEC                :: Executable file for the command prompt (typically cmd.exe).
;HOMEDRIVE              :: Primary local drive (typically the C drive).
;HOMEPATH               :: Default directory for users (typically \users\default in Windows 2000).
;PATH                   :: PATH environment variable.
;PATHEXT                :: Extensions for executable files (typically .com, .exe, .bat, or .cmd).
;PROMPT                 :: Command prompt (typically $P$G).
;SYSTEMDRIVE            :: Local drive on which the system directory resides (typically c:\).
;SYSTEMROOT             :: System directory (for example, c:\winnt). This is the same as WINDIR.
;WINDIR                 :: System directory (for example, c:\winnt). This is the same as SYSTEMROOT.
;TEMP                   :: Directory for storing temporary files (for example, c:\temp).
;TMP                    :: Directory for storing temporary files (for example, c:\temp).



Die Maximumgröße eine Environmentvariable ist 32767 (inkl. NullTerminator)
buff$ zu groß lässt bei mir lustigerweise allerdings den Grafiktreiber abschmieren ..

Verfasst: 22.09.2004 14:20
von AndyMars
bobobo hat geschrieben:aber nur wenn man auf polinkerrors steht
Ha! Hast recht... Aber das ist ja wohl ein Fehler in den API-Definitionen von PB, oder?

Man kann's ja auch selber machen (leicht abgeändert von purearea.net):

Code: Alles auswählen

; German forum: http://robsite.de/php/pureboard/viewtopic.php?t=1643&highlight=
; Author: wichtel
; Date: 08. July 2003

; Umgebungsvariablen lesen und setzen 
; (gesetzte Umgebungsvariablen werden an Unterprozesse übergeben, 
;  bleiben aber nach Programmende nicht erhalten und können auch nicht 
;  von bereits laufenden Programmen gelesen werden) 

Structure envstruct 
  name.s 
  Value.s 
EndStructure 

NewList env.envstruct() 

; gibt als Rückgabewert die Anzahl der Umgebungsvariablen zurück 
; braucht ein vorher angelegte LinkedList vom Typ envstruct 
Procedure.l myListEnv() 
  ret$="" 
  envcount.l=0 
  LibKernel.l=OpenLibrary(#PB_Any,"kernel32.dll")
  If LibKernel=0
    MessageRequester("DLL error","Kann kernel32.dll nicht öffnen")
    ProcedureReturn 0
  EndIf
  envblock.l=CallFunction(LibKernel,"GetEnvironmentStringsA") ;GetEnvironmentStrings_()
  ClearList(env()) 
  Repeat 
    ret$=PeekS(envblock) 
    If ret$<>"" And Left(ret$,1)<>"=" And Left(ret$,1)<>":" 
      AddElement(env()) 
      env()\name=StringField(ret$,1,"=") 
      env()\Value=StringField(ret$,2,"=") 
    EndIf 
    envblock+Len(ret$)+1 
  Until ret$="" 
  CloseLibrary(LibKernel)
  ProcedureReturn CountList(env()) 
EndProcedure 

; gibt als Rückgabewert den Wert der Umgebungsvariablen zurück 
; oder einenLeerstring wenn die Variable nicht existiert 
Procedure.s myGetEnv(name.s) 
  Value.s=Space(256) 
  size.l=Len(Value) 
  GetENVIRONMENTVariable_(@name, @Value, @size) 
  ProcedureReturn(Value) 
EndProcedure 

; gibt als Rückgabewert den Wert der Umgebungsvariablen zurück 
; oder einenLeerstring wenn das Setzen nicht geklappt hat 
Procedure.s mySetEnv(name.s,Value.s) 
  If SetENVIRONMENTVariable_(@name, @Value) 
    ProcedureReturn Value 
  Else 
    ProcedureReturn ""  
  EndIf  
EndProcedure 

OpenConsole() 

; gezielt eine Umgebungsvariable abfragen 
PrintN("lesen...") 
PrintN("systemroot: "+myGetEnv("systemroot")) 

; eine Umgebungsvariable setzen 
PrintN("setzen...") 
PrintN("MeineVariable: "+mySetEnv("MeineVariable","MeinWert")) 

PrintN("") 
PrintN("Eingabe druecken...") 
Input() 
PrintN("") 

; alle Umgebungsvariablen in ein LinkedList und auflisten 
PrintN("Auflisten...") 
Anzahl.l=myListEnv() 
PrintN(Str(Anzahl)+" Umgebungsvariablen") 
PrintN("") 
ResetList(env()) 
While NextElement(env()) 
  PrintN(env()\name+": "+env()\Value) 
  Delay(300) ; da kann man besser zuschauen 
Wend 

PrintN("") 
PrintN("Eingabe druecken...") 
Input() 

CloseConsole() 

Verfasst: 22.09.2004 14:30
von Kiffi

Code: Alles auswählen

[...]
; Umgebungsvariablen lesen und setzen 
; (gesetzte Umgebungsvariablen werden an Unterprozesse übergeben, 
;  bleiben aber nach Programmende nicht erhalten und können auch nicht 
;  von bereits laufenden Programmen gelesen werden) 
[...]
mich würde mal interessieren, wie man Environment-Variablen dauerhaft setzen kann.

Danke & Grüße ... Kiffi

Verfasst: 22.09.2004 14:38
von bobobo
@AndyMars
geil das


@Kiffi

neben dem Einstellen der SystemVariablen sagt das PSD :
Calling SetEnvironmentVariable has no effect on the system environment variables. The user can add or modify system environment variables using the Control Panel. To programmatically add or modify system environment variables, add them to the HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment registry key, then broadcast a WM_SETTINGCHANGE message. This allows applications, such as the shell, to pick up your updates.

Verfasst: 22.09.2004 15:27
von Kiffi
@bobobo: Danke für die Info!

Grüße ... Kiffi

Verfasst: 22.09.2004 19:28
von wichtel
Tach auch, würde mich mal interessieren warum der alte code in 3.91 nicht mehr geht.
Wollte gerade ein Programm schreiben dass das unter Windows und Linux kann.
Unter Linux habe ich es jetzt hinbekommen und dachte unter Windows nehme ich einfach den alten code.....
mmh.

edit:
und warum zeigt mir nur der Original Editor den Fehler an, und jaPBe nur einen Linker error "no message"?

Verfasst: 25.09.2004 01:54
von Andre
Bzgl. POLINK-Errors bei Codes aus dem CodeArchiv: die neue Version wird nicht eher erscheinen, bis auch alle alten/existierenden Codes auf Funktionsfähigkeit mit v3.91 getestet wurden... (dauert deshalb eben auch seine Zeit) :D