0

我正在开发一个小型 C# 应用程序,它将电源计划导入用户的 PC 并将其设置为活动状态。当 .pow 文件位于同一文件夹中并且我正在运行命令时,它可以与 .bat 文件完美配合:

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 看到文件?

任何帮助深表感谢!谢谢!

4

2 回答 2

1

你可以尝试这样的事情:

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();
}

这修复了被覆盖/使用两次的Arguments参数,以及正确处理cmd变量。添加了其他行以隐藏生成的弹出窗口,并预先生成 Guid 并将其指定为命令行的一部分。

于 2019-11-06T22:58:36.673 回答
0

您的第一个片段不起作用,因为您cmd.StartInfo.Arguments在执行该过程之前重新分配。当您将第一个作业扔掉以支持第二个作业时,它就会丢失。

第一个片段很可能不起作用,因为当您设置cmd.startInfo.FileName为没有路径的文件名时,它将仅搜索 C# 应用程序的 .exe 的目录(可能在 .exe 中project/bin/Debug/)。由于 FileName 是cmd.exe并且您的项目文件夹中可能没有cmd.exe,因此它找不到任何东西。

您还可以考虑将文件设置cmd.StartInfo.WorkingDirectory为适当的目录,.pow以便您的相对路径能够正确解析。

于 2019-11-06T22:54:31.967 回答