我目前正在编写一堆批处理文件,并附带单元/集成测试,以确保它们具有所需的效果。
但是其中一个批处理文件应该设置一个环境变量。据我所知,在机器级别在DOS中设置环境变量的唯一方法是使用SetX命令:
setX My_Variable_Name My_Variable_Value -m
这就是它应该做的事情。但问题是,因为这会修改注册表,所以在DOS窗口关闭之前,环境变量不会被识别为设置。因此,运行批处理文件的代码的相关位如下所示:
ProcessStartInfo p = new System.Diagnostics.ProcessStartInfo(filePath + fileToRun);
p.WorkingDirectory = filePath;
Process proc = new System.Diagnostics.Process();
proc.StartInfo = p;
proc.Start();
proc.WaitForExit();
然后在单元测试中调用之后,我按如下方式检查环境变量:
Assert.AreSame("My_Variable_Value", Environment.GetEnvironmentVariable("My_Variable_Name"), "Primary Customers Server Name improperly set");
但是失败了 - 使用QuickWatch逐步执行它会发现Environment.GetEnvironmentVariable(“My_Variable_Name”)为空。
我对这种行为感到有些困惑。因为我在运行批处理文件的进程上调用WaitForExit,所以当我的Assertion被调用时,批处理已经完成执行并且应该设置环境变量?如果在测试失败后打开一个新的dos窗口并检查是否存在My_Variable_Name,则将其设置为预期值。
所以代码可以工作,但是我无法设计一个能够正确检查它的测试。有什么我可以做的,以便测试能够获取环境变量的值吗?
干杯, 马特
答案 0 :(得分:0)
好的,有点跳过篮球,但是这里有你如何能够找到这个问题的其他人。
你需要PowerShell,但是从Vista开始就是开箱即用的,所以不应该是一个问题。
创建一个设置环境变量的powershell文件:
$MyVariable = "My_Variable_Value"
[Environment]::SetEnvironmentVariable("My_Variable_Name", $MyVariable, "Machine")
然后从批处理文件中运行它:
powershell.exe SetEnvironmentVariable.ps1
然后测试将通过。就CMD而言,变量在流程关闭之前仍然不存在,但是 - 出于逃避我的原因 - 如果使用PowerShell使用c#用来检查它的相同类来设置Environment变量,那么c#是能够接受它。
干杯, 马特
答案 1 :(得分:0)
通常环境变量是继承的,这意味着您的流程只会看到流程启动时出现的变量。
对现有环境变量的更改(即使在注册表中)也只能应用于新进程。