1

我正在制作一个技术工具包程序,这个“工具包”中包含一个在本地磁盘上运行碎片整理的按钮。目前我为此制作的批处理文件很简单,它只是运行一个基本的碎片分析:

defrag C: /A

触发此按钮的 C# 代码是:

System.Diagnostics.ProcessStartInfo procInfo = 
    new System.Diagnostics.ProcessStartInfo();
procInfo.Verb = "runas";
procInfo.FileName = "(My Disk):\\PreDefrag.bat";
System.Diagnostics.Process.Start(procInfo);

这段代码完全符合我的要求,它调用 UAC,然后使用管理权限启动我的批处理文件。尽管运行批处理文件后,我收到命令控制台的输出是:

C:\Windows\system32>defrag C: /A
'defrag' is not recognized as an internal or external command, 
    operable program or batch file.

是什么导致了这个错误,我该如何解决?

4

2 回答 2

3

检查以确保您的 defrag.exe 文件确实存在于 C:\Windows\System32 中。

尝试将“碎片整理”命令完全限定为:

C:\WINDOWS\system32\defrag.exe C: /A

打开 cmd 提示符并运行以下命令:defrag.exe /?并在问题中发布您得到的内容。

于 2013-01-19T04:46:16.163 回答
1

首先:将您的项目Platform Target属性设置为Any CPU并取消选中该Prefer 32-bit选项(99,9%这是问题)。那么......为什么在你可以这样做的时候启动一个调用命令的批处理呢?

ProcessStartInfo info = new ProcessStartInfo();
info.Arguments = "/C defrag C: /A";
info.FileName = "cmd.exe";
info.UseShellExecute = false;
info.Verb = "runas";
info.WindowStyle = ProcessWindowStyle.Hidden;

Process.Start(info);

在我的机器上工作就像一个魅力。对于多个命令:

ProcessStartInfo info = new ProcessStartInfo();
info.FileName = "cmd.exe";
info.RedirectStandardInput = true;
info.UseShellExecute = false;

Process cmd = Process.Start(info);

using (StreamWriter sw = p.StandardInput)
{
    if (sw.BaseStream.CanWrite)
    {
        sw.WriteLine(command1);
        sw.WriteLine(command2);
        // ...
于 2013-01-19T04:59:26.777 回答