Wie kann ich die Umgebungsvariablen auslesen?

Für allgemeine Fragen zur Programmierung mit PureBasic.
mcGeorge
Beiträge: 10
Registriert: 20.09.2004 16:28

Wie kann ich die Umgebungsvariablen auslesen?

Beitrag 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? :?:
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Wie kann ich die Umgebungsvariablen auslesen?

Beitrag von Kiffi »

Benutzeravatar
AndyMars
Beiträge: 139
Registriert: 08.09.2004 11:59
Computerausstattung: Win10 Home 64bit, i7-2600k @ 3.4 GHz, 8GB RAM, AMD Radeon R9 200
Wohnort: Zürich, Schweiz
Kontaktdaten:

Beitrag 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 ;>>
Zuletzt geändert von AndyMars am 22.09.2004 13:45, insgesamt 1-mal geändert.
Grüsse von AndyMars
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3857
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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 ..
‮pb aktuell5.7 - windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
AndyMars
Beiträge: 139
Registriert: 08.09.2004 11:59
Computerausstattung: Win10 Home 64bit, i7-2600k @ 3.4 GHz, 8GB RAM, AMD Radeon R9 200
Wohnort: Zürich, Schweiz
Kontaktdaten:

Beitrag 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() 
Grüsse von AndyMars
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3857
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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.
‮pb aktuell5.7 - windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

@bobobo: Danke für die Info!

Grüße ... Kiffi
Benutzeravatar
wichtel
Beiträge: 150
Registriert: 09.09.2004 08:35
Wohnort: Hattersheim

Beitrag 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"?
PB / jaPBe jeweils aktuellste Version, seit 3.62 dabei, XP sp3 de/en & W7 en
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1755
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag 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
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Antworten