我找到了一些代码here。它捕获cmd.exe的输出并向其发送输入。我在我们的应用程序中的表单上使用它(经过大量修改)。它工作正常,因此我们可以隐藏用户的cmd.exe,但允许此表单给管理员。其他好处包括收藏列表等。
这是一些代码。注意:我删除了70%的代码以简化它,因此可能存在问题。如果有人希望运行此代码并且他们遇到问题请告诉我,我会编辑它并确保它有效。它需要的只是一个带有两个文本框的表单,txtConsoleIn和txtConsoleOut以及一个计时器; tmrSelectedCommand。
public partial class frmCommandPrompt : Form
{
private bool CancelOutput;
private bool FirstTime = true;
private bool InternalCommand;
private string InternalCommandResponse;
private ProcessStartInfo psi;
private Process p;
private string SelectedCommand;
private bool SelectedCommandExecuteNow;
private delegate void InvokeWithString(string text);
public frmCommandPrompt()
{
InitializeComponent();
}
private void frmCommandPrompt_Shown(object sender, EventArgs e)
{
this.txtConsoleIn.Select();
}
private void tmrSelectedCommand_Tick(object sender, EventArgs e)
{
tmrSelectedCommand.Enabled = false;
if (SelectedCommand != string.Empty)
{
if (SelectedCommandExecuteNow)
{
ExecuteCommand(SelectedCommand);
}
else
{
txtConsoleIn.Text = SelectedCommand;
txtConsoleIn.SelectionStart = txtConsoleIn.Text.Length;
txtConsoleIn.Select();
}
SelectedCommand = string.Empty;
SelectedCommandExecuteNow = false;
}
}
// Sending console commands
private void txtConsoleIn_KeyUp(object sender, KeyEventArgs e)
{
string Command;
if ((int)e.KeyCode == (int)Keys.Return)
{
InternalCommand = false;
Command = txtConsoleIn.Text;
ExecuteCommand(Command);
txtConsoleIn.Clear();
}
}
private void Async_Data_Received(Object sender, DataReceivedEventArgs e)
{
if (this.IsHandleCreated)
{
this.Invoke(new InvokeWithString(Sync_Output), e.Data);
}
}
private void Sync_Output(string text)
{
if (!InternalCommand)
{
if (!CancelOutput)
{
OutputText(text);
}
}
else
{
if (text != String.Empty)
{
InternalCommandResponse = text;
InternalCommand = false;
}
}
}
private void ExecuteRecentCommand(string Command, bool ExecuteNow)
{
SelectedCommand = Command;
SelectedCommandExecuteNow = ExecuteNow;
tmrSelectedCommand.Enabled = true;
}
private void ExecuteCommand(string Command)
{
CancelOutput = false;
p.StandardInput.WriteLine(Command);
}
private void OutputText(string text)
{
txtConsoleOut.AppendText(text + Environment.NewLine);
txtConsoleOut.ScrollToCaret();
}
}
我想显示路径,例如prompt = $ P $ G.我可以发出命令echo%cd%并捕获输出,同时抑制该命令和输出。一世 然后可以输出并添加">。"到现在为止还挺好。现在问题。
有时命令可以改变路径。所以我需要再次检查路径,但什么时候?如果有人输入长时间运行命令怎么办?我怎么知道什么时候完成?我希望尽可能使这项工作与原始cmd.exe保持一致,以便于使用。
是cd唯一一个更改路径的命令(除了写得不好的批处理文件)?如果是这样,我可以检查该命令后的路径。但是我必须使用一个标签,因为从root发出的命令如dir * .txt / s可能需要一些时间,并且它不仅会看起来很愚蠢,而是将路径抛到输出的中间但会使表单不太可用甚至根本没有显示路径。
或者可能有一个计时器启动另一个cmd.exe实例每20秒左右运行一次,只是为了获取路径并将其显示在标签中。听起来好像浪费了很多周期而没什么收获。
此时最好的选择似乎是强迫用户自己检查路径。我可以添加一个按钮来获取更容易的路径,但我更喜欢更好的解决方案。