Дефрагментация 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);
        // ...
Другие вопросы по тегам