【问题标题】:Run Persistent Command Prompt Commands运行持久命令提示符命令
【发布时间】:2014-12-14 21:24:31
【问题描述】:

我正在考虑编写一种命令提示符包装器作为学习练习。基本上用户在控制台窗口中输入一个命令,然后通过 cmd.exe 执行该命令。

Run Command Prompt Commands”通过 cmd.exe 处理命令的执行,而“Process.start: how to get the output?”负责获取结果输出。

还有一个问题我还没有解决。这种通过 cmd.exe 执行命令的方法会导致进程启动,执行它必须执行的任何操作,然后终止。因此,如果我执行cd.. 之类的操作,预期的状态变化不会在后续命令之间持续存在,您会看到您仍然在同一个工作目录中。

是否可以在保持持久 cmd.exe 会话的同时执行 shell 命令?

【问题讨论】:

  • 我认为您的困惑来自这样一个事实,即 cmd.exe 可以启动外部命令,但也有 cmd.exe 可以在不将它们传递给 Windows 的情况下解释的内部命令。像cdset 这样的命令。你应该在内部处理这些。
  • @itsme86 是的,完全正确 - 这是怎么做的?
  • 参考@MartinLiversage 的回答。

标签: c# windows cmd command-prompt


【解决方案1】:

根本不要使用/c 来运行命令。让cmd.exe 一直处于打开状态,并以与重定向标准输出相同的方式重定向其标准输入,然后根据需要为其提供命令。

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%、设置变量、更改提示,甚至运行嵌套解释器。

【讨论】:

    【解决方案2】:

    Windows 中的每个进程,包括像 CMD.EXE 这样的 shell 都有一个当前目录。您可以使用Directory.SetCurrentDirectory 更改.NET 中的当前目录。在命令提示符下执行cd .. 不会启动新的cd 进程。相反,CMD.EXE 直接处理 cd 命令并使用 Windows API 更改命令处理器的当前目录。您必须在命令处理器中执行类似的操作。

    【讨论】:

      猜你喜欢
      • 2010-11-30
      • 2019-05-28
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      • 2013-08-01
      • 2017-04-22
      相关资源
      最近更新 更多