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

本文关键字:维护 变量 cmd 执行 应用程序 | 更新日期: 2023-09-27 18:30:10

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

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

假设我有一个包含的简单批处理文件

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感觉有点多余。

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

你可以在这个问题中使用

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

string cmd1 = "'" CALL C:''setEnv.bat && set '"";
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
//...
process.Start();
string variables = process.StandardOutput.ReadToEnd();
// next parse variables string

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

几个问题/想法:

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

2) 你能把第一个的结果直接作为一个调用传送到第二个吗?

3) 你能把第一次调用的值输出到一个文件中吗?在第二次调用中,把它作为输入管道输入到第二个cmd中吗?

4) 我假设您有一些处理是在运行第一个cmd之后,但在调用第二个cmd之前完成的。你能创建一个.exe吗?它可以被第一批处理文件(在其他代码之后)调用。这样,您就有了3个cmd,所有这些cmd都可以在同一个环境中运行,并且您的变量可以保留。