在cmd控制台中显示命令

时间:2012-02-08 15:42:22

标签: c# cmd

我正在尝试使用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";

2 个答案:

答案 0 :(得分:2)

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

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

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

修改

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

  

如果指定了/ C或/ K,那么后面的命令行的其余部分   交换机作为命令行处理,其中包含以下逻辑   用于处理引号(“)字符:

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

         
        
    • 否/ S开关
    •   
    • 正好两个引号字符
    •   
    • 两个引号字符之间没有特殊字符,    special是以下之一:&<>()@ ^ |
    •   
    • 之间有一个或多个空格字符    两个引号字符
    •   
    • 两个引号字符之间的字符串是名称    可执行文件。
    •   
  2.   

由于您使用的是/ 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""并最终用您的测试文件打开记事本。

答案 1 :(得分:0)

该字符串未“写入”控制台,它是您启动的程序的参数列表的一部分(在这种情况下恰好是cmd.exe)。由于创建的控制台是由该程序拥有的,除非它想要出于其自身原因(它不会)打印它的参数,否则这不是直接可行的。

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

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