Appel a un script depuis c# puis recuperer une var

Appel a un script depuis c# puis recuperer une var - C#/.NET managed - Programmation

Marsh Posté le 23-12-2008 à 13:49:43    

Salut,
 
Je voudrais appeler un script .bat depuis mon appli c# puis récupérer la valeur d'une variable définie dans ce script de la même manière qu'avec

call

 :
on suppose que dans SCRIPT_A.bat une variable

TOTO

est definie avec

set


 


SETLOCAL ENABLEDELAYEDEXPANSION
call SCRIPT_A.bat
echo %TOTO%
ENDLOCAL


 
Le code C#
 

Code :
  1. public static void Main()
  2.         {                                   
  3.             ProcessStartInfo info = new ProcessStartInfo();
  4.             info.FileName = "C:\\bin\\windows\\SCRIPT_A.bat";
  5.             info.Arguments = "";
  6.             info.UseShellExecute = false;
  7.             //info.CreateNoWindow = true;
  8.             Process p = new Process();
  9.             try
  10.             {
  11.                 p.StartInfo = info;               
  12.                 if (!p.Start()) {                   
  13.                     throw Win32Exception("Could not run the command !" );
  14.                 }
  15.                 p.WaitForExit();
  16.                 if (p.ExitCode != 0)
  17.                     throw new Win32Exception("Error executing command : " + p.ExitCode);
  18.             }
  19.             catch (Exception e)
  20.             {
  21.                 Console.WriteLine("Exception : " + e.ToString());
  22.             }
  23.             finally
  24.             {
  25.                 Console.WriteLine("VAR : " + Environment.GetEnvironmentVariable("TOTO" ));         
  26.                 p.Close();               
  27.             }
  28.         }


 
 

Environment.GetEnvironmentVariable("TOTO" )

renvoi vide, en passant

cmd.exe

en tant que FileName et

/c "SCRIPT_A.bat"

en tant que args ça donne rien non plus :(
 
Quelqu'un a t'il une idée ?
 
Merci
 
 

Reply

Marsh Posté le 23-12-2008 à 13:49:43   

Reply

Marsh Posté le 23-12-2008 à 15:06:06    

Fraer9 a écrit :


 

Environment.GetEnvironmentVariable("TOTO" )

renvoi vide, en passant

cmd.exe

en tant que FileName et

/c "SCRIPT_A.bat"

en tant que args ça donne rien non plus :(


non mais sais tu ce qu'est une variable d'environnement ? [:pingouino]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 23-12-2008 à 15:07:28    

Euh... je suis pas sur de ce que j'avance mais la méthode Environment.GetEnvironmentVariable récupère les variables d'environnement de Windows nan ?
 
TYpe %Windows% = répertoire windows, %TEMP% = répertoire temporaire de l'utilisateur ?
 
Et dans ton script script_A.bat tu définis %TOTO% comme variable d'environnement c'est ça ?

Message cité 1 fois
Message édité par Profil supprimé le 23-12-2008 à 15:08:13
Reply

Marsh Posté le 23-12-2008 à 15:49:46    

Harkonnen a écrit :


non mais sais tu ce qu'est une variable d'environnement ? [:pingouino]


 
C'est une variable définie au niveau de l'os et pouvant être accéder par plusieurs processus ...
 
Mais effectivement tu as raison :
 

Code :
  1. ProcessStartInfo info;
  2. /* ... */
  3. info.EnvironmentVariables["JAVA_CMD"];


 
serai plus exact mais ne marche pas non plus :( apparemment ProcessStartInfo n'est utile que pour la création d'un processus, si ce processus modifie des variables, ces modifications n'ont pas l'air d'être visible après ...

Reply

Marsh Posté le 23-12-2008 à 15:55:16    


 
Ok, pour resumer :
 
script_A.bat :

set TOTO=toto


 
Tu ouvre un shell, tu lance script_A.bat :

c:\script_A.bat


 
Dans le meme shell tu fait :

c:\echo %TOTO%


 
Ca affiche toto.
 
Donc je pense que oui, TOTO a été définie comme variable d'environnement ...

Reply

Marsh Posté le 24-12-2008 à 16:36:14    

Code :
  1. static class VariableEchoer
  2.     {
  3.         private static readonly string PROMPT = System.IO.Directory.GetCurrentDirectory() + ">";
  4.         private static StringBuilder initializerOutput;
  5.         public static string echoVariable(string scriptFilename, string variableToEcho)
  6.         {
  7.             // Prepare to create a process that will run the script
  8.             // and provide the variable value
  9.             ProcessStartInfo info = new ProcessStartInfo();
  10.             info.FileName = "cmd.exe";
  11.             info.Arguments = "/K \"call " + scriptFilename + "\"";
  12.             info.UseShellExecute = false;
  13.             info.RedirectStandardInput = true;
  14.             info.RedirectStandardOutput = true;
  15.             // Create new process  
  16.             Process p = new Process();
  17.             p.StartInfo = info;
  18.             // Create output buffer
  19.             VariableEchoer.initializerOutput = new StringBuilder("" );
  20.             // Set our event handler to asynchronously read the output.
  21.             p.OutputDataReceived += new DataReceivedEventHandler(OutputHandler);
  22.             try
  23.             {
  24.                 // Start the process
  25.                 if (!p.Start())
  26.                 {
  27.                     throw new ApplicationException("Could not run the script " + scriptFilename);
  28.                 }
  29.                 // Use a stream writer to synchronously write the input.
  30.                 System.IO.StreamWriter streamWriter = p.StandardInput;
  31.                 // Start the asynchronous read of the output stream.
  32.                 p.BeginOutputReadLine();
  33.                 // Write the command that will print the variable value
  34.                 streamWriter.WriteLine("echo %" + variableToEcho + "%" );
  35.                 // End the input stream  
  36.                 streamWriter.Close();
  37.                 // Wait for the process to write the text lines
  38.                 p.WaitForExit();               
  39.                 // Kill the process if its not finished
  40.                 if (!p.HasExited)
  41.                 {                   
  42.                     p.Kill();
  43.                 }
  44.                 return VariableEchoer.initializerOutput.ToString();
  45.             }
  46.             catch (Exception e)
  47.             {
  48.                 throw new ApplicationException("Could not echo the variable " + variableToEcho, e);
  49.             }
  50.             finally
  51.             {
  52.                 p.Close();
  53.             }
  54.         }
  55.         private static void OutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
  56.         {
  57.             if (outLine.Data == null || outLine.Data.Equals("" ) || outLine.Data.Contains(PROMPT))
  58.             {
  59.                 return;
  60.             }           
  61.             // Add the text to the collected output
  62.             initializerOutput.Append(outLine.Data);           
  63.         }
  64.     }


 
Bon c'est un peu brutal comme solution, mais ca marche, si jamais quelqu'un trouve mieux  :hello:


Message édité par Fraer9 le 24-12-2008 à 16:38:52
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed