我尝试使用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文件由于某种原因无法正常运行?有更好的方法吗?
答案 0 :(得分:1)
您的C#应用程序使用以下字符串作为参数运行cmd.exe
:
/c foo.bat & bar.bat & set > "File name of temporary file with full path for variables"
我不是C#程序员,也没有安装开发环境来测试提供的C#代码。因此,我不知道最后一个文件名是否最多可能用双引号括起来,但看起来这个部分有效。
但是,此命令行(很可能)在执行时产生:
使用命令行
的第一个命令进程
cmd.exe /c foo.bat
使用从C#application继承的环境变量。
使用命令行
的第二个命令进程
bar.bat
导致Windows执行
cmd.exe /c bar.bat
使用从C#application继承的环境变量。
使用命令行
的第三个命令进程
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继承的环境变量。
我建议在你的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)
不可能直接从另一个进程获取环境变量,但是一个简单的解决方法可能是:
示例代码如下:
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'
}