Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/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
从C#应用程序执行cmd时维护变量_C#_.net_Cmd - Fatal编程技术网

从C#应用程序执行cmd时维护变量

从C#应用程序执行cmd时维护变量,c#,.net,cmd,C#,.net,Cmd,我想从.NETC#应用程序中调用一些cmd提示符命令。但是,在运行命令之前,我需要在批处理文件中设置变量。有没有办法为后续的命令提示符调用维护变量 我在下面提供了一个问题的例子 假设我有一个简单的批处理文件C:\setEnv.bat包含 set notepad=C:\windows\system32\notepad.exe 如果我有这样的C代码: var proc1 = new ProcessStartInfo(); string cmd1 = @"CALL C:\setEnv.bat"; s

我想从.NETC#应用程序中调用一些cmd提示符命令。但是,在运行命令之前,我需要在批处理文件中设置变量。有没有办法为后续的命令提示符调用维护变量

我在下面提供了一个问题的例子

假设我有一个简单的批处理文件C:\setEnv.bat包含

set notepad=C:\windows\system32\notepad.exe
如果我有这样的C代码:

var proc1 = new ProcessStartInfo();
string cmd1 = @"CALL C:\setEnv.bat";
string cmd2 = @"ECHO notepad=%notepad%>C:\test.txt";
proc1.UseShellExecute = true;

var process = new Process();
var startInfo = new ProcessStartInfo();
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C " +cmd1;
process.StartInfo = startInfo;
process.Start();
process.WaitForExit();
startInfo.Arguments = "/C " + cmd2;
process.Start();
process.WaitForExit();
现在我猜/C正在终止命令提示符,因此会丢失变量,但是如果没有,那么在完成命令后cmd提示符不会返回

我想我可以将cmd1和cmd2加倍到一个调用中,但是每次调用cmd提示符时我都需要这样做,并且一次又一次地调用C:\setenv.bat会感到有点多余。

一些问题/想法:

1) 从一次执行到下一次执行,您需要跟踪多少个值?首先,您可以只使用errorlevel返回值,还是需要更多详细信息

2) 您能否将第一个调用的结果作为一个调用直接导入第二个调用

3) 您能否将第一次调用的值输出到一个文件,并在第二次调用中,将其作为输入输入到第二个cmd中

4) 我假设在运行第一个cmd之后,但在调用第二个cmd之前,您已经完成了一些处理。您是否可以创建一个.exe,该文件可由执行该处理的第一批处理文件(在其他代码之后)调用。这样,您就有了3个CMD,所有这些CMD都可以在同一个环境中运行,并且您的变量仍然存在。

您可以这样使用

例如,在cmd1中使用命令“set”:


在开始第二个进程之前,在“startInfo.EnvironmentVariables”中设置已解析的变量。

这完全是出于设计。进程通常继承启动它的程序的环境,当程序终止时,它对其环境所做的任何更改都将丢失。因此,通过更改您的环境或使用ProcSeStartInfo.EnvironmentVariables属性,您可以取得成功。我有一个第三方应用程序,需要在运行之前设置大量的环境变量。我不确定它需要哪个变量,我希望避免“CALL setenv.bat&&thirdPartyApp.exe”,因为对setenv的常量调用感觉是多余的。将研究EnvironmentVariables属性。
string cmd1 = "\" CALL C:\\setEnv.bat && set \"";
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
//...
process.Start();
string variables = process.StandardOutput.ReadToEnd();
// next parse variables string