在cmd控制台中显示命令

本文关键字:显示 命令 控制台 cmd | 更新日期: 2023-09-27 18:23:43

我正试图使用C#在cmd中运行一个命令,但遇到了一些困难。我希望能够将命令写入cmd控制台,这样我就可以看到它试图运行的内容(我认为引号或其他东西有问题,所以如果我能在命令行中看到实际的字符串,我就能确切地看到问题所在)。我的代码如下:

var processStartInfo  = new ProcessStartInfo("cmd", "/c"+commandString);
processStartInfo.CreateNoWindow = true;
Process.Start(processStartInfo);

所以基本上,我只想看到控制台中编写的字符串commandString。如有任何帮助,我们将不胜感激。

string CommandLineString = @"""C:'Program Files'Microsoft SQL Server'100'Tools'Binn'bcp.exe"" ""SELECT * FROM table where date >= '2009-01-01'"" queryout  ""C:'Data'data.dat"" -S DBSW0323 -d CMS -n -T";

在cmd控制台中显示命令

在这种情况下,问题可能只是"/c"后面缺少空格。

var processStartInfo  = new ProcessStartInfo("cmd", "/c " + commandString);

至于在命令窗口中查看,您最好检查processStartInfo实例的Arguments属性。

编辑

考虑到你发布的命令行详细信息,我相信这就是你的问题所在。从cmd帮助中查看以下内容:

如果指定了/C或/K,则后面的命令行的剩余部分开关被处理为命令行,其中以下逻辑是用于处理引号(")字符:

  1. 如果满足以下所有条件,则使用引号字符在命令行上保留:

    • 无/S开关
    • 正好两个引号字符
    • 在两个引号字符之间没有特殊字符,其中special是其中之一:<>()@^|
    • 在两个引号字符
    • 两个引号字符之间的字符串是名称可执行文件的

由于您使用的是/c,所以仍然存在引号和特殊字符问题。试着用一组引号将整个commandString括起来。

举个简单的例子(当然是手动创建temp.txt):

string commandString = @"""C:'WINDOWS'Notepad.exe"" ""C:'temp.txt""";
var processStartInfo = new ProcessStartInfo("cmd", "/c " + commandString);

要执行的命令行将是:/c "C:'WINDOWS'Notepad.exe" "C:'temp.txt",但这将失败,因为"C:''temp.txt"不是可执行文件。

如果你把整件事都用最后一组引号括起来,你应该会看到预期的结果:

string commandString = @"""""C:'WINDOWS'Notepad.exe"" ""C:'temp.txt""""";
var processStartInfo = new ProcessStartInfo("cmd", "/c " + commandString);

生成一个命令行:/c ""C:'WINDOWS'Notepad.exe" "C:'temp.txt"",并最终打开带有测试文件的记事本。

该字符串不是"写入"到控制台的,它是您启动的程序(在本例中恰好是cmd.exe)的参数列表的一部分。由于创建的控制台归该程序所有,除非它出于自己的原因(不会)想要打印其参数,否则这是不可能直接实现的。

如果您只是想调试,那么为什么不检查commandString的值,或者将其写入日志文件呢?

如果你绝对需要在控制台中显示命令行,那么你可以使用hacks(运行另一个打印命令行的中间程序,然后用它调用cmd.exe),但除非有其他充分的理由使用这种方法,否则我不建议使用。