Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 计算机级windows环境变量的单元测试_.net_Batch File_Environment Variables_Dos - Fatal编程技术网

.net 计算机级windows环境变量的单元测试

.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

我目前正在编写一系列批处理文件,以及附带的单元/集成测试,以确保它们达到预期效果

但是,其中一个批处理文件应该设置一个环境变量。据我所知,在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,所以在调用断言时,批处理肯定已经执行完毕,应该设置环境变量吗?如果在测试失败后打开一个新的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

通常环境变量是继承的,这意味着您的流程只会看到流程启动时出现的变量


对现有环境变量(即使在注册表中)的更改只能应用于新流程。

通常环境变量是继承的,这意味着您的流程只能看到流程启动时出现的变量

对现有环境变量(即使在注册表中)的更改只能应用于新进程