我正在考虑编写一种命令提示包装器作为学习练习。基本上用户在控制台窗口中输入命令,命令通过cmd.exe执行。
" Run Command Prompt Commands"通过cmd.exe处理命令的执行,同时" Process.start: how to get the output?"负责获得最终的输出。
我还有一个问题需要解决。这种通过cmd.exe执行命令的方法会导致进程启动,执行任何操作,然后终止。因此,如果我执行类似cd..
的操作,则状态的预期更改不会在后续命令之间保留,并且您将看到您保留在同一工作目录中。
是否可以在维护持久性cmd.exe会话的同时执行shell命令?
答案 0 :(得分:2)
根本不要使用/c
来运行命令。保持cmd.exe
一直打开,并重定向stdin,就像重定向stdout一样,然后根据需要提供命令。
var proc = new Process {
StartInfo = new ProcessStartInfo {
FileName = "cmd.exe",
UseShellExecute = false,
RedirectStandardError = true,
RedirectStandardOutput = true,
RedirectStandardInput = true,
CreateNoWindow = true
}
};
proc.StdIn.WriteLine("cd ..");
// other commands from the user
作为奖励,它可以处理衍生过程中的各种状态;诸如%ERRORCODE%
之类的东西,设置变量,更改提示,甚至运行嵌套的解释器。
答案 1 :(得分:0)
Windows中的每个进程(包括CMD.EXE等shell)都有一个当前目录。您可以使用Directory.SetCurrentDirectory
更改.NET中的当前目录。在命令提示符中执行cd ..
不会启动新的cd
进程。相反,CMD.EXE直接处理cd
命令,并使用Windows API更改命令处理器的当前目录。您必须在命令处理器中执行类似的操作。