我正在处理一个远程从服务器接收命令的项目,但是在本地使用命令提示符时遇到了一个问题。一旦我让它在本地工作,然后我将转向远程通信。
问题:
-
我必须完全隐藏控制台,当客户端使用命令行时,客户端不能看到任何响应,但它会显示一个实例的控制台,然后隐藏它。
-
我必须使用c#向
cmd.exe
发送命令并在c#中接收结果。我通过设置StandardOutput的一种方式做到了这一点… -
命令不工作。例如,
D:
应该将目录更改为D,它做到了,但在此之后,如果我们使用dir
来查看D中的目录,它不会显示相应的目录。
第一个方法
Process process = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C " + textBoxInputCommand.Text + " >> " + " system";
process.StartInfo = startInfo;
process.Start();
第二种方法
ProcessStartInfo procStartInfo = new ProcessStartInfo("cmd", "/c " + textBoxInputCommand.Text);
procStartInfo.WorkingDirectory = @"c:";
procStartInfo.RedirectStandardOutput = true;
procStartInfo.UseShellExecute = true;
procStartInfo.UseShellExecute = false;
Process proc = new Process();
proc.StartInfo = procStartInfo;
proc.Start();
string result = proc.StandardOutput.ReadToEnd();
richTextBoxCommandOutput.Text += result;
我希望程序以管理员身份运行,因为它生成的exe在从C驱动器运行时不会运行命令。
- 尽量不要通过将命令传递给
cmd
来运行命令,而是将客户端传递的命令写入.bat
文件,从程序执行.bat.
文件,这可能会隐藏命令提示符窗口。 - 您也可以使用
process.OutputDataRecieved
事件处理程序来处理输出。 -
如果需要以管理员权限执行命令,可以使用
runas
命令。相当于Linux
中的sudo
命令。这里有一段代码,可能会对你有帮助。var process = new Process(); var startinfo = new ProcessStartInfo(@"c:usersShashwatDesktoptest.bat"); startinfo.RedirectStandardOutput = true; startinfo.UseShellExecute = false; process.StartInfo = startinfo; process.OutputDataRecieved += DoSomething; process.Start(); process.BeginOutputReadLine(); process.WaitForExit(); //Event Handler public void DoSomething(object sener, DataReceivedEventArgs args) { //Do something }
您可以通过添加以下代码来隐藏命令提示窗口:
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
或根本不创建
startInfo.CreateNoWindow = true;
这里可以找到一些奖励解决方案:运行命令提示符命令