【问题标题】:Execute .cmd file from C# without any popup window从 C# 执行 .cmd 文件,没有任何弹出窗口
【发布时间】:2026-01-26 20:50:02
【问题描述】:

我有 C# 程序,它找到插入的 USB 的驱动器号并将其分配给变量 _usbDriveLetter

我需要将_usbDriveLetter 的值传递给一个批处理文件,该批处理文件进一步执行CHKDSK _usbDriveLetter 命令。

我有以下代码来传递_usbDriveLetter 的值并执行批处理文件。

        string _usbDriveLetter = @"F:\"; //For testing here
        string MyBatchFile = @"<FILEPATH>\chkdsk.cmd";

        ProcessStartInfo proc = new ProcessStartInfo();
        proc.CreateNoWindow = true;
        proc.FileName = MyBatchFile;
        proc.Arguments = usbDriveLetter ;
        Process.Start(proc);

问题:一旦代码到达执行批处理的行,就会出现以下窗口,允许 CMD.exe 启动。如何在后台/静默中执行(至少无需任何用户交互)。

【问题讨论】:

  • 要么禁用 UAC,要么以高权限启动主程序
  • 我已经在 .cmd 文件中提升了用户权限。无法以提升的权限运行我的应用程序。
  • 如果打开 UAC,它需要用户交互,这就是重点。你总会得到这样的提示。
  • @lordkain:问题不在于控制台窗口。我的问题是弹出窗口,您必须在其中回复是/否,如屏幕截图所示。

标签: c# batch-file


【解决方案1】:

这应该可行。

Process runprogram = new Process();
                            ProcessStartInfo programinfo = new ProcessStartInfo();
                            programinfo.WindowStyle = ProcessWindowStyle.Hidden;
                            programinfo.CreateNoWindow = true;
                            programinfo.UseShellExecute = false;
                            programinfo.RedirectStandardOutput = true;
                            programinfo.FileName = "cmd.exe";
                            programinfo.Arguments = " /C \"<FILEPATH>\chkdsk.cmd\"";
                            runprogram.StartInfo = programinfo;
                            runprogram.Start();

在首次运行程序时也要求提升权限。

【讨论】:

  • 谢谢,但它不会解决问题,因为我的问题不是控制台窗口。我的问题是窗口弹出消息。显然,除了以提升的权限运行我的 .exe 或更改 UAC 设置之外,没有解决此问题的方法。
  • @skm 我刚刚测试了它,它确实有效吗?在您的应用程序中添加一个执行级别设置为最高可用的清单文件并使用该代码。
  • 您能否为此目的提供一个示例清单?
  • 这是清单 - pastebin.com/7B6TWEga 由于调用者具有提升的权限,因此调用者调用不会请求更高的权限访问,因为它已经在更高级别执行。
  • OP 已经说过调用者没有被提升,并且不可能在提升的情况下运行他的应用程序。
【解决方案2】:

您可以尝试将 .cmd 转换为 .exe 并将属性设置为不可见,然后从 C# 运行 EXE

这是执行此操作的资源 - http://www.f2ko.de/en/ob2e.php

【讨论】: