Как импортировать Windows Power Plan с C # - PullRequest
0 голосов
/ 07 ноября 2019

Я работаю над небольшим приложением на C #, которое импортирует план питания на ПК пользователя и устанавливает его как активное. Он отлично работает с файлом .bat, когда файл .pow находится в той же папке, и я запускаю команды:

powercfg -import "%~dp0\Optimized.pow"
powercfg /setactive 62ffd265-db94-4d48-bb7a-183c87641f85

Теперь в C # я попробовал это:

  Process cmd = new Process();
  cmd.StartInfo.FileName = "powercfg";
  cmd.StartInfo.Arguments = "-import \"%~dp0\\Optimized\"";
  cmd.StartInfo.Arguments = "powercfg /setactive 62ffd265-db94-4d48-bb7a-183c87641f85";
  cmd.Start(); 

  //and this:
  private void button1_Click(object sender, EventArgs e)
  {
      Process cmd = new Process();
      cmd.StartInfo.FileName = "cmd.exe";
      cmd.StartInfo.RedirectStandardInput = true;
      cmd.StartInfo.RedirectStandardOutput = true;
      cmd.StartInfo.CreateNoWindow = true;
      cmd.StartInfo.UseShellExecute = false;
      cmd.Start();
      cmd.StandardInput.WriteLine("powercfg -import \"%~dp0\\Optimized\"");
      cmd.StandardInput.WriteLine("powercfg /setactive 6aa8c469-317b-45d9-a69c-f24d53e3aff5");
      cmd.StandardInput.Flush();
      cmd.StandardInput.Close();
      cmd.WaitForExit();
      Console.WriteLine(cmd.StandardOutput.ReadToEnd());
  }

Но программа не видит файл .pow в папке проекта (на самом деле я пытался поместить его в каждую папку проекта). Как это сделать, чтобы powercfg увидел файл?

Любая помощь очень ценится! Спасибо!

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Вы можете попробовать что-то вроде этого:

var cmd = new Process {StartInfo = {FileName = "powercfg"}};
using (cmd) //This is here because Process implements IDisposable
{

   var inputPath = Path.Combine(Environment.CurrentDirectory, "Optimized.pow");

   //This hides the resulting popup window
   cmd.StartInfo.CreateNoWindow = true;
   cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

   //Prepare a guid for this new import
   var guidString = Guid.NewGuid().ToString("D"); //Guid without braces

   //Import the new power plan
   cmd.StartInfo.Arguments = $"-import \"{inputPath}\" {guidString}";
   cmd.Start();

   //Set the new power plan as active
   cmd.StartInfo.Arguments = $"/setactive {guidString}";
   cmd.Start();
}

Это исправляет параметр Аргументы , который перезаписывается / используется дважды, а также корректно удаляет cmd переменная. Добавлены дополнительные строки, чтобы скрыть получающееся всплывающее окно, а также для создания Guid заранее и указания его как части командной строки.

0 голосов
/ 07 ноября 2019

Ваш первый фрагмент не работает, потому что вы переназначаете cmd.StartInfo.Arguments перед выполнением процесса. Первое назначение теряется, когда вы выбрасываете его в пользу второго.

Первый фрагмент, скорее всего, не работает, потому что, если вы установите cmd.startInfo.FileName только для имени файла без пути, он будет искатьтолько каталог вашего C # приложения .exe (вероятно, в project/bin/Debug/). Поскольку FileName - cmd.exe и, вероятно, в папке вашего проекта нет cmd.exe, он ничего не может найти.

Вы также можете рассмотреть возможность установки cmd.StartInfo.WorkingDirectory в соответствующий каталог с вашим .powфайл, так что ваши относительные пути будут разрешены правильно.

...