2015-06-14 130 views
0

首先,这是我的第一个程序,我对HTML和一些JS之外的整体编程非常新颖。话虽如此,我正在构建一个收集和收集系统文件以用于故障排除目的的应用程序。我有什么,我迄今所做的一个基本的了解,我只是有与输入dxdiag参数这里的问题:打开命令提示符并执行命令

var process = new Process(); 
    var startInfo = new ProcessStartInfo(); 
    // startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
    startInfo.FileName = "cmd.exe"; 
    startInfo.Arguments = @"/c dxdiag /whql:on /t %UserProfile%\Desktop\My System Files\dxdiag.txt"; 
    process.StartInfo = startInfo; 
    process.Start(); 
    process.WaitForExit(); 

*为了澄清,我注释掉隐线,这样我可以看到什么CMD窗口在我构建应用程序时正在做这件事。

现在我查看了这个,发现了多个其他线程与使用类似的代码有关,但无法弄清楚为什么我的变体不会使用我包含的参数。这是我调出CMD并执行dxdiag命令的块。我已经多次在CMD中测试过这个命令,以确保它可以正常工作。我的问题是,上面的参数不会在启动的CMD提示符内执行。我在下面包含了我的全部代码,以便给出更多的上下文,因为我也将使用msinfo32导出。它也没有执行这些命令(这​​里没有预料到不同的结果)。

using System; 
    using System.IO; 
    using System.Diagnostics; 
    namespace System_File_Collection_App 
    { 
     class Program 
     { 
      public static void Main(string[] args) 
      { 
     // DXDIAG Output 
     var process = new Process(); 
     var startInfo = new ProcessStartInfo(); 
     //startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
     startInfo.FileName = "cmd.exe"; 
     startInfo.Arguments = @"/c dxdiag /whql:on /t %UserProfile%\Desktop\My System Files\dxdiag.txt"; 
     process.StartInfo = startInfo; 
     process.Start(); 
     process.WaitForExit(); 

     // MSINFO32 Output 
     var process = new Process(); 
     var startInfo = new ProcessStartInfo(); 
     //startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
     startInfo.FileName = "cmd.exe"; 
     startInfo.Arguments = @"/c msinfo32 /nfo %UserProfile%\Desktop\My System Files\"; 
     process.StartInfo = startInfo; 
     process.Start(); 
     process.WaitForExit(); 
      } 
     } 

    } 

缩进搞砸了一点,当我复制过来,但一切正常,我能够运行该程序。

编辑:剥离dxdiag参数,并在代码中使用dxdiag工作得很好。我用它作为测试点来确保命令实际上会启动。我只是不明白为什么不使用次要论据。

不起作用:

startInfo.Arguments = @"/c dxdiag" + "/whql:on" + "/t \"%UserProfile%\\Desktop\\dxdiag.txt\""; 

作品:

startInfo.Arguments = @"/c dxdiag"; 
+0

如果从命令行手动运行它,会发生什么?也可以在引号中使用空格作为参数中的第一个字符,并将@作为第一个startinfo.Arguments = @“... – SteveFerg

+0

您可能想要切换到具有实际API的PowerShell –

+1

欢迎使用堆栈溢出!我已经编辑过你的标题,请参阅“[应该在标题中包含”标签“的问题吗?](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该“。 –

回答

0

你可能参数之间忘了空间,因为这一个正常工作:

startInfo.Arguments = @"/c dxdiag /whql:on /t %userprofile%\Desktop\Examples\New folder\myinfo.txt" 

注意,路径到文件夹必须存在,否则它将无法工作。

相关问题