Дефрагментация Windows не распознается как внутренняя или внешняя команда, работающая программа или командный файл.
Я работаю над созданием программы tech-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, а затем запускает мой пакетный файл с правами администратора. Хотя после запуска командного файла вывод, который я получаю для командной консоли:
C:\Windows\system32>defrag C: /A
'defrag' is not recognized as an internal or external command,
operable program or batch file.
Что вызывает эту ошибку и как ее исправить?
2 ответа
Убедитесь, что файл defrag.exe действительно существует в C:\Windows\System32.
Попробуйте полностью квалифицировать команду defrag как:
C:\WINDOWS\system32\defrag.exe C: /A
Откройте командную строку и запустите эту команду: defrag.exe /?
и отправьте в вопросе, что вы получаете.
Прежде всего: установите свой проект 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);
// ...