我正在制作一个tech-toolkit程序,并且包含在这个'toolkit'中的是一个在本地磁盘上运行碎片整理的按钮。目前我为此制作的批处理文件很简单,它只运行基本的碎片分析:
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然后使用Administative Privledges启动我的批处理文件。虽然运行批处理文件后,我收到命令控制台的输出是:
C:\Windows\system32>defrag C: /A
'defrag' is not recognized as an internal or external command,
operable program or batch file.
导致此错误的原因是什么?如何解决?
答案 0 :(得分:2)
检查以确保您的defrag.exe文件实际存在于C:\ Windows \ System32。
中尝试将'defrag'命令完全限定为:
C:\WINDOWS\system32\defrag.exe C: /A
打开cmd提示符并运行此命令:defrag.exe /?
并在问题中发布您所获得的内容。
答案 1 :(得分: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);
// ...