如何使用 C# 导入 Windows 电源计划
How to import a Windows Power Plan with C#
我正在开发一个小型 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 看到文件?
非常感谢任何帮助!
谢谢!
您的第一个代码段不起作用,因为您在执行流程之前重新分配 cmd.StartInfo.Arguments
。当您放弃第一个作业以支持第二个作业时,第一个作业将丢失。
第一个片段很可能不起作用,因为当您将 cmd.startInfo.FileName
设置为一个没有路径的文件名时,它只会搜索您的 C# 应用程序的 .exe 目录(可能在 project/bin/Debug/
).由于 FileName 是 cmd.exe
,并且您的项目文件夹中可能没有 cmd.exe
,因此找不到任何内容。
您还可以考虑将 cmd.StartInfo.WorkingDirectory
设置为包含 .pow
文件的适当目录,以便您的相对路径能够正确解析。
您可以尝试这样的操作:
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 参数 overwritten/used 两次,并正确处理 cmd 变量。添加了额外的行以隐藏生成的弹出窗口 window,并用于预先生成 Guid 并将其指定为命令行的一部分。
我正在开发一个小型 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 看到文件?
非常感谢任何帮助! 谢谢!
您的第一个代码段不起作用,因为您在执行流程之前重新分配 cmd.StartInfo.Arguments
。当您放弃第一个作业以支持第二个作业时,第一个作业将丢失。
第一个片段很可能不起作用,因为当您将 cmd.startInfo.FileName
设置为一个没有路径的文件名时,它只会搜索您的 C# 应用程序的 .exe 目录(可能在 project/bin/Debug/
).由于 FileName 是 cmd.exe
,并且您的项目文件夹中可能没有 cmd.exe
,因此找不到任何内容。
您还可以考虑将 cmd.StartInfo.WorkingDirectory
设置为包含 .pow
文件的适当目录,以便您的相对路径能够正确解析。
您可以尝试这样的操作:
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 参数 overwritten/used 两次,并正确处理 cmd 变量。添加了额外的行以隐藏生成的弹出窗口 window,并用于预先生成 Guid 并将其指定为命令行的一部分。