我们的网络路径上有一些命令(批处理文件/可执行文件),我们必须调用它来初始化该命令窗口的"开发环境".它设置了一些环境变量,向Path添加了东西等等.(然后,只有我们输入的任何工作命令都会被识别,我不知道那些初始化命令内部的内容)
现在我的问题是,我想使用C#程序调用一系列"工作命令",当然,只有初始设置完成后它们才会起作用.我怎样才能做到这一点?目前,我正在从程序中创建一个批处理文件,例如:
file.Writeline("InitializationStep1.bat")
file.Writeline("InitializeStep2.exe")
file.Writeline("InitializeStep3.exe")
Run Code Online (Sandbox Code Playgroud)
然后是实际的命令
file.Writeline("Dowork -arguments -flags -blah -blah")
file.Writeline("DoMoreWork -arguments -flags -blah -blah")
Run Code Online (Sandbox Code Playgroud)
然后最后关闭文件编写器,并运行此批处理文件.
现在,如果我使用Process.<strike>Run</strike>Start("cmd.exe","Dowork -arguments");它直接执行它将无法运行.
如何以更干净的方式实现这一点,以便我只需要运行一次初始化命令?(我可以cmd.exe每次使用所有三个初始化程序运行,但是它们需要花费很多时间,所以我只想做一次)
Dev*_*van 15
正如@Hakeem指出的那样,System.Diagnostic.Process没有静态Run方法.我想你指的是Start方法.
完成批处理文件的构建后,只需使用以下代码执行它,
Process p = new Process();
p.StartInfo.FileName = batchFilePath;
p.StartInfo.Arguments = @"-a arg1 -b arg2";
p.Start();
Run Code Online (Sandbox Code Playgroud)
请注意,该@符号必须以参数字符串作为前缀,以便将转义序列字符\视为文字.
替代代码
Process.Start(batchFilePath, @"-a arg1 -b arg2");Run Code Online (Sandbox Code Playgroud)
要么
ProcessStartInfo processStartInfo = new ProcessStartInfo();
processStartInfo.FileName = batchFilePath;
processStartInfo.Arguments = @"-a arg1 -b arg2";
Process.Start(processStartInfo);Run Code Online (Sandbox Code Playgroud)
更多信息
多命令批处理文件的示例
dir /O
pause
dir
pause
Run Code Online (Sandbox Code Playgroud)
将此文件另存为.bat,然后使用Start方法执行.在这种情况下,您可以在批处理文件本身中使用命令指定参数(在上面的示例中,/O为dir命令指定了选项.
我想您已经完成了批处理文件创建部分,现在只需将参数附加到命令在该批处理文件.
重定向输入到程序
既然你要多个命令发送到同一个CMD过程中,您可以将进程的标准输入重定向到从你的程序,而不是键盘取输入.
代码的灵感来自于类似的问题:使用C#使用相同的进程执行多个命令行
private string ProcessRunner()
{
ProcessStartInfo processStartInfo = new ProcessStartInfo("cmd.exe");
processStartInfo.RedirectStandardInput = true;
processStartInfo.RedirectStandardOutput = true;
processStartInfo.UseShellExecute = false;
Process process = Process.Start(processStartInfo);
if (process != null)
{
process.StandardInput.WriteLine("dir");
process.StandardInput.WriteLine("mkdir testDir");
process.StandardInput.WriteLine("echo hello");
//process.StandardInput.WriteLine("yourCommand.exe arg1 arg2");
process.StandardInput.Close(); // line added to stop process from hanging on ReadToEnd()
string outputString = process.StandardOutput.ReadToEnd();
return outputString;
}
return string.Empty;
}
Run Code Online (Sandbox Code Playgroud)
该方法返回命令执行的输出.以类似的方式,您还可以重定向并读取流程的StandardOuput流.
| 归档时间: |
|
| 查看次数: |
42245 次 |
| 最近记录: |