【问题标题】:Run DOS command with parameters in C#在 C# 中运行带参数的 DOS 命令
【发布时间】:2018-12-20 18:01:14
【问题描述】:

如果我在命令窗口中运行此命令,它会运行良好并给出我期望的结果。我首先通过CD FilePath 访问FilePath。然后运行带有标志的命令并将输出发送到 DestPath

C:\Program Files (x86)\ProgramName\FileName.exe -f > C:\Temp\Test.txt

但是,它没有通过以下过程运行。我浏览了很多论坛并尝试了解决方案,但都没有奏效。

public const string FilePath = @"C:\\Program Files (x86)\\ProgramName\\FileName.exe";
public const string DestPath = @"C:\\Temp\\Test.txt";

public static void GetResults()
{
    ProcessStartInfo process = new ProcessStartInfo
        {
            UseShellExecute = true,
            CreateNoWindow = false,
            FileName = @"cmd",
        };

    string Command = @"/c " + FilePath + " -f > " + DestPath;
    process.Arguments = Command;
    process.WindowStyle = ProcessWindowStyle.Hidden;
    Process.Start(process);
    Thread.Sleep(2000);

关于如何纠正这个问题或我可能做错了什么有什么建议吗?

【问题讨论】:

  • 您的路径可以包含空格(在上面的示例代码中,FilePath 已经包含)。因此,请确保在命令字符串中的路径周围加上引号,否则传递给 cmd.exe 的命令行参数会分崩离析(由于包含空格的非引号路径参数)。 (旁注:当您使用逐字字符串文字@"....." 时,为什么要转义反斜杠?)
  • 输入 cmd.exe 所在位置的完整路径:FileName = @"cmd",
  • 提示:为了让您自己更轻松地进行故障排除,首先尝试使用与控制台中代码的命令字符串中完全相同的参数来运行/模仿您对 cmd.exe 的调用。 (例如,在控制台中输入:cmd /c ... 后跟命令字符串的内容)
  • 这是我们内部开发的程序,外部无法使用。我正在搜索更多内容并找到了此页面。 “community.spiceworks.com/topic/…”。这正是我需要的。但是当我以这种方式运行时,它说“C:\ Program”不是内部程序。我认为它无法解析完整的路径。我想去: cd C:\Program Files (x86)\ProgramPath 然后运行命令,把结果放到 C:\Temp\Test.txt: \retrieve -f > C:\Temp\Test.txt
  • 这是有效但不输出到文件的代码... ____________ ProcessStartInfo Process = new ProcessStartInfo { UseShellExecute = false, CreateNoWindow = false, FileName = @"C:\Program Files (x86)\程序名\Command.exe", };字符串 RunCommand = @"/c C:\Program Files (x86)\ProgramName\Command.exe -f > C:\Temp\Test.txt"; Process.Arguments = RunCommand; Process.Start(进程); Console.WriteLine(RunCommand); Console.ReadLine();

标签: c# windows processstartinfo


【解决方案1】:

所以,最终,我相信您的问题是尝试启动命令提示符并让它进行输出重定向。老实说,我不确定这是否受支持,这不是 C# 问题。如果您真的想这样做,我建议您编写一个小批处理文件(或者可能是一个 powershell 脚本),它可以执行您想要的操作并获取您需要的参数......可能只有输出文件名,然后直接启动它。

也就是说,我建议您改为使用进程类中内置的输出重定向:

https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.processstartinfo.redirectstandardoutput?view=netframework-4.7.2

然后,您可以将输出直接读入您的程序,并用它做任何您想做的事情...这可能只是将其写入文件...但我强烈怀疑您真的想在内部做一些事情并且它实际上永远不需要写入文件(因为您正在将其写入临时文件夹)。

【讨论】:

  • 等等。感谢您的投入。我通过下面的过程发现了它,它在我需要的时候工作得很好。唯一的问题是,即使我将其描述为“CreateNoWindows = True”,控制台窗口仍然会闪烁。
  • 公共常量字符串输出 = "C:\Temp\Test.txt";进程 p = new Process(); p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; p = Process.Start(进程); p.StandardInput.WriteLine(@"cd " + FilePath); p.StandardInput.WriteLine(@"Retrieve -f > " + output); p.StandardInput.WriteLine(@"EXIT");字符串输出 = p.StandardOutput.ReadToEnd();字符串错误 = p.StandardError.ReadToEnd();
  • 上面的固定代码有什么办法可以不刷控制台吗?如果我将“UseShellExecute = True”设置为“RedirectStandardOutput”需要 UseShellExecute 为 False,则会出现错误。我有点卡在这里没有解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 2014-06-23
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多