C#运行程序并在运行后获取环境变量

时间:2017-01-21 19:14:56

标签: c# batch-file

我尝试使用c#运行两个批处理脚本,然后看看它们如何影响环境。

我的代码是

string finalEnvVarsFile = Path.GetTempFileName();
string arguments = string.Format("/c {0} & {1} &  set > {2}", "foo.bat", "bar.bat", finalEnvVarsFile);

// Helper to run processes easier and reads in stdout and stderr.
ProcessHelper processHelper = ProcessHelper.Create("cmd.exe", arguments);
bool success = processHelper.Run(null, true, true);
foreach (var envVar in File.ReadAllLines(finalEnvVarsFile))
{
   Console.WriteLine("Environment Variable: " + envVar);
}

我得到的环境变量似乎是该进程最初的内容,而不是批处理文件的设置。我做错了什么,或者bat文件由于某种原因无法正常运行?有更好的方法吗?

3 个答案:

答案 0 :(得分:1)

您的C#应用​​程序使用以下字符串作为参数运行cmd.exe

/c foo.bat & bar.bat & set > "File name of temporary file with full path for variables"

我不是C#程序员,也没有安装开发环境来测试提供的C#代码。因此,我不知道最后一个文件名是否最多可能用双引号括起来,但看起来这个部分有效。

但是,此命令行(很可能)在执行时产生:

  1. 使用命令行
    的第一个命令进程 cmd.exe /c foo.bat
    使用从C#application继承的环境变量。

  2. 使用命令行
    的第二个命令进程 bar.bat
    导致Windows执行 cmd.exe /c bar.bat
    使用从C#application继承的环境变量。

  3. 使用命令行
    的第三个命令进程 set > "File name of temporary file with full path for variables"
    导致Windows执行 cmd.exe /c set > "File name of temporary file with full path for variables"
    使用从C#application继承的环境变量。

  4. 我建议在你的C#源文件中使用:

    string arguments = string.Format("/c \"{0} & {1} &  set > {2}\"", "foo.bat", "bar.bat", finalEnvVarsFile);
    

    这导致执行:

    cmd.exe /c "foo.bat & bar.bat & set > "File name of temporary file with full path for variables""
    

    现在两个批处理文件和命令 SET 由同一个命令进程执行,临时文件可能(未验证)包含修改后的环境变量。

    另见答案:
    Difference in Delayed expansion of ERRORLEVEL on cmd prompt and win32_process

答案 1 :(得分:0)

不可能直接从另一个进程获取环境变量,但是一个简单的解决方法可能是:

  1. 创建一个虚拟蝙蝠文件(env.bat),它将执行所需的bat 并回显环境变量。
  2. 获取此env.bat的输出以在C#的过程执行中。

示例代码如下:

SELECT

 AD_COLUMN_IDENTIFIER('enroll_studentdetails1',atd.enroll_studentdetails1_id,'en_US') 
     AS Studentname,
 AD_COLUMN_IDENTIFIER('hr_employee',atd.hr_employee_id,'en_US') AS Employee, 
 AD_COLUMN_IDENTIFIER('setup_course',atd.setup_course_id,'en_US') AS cou rse,
 AD_COLUMN_IDENTIFIER('curr_class_date',atd.curr_class_date_id,'en_US') AS cla ssDateID,
 atd.curr_attnd_roster_name,atd.curr_attnd_roster_attendance,
  CASE
        WHEN atd.curr_attnd_roster_attendance = 'Present' THEN 'P'
        WHEN atd.curr_attnd_roster_attendance = 'Absent' THEN 'A'
        ELSE 'unknown'
  END AS Attendance,
 atd.curr_attnd_roster_reason,
 CAST(atd.curr_attnd_roster_classdate as DATE) as atdclassdate, 
 CAST(atd.curr_attnd_roster_starttime as DATE) as starttime,
 std.enroll_rollno,std.enroll_first_name,
 CAST(cdate.curr_classdate as DATE) as classdate,atd.setup_course_id

 from curr_attnd_roster atd,enroll_studentdetails1 std,setup_course co,curr_class_date cdate

 where std.enroll_studentdetails1_id=atd.enroll_studentdetails1_id 
 and co.setup_course_id=atd.setup_course_id
 and cdate.curr_class_date_id=atd.curr_class_date_id and $P{Course_ID}=atd.setup_course_id

答案 2 :(得分:0)

这是一个完整的示例,其中支持环境变量,并且如果子进程正在等待stdout或stderr管道读取数据,则不挂起。

plugins{
    id 'java'
    id 'war'
    id 'org.gretty' version '2.2.0'
}

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    providedCompile 'javax.servlet:servlet-api:2.5'
    runtime 'javax.servlet:jstl:1.1.2'
}