.net 计算机级windows环境变量的单元测试
我目前正在编写一系列批处理文件,以及附带的单元/集成测试,以确保它们达到预期效果 但是,其中一个批处理文件应该设置一个环境变量。据我所知,在DOS中在机器级别设置环境变量的唯一方法是使用SetX命令:.net 计算机级windows环境变量的单元测试,.net,batch-file,environment-variables,dos,.net,Batch File,Environment Variables,Dos,我目前正在编写一系列批处理文件,以及附带的单元/集成测试,以确保它们达到预期效果 但是,其中一个批处理文件应该设置一个环境变量。据我所知,在DOS中在机器级别设置环境变量的唯一方法是使用SetX命令: setX My_Variable_Name My_Variable_Value -m 这就是它应该做的。但问题是,因为这会修改注册表,所以在DOS窗口关闭之前,环境变量不会被识别为已设置。因此,我运行批处理文件的相关代码如下所示: ProcessStartInfo p = new
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,所以在调用断言时,批处理肯定已经执行完毕,应该设置环境变量吗?如果在测试失败后打开一个新的dos窗口,并检查My_Variable_Name是否存在,它将被设置为预期值
所以代码可以工作,但是我不能设计一个测试来正确地检查它。我能做些什么,以便测试能够获取环境变量的值吗
干杯,
马特好的,有点像跳圈,但下面是你如何为其他发现这个问题的人做到这一点 您需要powershell,但它在windows vista中是现成的,所以应该不会有问题 创建设置环境变量的powershell文件:
$MyVariable = "My_Variable_Value"
[Environment]::SetEnvironmentVariable("My_Variable_Name", $MyVariable, "Machine")
然后从批处理文件中运行:
powershell.exe SetEnvironmentVariable.ps1
然后测试就会通过。就CMD而言,在进程关闭之前,变量仍然不存在,但出于我无法理解的原因,如果您使用PowerShell设置环境变量时使用的类与c#用于检查它的类相同,那么c#就能够拾取它
干杯,
马特好的,有点像跳圈,但下面是你如何为其他发现这个问题的人做到这一点 您需要powershell,但它在windows vista中是现成的,所以应该不会有问题 创建设置环境变量的powershell文件:
$MyVariable = "My_Variable_Value"
[Environment]::SetEnvironmentVariable("My_Variable_Name", $MyVariable, "Machine")
然后从批处理文件中运行:
powershell.exe SetEnvironmentVariable.ps1
然后测试就会通过。就CMD而言,在进程关闭之前,变量仍然不存在,但出于我无法理解的原因,如果您使用PowerShell设置环境变量时使用的类与c#用于检查它的类相同,那么c#就能够拾取它
干杯,
Matt通常环境变量是继承的,这意味着您的流程只会看到流程启动时出现的变量
对现有环境变量(即使在注册表中)的更改只能应用于新流程。通常环境变量是继承的,这意味着您的流程只能看到流程启动时出现的变量 对现有环境变量(即使在注册表中)的更改只能应用于新进程