2009-05-29 9 views

Répondre

5

Vous pouvez utiliser Environment.SetEnvironmentVariable:

Environment.SetEnvironmentVariable("SomeVariable", "Some value", EnvironmentVariableTarget.User); 

Le dernier paramètre déterminera la portée et la durée de la variable (soit processus, l'utilisateur ou la machine). Si vous voulez définir la variable pour la machine, vous devrez exécuter en tant qu'administrateur. Je remarque cependant que si vous exécutez une application console avec le code ci-dessus, la variable d'environnement n'est pas disponible jusqu'à ce que vous ouvriez une nouvelle fenêtre de commande (donc si vous exécutez l'application console à partir d'un fichier batch, la variable ne sera pas disponible pour le fichier batch, à moins qu'il y ait une astuce pour qu'il actualise l'ensemble des variables d'environnement qu'il voit). OK, je creusais avec ceci et il ne semble y avoir aucun moyen évident de faire en sorte que le fichier batch récupère un ensemble rafraîchi de variables d'environnement. Une solution de contournement que j'ai trouvée est d'avoir le code. Net écrire un fichier de commandes pour définir les variables, au lieu de les définir lui-même. Le script batch appelant peut alors exécuter le fichier batch créé pour avoir l'environnement mis en place:

.Net Console App:

static void Main(string[] args) 
{ 
    string outputFile = @"c:\temp\setvars.bat"; 
    string variable = "set SomeVariable=Some value"; 
    File.WriteAllText(outputFile, variable); 
} 

-fichier BAT:

call myconsoleapp.exe 
call c:\temp\setvars.bat 
echo %SomeVariable% 
+0

Vous me battez pour ça. Je pense que c'est une bonne solution, et j'ai eu une opinion un peu différente dans ma réponse. Je ne pense pas qu'il existe une autre façon «sympa» de le faire. – Xiaofu

+0

Cette solution a fonctionné magnifiquement, dommage qu'il y ait cette limitation sur les variables d'environnement, mais une solution de contournement fera l'affaire. – benPearce

0

Oui, définir un système variable d'environnement au lieu d'une variable d'environnement de processus. (Je pense que techniquement, une variable d'environnement d'utilisateur persistera également, mais seulement pour les contextes de cet utilisateur).

Utilisez la classe system.environment pour accéder à la méthode SetEnvironmentVariable.

+0

Cela ne fonctionne pas au-delà de la portée du processus. Une fois la fermeture terminée, la variable d'environnement n'est pas disponible dans le script qui l'a appelée. Cependant, je ne sais pas à quoi vous faites référence par "variable d'environnement système" l'énumération EnvironmentVariableTarget n'a que des valeurs Process, User et Machine. –

+0

* Les variables de processus * ne persistent que pour la portée du processus. Les variables d'environnement utilisateur sont stockées dans HKCU et sont chargées lorsqu'un processus est créé pour cet utilisateur. Les variables système (machine) sont stockées dans HKLM et sont chargées lorsqu'un processus shell est créé dans cette machine logique. – RBarryYoung

3

Étant donné que vous voulez qu'un fichier de commandes puisse le lire, vous êtes probablement limité à l'utilisation de variables d'environnement traditionnelles.

Essayez d'utiliser Environment.SetEnvironmentVariable avec un EnvironmentVariableTarget d'un utilisateur ou d'une machine. Vous devriez alors pouvoir y accéder à partir de votre fichier batch avec quelque chose comme% my_var%.

Environment.SetEnvironmentVariable("my_var", "data", EnvironmentVariableTarget.User); 

EDIT: Fredrik il me devança avec une solution similaire, et je suis d'accord que ce comportement est connu pour les variables d'environnement. J'allais proposer que votre application C# écrive les chaînes que vous voulez retourner dans un fichier texte, puis l'analyser dans votre fichier batch. Par exemple:

for /f "tokens=1,2 delims=," %%a in (data.txt) do (
if %%a==env1 echo %%b 
if %%a==env2 echo %%b 
) 

... où donnees.txt pourrait ressembler à:

env1,hello 
env2,there 
4

Ceci est similaire à Xiaofu de, sauf que vous pouvez sauter le fichier texte tout à fait et que votre écriture de programme les données à la console.Mettez les tiques autour du nom du programme pour avoir le fichier de commandes exécuter et utiliser la sortie, comme ceci:

for /f "tokens=1,2 delims=," %%a in ('MyProgram.exe') do (
    set %%a=%%b 
    set %%a=%%b 
) 

Si vous voulez afficher d'autres lignes de texte qui doivent être ignorés, alors vous pouvez ajouter un filtre à l'intérieur du pour-boucle.

Questions connexes