Windows - Környezeti változók kezelése

forráskód letöltése
Több példán keresztül bemutatjuk a Windows 2000 környezeti változóinak kezelését. A példák alapján programból, batch fájlból vagy szkriptekből megvalósítható az olvasásuk és módosításuk. Cikkünkhöz mellékelve megtalálhatók a példákban szereplő szkriptek:

"SetVariable.vbs" - "%systemroot%\Temp\temp2"-re módosítja a TEMP környezeti változó értékét.
"Variable.vbs" - Kiírja a PATH változó értékét.
"VariableList.vbs" - Kilistázza az összes környezeti változót máshonnan el nem érhető tulajdonságokkal is. Figyelem! A szkriptet a "CSCRIPT fájlnév.VBS" utasítással parancssorból futtassuk, mert listaszerűen jeleníti meg a kimenetét.

A környezeti változókkal végzett leggyakoribb művelet az olvasás szokott lenni, amikor egy programnak egy átmeneti mappára van szüksége, hogy kicsomagolja a fájljait, általában lekérdezi a TEMP könyvtár helyét, ha a Windows rendszermappájának helyére kíváncsi a WINDIR változóhoz fordul. De természetesen előfordulhat, hogy írni is kell: például a PATH változó tartalmához hozzá kell fűzni az újonnan telepített alkalmazás elérési útját, hogy bárhonnan futtatható legyen, stb.

Több módon is írhatjuk és olvashatjuk a környezeti változókat:

1. Grafikus felületről a WIN+PAUSE > Speciális > Környezeti változók (WIN+PAUSE > Advanced > Environment Variables) oldalon két csoportra osztva jelennek meg: felhasználói változók az aktuálisan bejelentkezett felhasználóhoz és rendszerváltozók, amelyek minden felhasználó esetében ugyanazok. Minden változóhoz tartozik egy érték, amit szabadon lehet szerkeszteni. Ehhez kattintsunk a nevére, majd a "Szerkesztés" ("Edit") nyomógombra. A "Törlés" ("Delete") gombbal törölhető a kijelölt változó, az "Új" ("New") gombbal pedig készíthetünk egy újat. Ez eddig egyszerű és ha csak időnként kell apróbb változtatásokat eszközölnünk, ebben az ablakban megtehető. De mi a helyzet, akkor ha például egy hálózat minden gépén át kell írni a PATH keresési útvonalat? Ekkor már nagyon időigényes ennek az ablaknak a használata. Kell keresni egy hatékonyabb megoldást.

2. Ami itt megjelent, az megtalálható a regisztrációs adatbázisban is a
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment\
kulcs alatt felsorolva. Indítsuk el a REGEDIT nevű programot (WIN+R > regedit), tallózzunk el a fenti helyre. Válasszuk ki az átszerkesztendő változót, kattintsuk rá kétszer, végezzük el a változtatásokat, kattintsunk az "OK" gombra. Ezután a Rendszerleíró adatbázis > Rendszerleíró adatbázis exportálása (Registry > Export Registry File) menüvel elmenthetjük egy REG állományba. Arra figyeljünk, hogy az "Exportálandó tartomány" ("Export range") alatt a "Kijelölt ág" ("Selected branch") rádiógomb legyen bekapcsolva, különben az egész Registry kiíródik a fájlba. Ebben az esetben viszont csak a környezeti változók. Ha ezt az állományt egy másik gépen az Intézőben (Explorer) futtatjuk, a benne foglalt beállítások felülírják az ottani gép Registry-jének egyező bejegyzéseit. De mi van, ha ez nekünk nem jó és csak és kizárólag a PATH értékét akarjuk módosítani? Át kell szerkesztenünk az exportált REG állományt: Kattintsunk rá a jobb oldali egérgombbal és válasszuk a "Szerkesztés" ("Edit") menüt. Alapesetben a Jegyzettömb (Notepad) nyitja meg, ezután töröljünk minden sort az alábbiak kivételével:
Windows Registry Editor Version 5.00
 [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment]
"Path"=hex(2):45,00,3a,00,5c,00,50,00,52,00,4f,00,47,00,52,00,41,00,7e,00,31,\
  00,5c,00,42,00,6f,00,72,00,6c,00,61,00,6e,00,64,00,5c,00,44,00,65,00,6c,00,\
  00,5c,00,70,00,69,00,63,00,00,00
Már csak a PATH maradt benne és az eléréséhez szükséges Registry útvonal. Mentsük el az állományt. Felhasználása után a másik gépen kizárólag a PATH fog megváltozni.
Ha programból vagy batch fájlból akarjuk a REG állományt érvényesíteni, a következő parancsot kell meghívni:
regedit /i filename.reg
Ahol a "filename.reg" az importálandó REG fájl neve. Mielőtt ténylegesen végbemenne a változtatása, a rendszer egy megerősítést kér tőlünk, ami biztonsági szempontból hasznos, de egy batch fájlnál feleslegesen megszakítja a futást. Ilyenkor praktikusabb a /s (silent = csendes) kapcsolót használni:
regedit /s filename.reg

3. A környezeti változók lekérdezésére VBScript-ből is lehetséges. A WMI (Windows Management Instrumentation) szolgáltatás /roor/cimv2 névterében található "Win32_Environment" osztály felelős mindezért. Megtudhatunk olyan tulajdonságokat, amit máshonnan nem érünk el. Egy ciklusból egyszerűen lekérdezhető minden eleme az alábbiak szerint (1 elem = 1 környezeti változó):
for each Env in GetObject ("winmgmts:{impersonationLevel = impersonate}").InstancesOf 
   ("Win32_Environment")
A környezeti változó nevének megjelenítése:
   WScript.Echo "Név: " & Env.Name
A "feliratának" (második név) megjelenítése (egysoros sztring).
   WScript.Echo "Leírás: " & Env.Caption
Megjegyzés:
   WScript.Echo "Megjegyzés: " & Env.Description
Állapot.
Itt a következő eredményt láthatjuk: "OK", "Error", "Degraded", "Unknown" ,"Pred Fail", "Starting", "Stopping", "Service"
   WScript.Echo "Állapot: " & Env.Status
Alapvető rendszerváltozóról van-e szó? Pl.: PROCESSOR_REVISION, PROCESSOR_LEVEL
   WScript.Echo "Rendszerváltozó? : " & Env.SystemVariable
A létrehozó, tulajdonos felhasználó neve:
   WScript.Echo "Felhasználó: " & Env.Username
A változó értéke:
   WScript.Echo "Érték: " & Env.VariableValue
   WScript.Echo
Next
A szkriptet parancssorból a
cscript fájlnév.vbs
utasítással futtatva felsorolja a változókat és tulajdonságaikat.

Ha nem vagyunk kíváncsiak az összesre, mert nekünk csak egyre van szükségünk a programunkban, kicsit egyszerűsödik a helyzet az előzőhöz képest. Kérdezzük le csak a PATH értékét:
for each Env in GetObject ("winmgmts:{impersonationLevel=impersonate}").ExecQuery  ("select * from
    Win32_Environment where Name='path'")
   WScript.Echo "Érték: " & Env.VariableValue
Next
(A szkript grafikus felületen az Intézővel (Explorer) megnyitva is jól látható kimenetet eredményez.)

Nem csak olvasni, hanem írni is lehet szkriptből. Például a TEMP értékét így lehet módosítani "%systemroot%\Temp\temp2"-re:
Set Sh = CreateObject("WScript.Shell") key = 
    "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\"
Sh.RegWrite key + "TEMP", "%systemroot%\Temp\temp2"