Probleme shellexecute d'un .bat

Signaler
Messages postés
6
Date d'inscription
mardi 28 mars 2006
Statut
Membre
Dernière intervention
31 mars 2006
-
Messages postés
6
Date d'inscription
mardi 28 mars 2006
Statut
Membre
Dernière intervention
31 mars 2006
-
Bonjour,

j'utilise shellexecute pour lancer un .bat

if ShellExecute(0,'OPEN',PChar('C:\...\RESTRICT.bat'), Nil, Nil, SW_SHOWNA)<=32 then ShowMessage(SysErrorMessage(GetLastError));

mais j'aurais besoin dans la fenetre DOS ouverte par shellexecute d'avoir acces à une variable d'environnement.

le fichier .bat lancé à la main reconnait ma variable, mais dans mon cas la variable est vide !
comment puis-je activer l'héritage des variables systemes definies sous windows ?

4 réponses

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
32
qu'elle variables d'environnement souhaite tu recuperer ?

une astuce pour toi :

toute les variables d'environnement sont contenue dans le registre, dans cette clef :

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

il te suffirat alors de faire :

uses registry;

type
TEnvVars = (evComspec, evNumCPU, evOS, evPath, evPathext, evProcArch, evProcID,
evProcLevel, evProcRev, evTemp, evTMP, evWindir);

function GetEnvironnementVar(const EVVAR : TEnvVars) : string;
var REG : TRegistry;
begin
result := '';
REG := TRegistry.create;
REG.RootKey := HKEY_LOCAL_MACHINE;
if REG.OpenKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',false) then begin
case EVVAR of
evComspec : result := REG.ReadString('ComSpec');
evNumCPU : result := REG.ReadString('NUMBER_OF_PROCESSORS');
evOS : result := REG.ReadString('OS');
evPath : result := REG.ReadString('Path');
evPathext : result := REG.ReadString('PATHEXT');
evProcArch : result := REG.ReadString('PROCESSOR_ARCHITECTURE');
evProcID : result := REG.ReadString('PROCESSOR_IDENTIFIER');
evProcLevel : result := REG.ReadString('PROCESSOR_LEVEL');
evProcRev : result := REG.ReadString('PROCESSOR_REVISION');
evTemp : result := REG.ReadString('TEMP');
evTMP : result := REG.ReadString('TMP');
evWindir : result := REG.ReadString('windir');
end;
REG.CloseKey;
end;
REG.Free;
end;

voila. n'oublis pas que la plupart du temps, tout ce trouve dans le registre.

<hr size="2" width="100%">
Messages postés
3818
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
18 septembre 2020
34
Salut,
mais il n'est pas utile d'utiliser la base de registre pour cela, il existe aussi une fonction de l'unité Windows : ExpandEnvironmentStrings

Function ExpandEnvStrings(DirStr: String): String;
Var EnvVariable : Array[0..512] Of Char;
Begin
Result := EmptyStr;
ExpandEnvironmentStrings(PChar(DirStr), @EnvVariable, 512);
Result := EnvVariable;
End ;

Utilisation :

Label1.Caption : = ExpandEnvStrings('%WinDir%');
Label1.Caption := ExpandEnvStrings('%ProgramFiles%\Mon Dossier'); // Donne 'C:\Program Files\Mon Dossier' (Si tout est d'origine bien sur)

et voici la liste des variables disponibles à mettre toujours entre deux "%":
APPDATA
TEMP , TMP
COMPUTERNAME
CommonProgramFiles
COMSPEC
NUMBER_OF_PROCESSORS
OS
PROCESSOR_ARCHITECTURE
PROCESSOR_IDENTIFIER
PROCESSOR_LEVEL
PROCESSOR_REVISION
PROGRAMFILES
SYSTEMDRIVE
SYSTEMROOT
AllUsersProfile
USERPROFILE
WINDIR
The remainder are only available to interactive applications.


HOMEDRIVE
HOMEPATH
LOGONSERVER
USERDOMAIN
USERNAME
Only the WINDIR variable is available on Microsoft Windows® 95 and Windows 98 systems.

Et pour l'opération Inverse il faut déclarer dans la section Interface la fonction suivante:

function PathUnExpandEnvStrings(pszPath : PAnsiChar; pszBuf : PAnsiChar; cchBuf : Integer):Boolean; StdCall
external 'ShlwApi.dll' name 'PathUnExpandEnvStringsA';

Implementation

Function UnExpandEnvStrings(aPath : String): String;
Var eVariable : array[0..512] of Char;
begin
PathUnExpandEnvStrings(PChar(aPath), @eVariable, 512);
Result : = eVariable;
end;

Utilisation :

Label2.Caption := UnExpandEnvStrings('C:\Program Files\Mon Dossier'); // Donne '%ProgramFiles%\Mon Dossier'

@+
Cirec
Messages postés
6
Date d'inscription
mardi 28 mars 2006
Statut
Membre
Dernière intervention
31 mars 2006

oui je connaissait l'emplacement des variables, d'ailleurs la variable a laquelle j'essaie d'acceder est une variable que j'ai créé moi-meme, avec la fonction SetSystemEnvVar.
j'utilise %nomdelavariable% dans mon batch, chose qui marche tres bien quand je le lance a la main, mais pas avec la fonction ShellExecute.

j'ai fait un SET au debut du batch pour voir quelles variables etaient présentes, et il n'y en a que 3 ! il s'agit de COMTEXT, PATHEXT et PROMPT
Messages postés
6
Date d'inscription
mardi 28 mars 2006
Statut
Membre
Dernière intervention
31 mars 2006

en fait je semble avoir contourné le probleme, peut etre un bug de lazarus : quand ca arrive (seulement 3 variables d'env reconnues) il faut fermer lazarus, le reouvrir et a la premiere execution toutes les variables sont bien la!

maintenant quand je change interactivement la valeur de la variable d'env, le changement n'est pas propagé immediatement au reste du programme. a chaque fois , le shellexecute garde la premiere valeur, celle avec laquelle le programme s'est chargé