我一直在尝试使用 C# 按以下方式从 Windows 重新启动 Linux 板。如果我通过 API 执行 C# 函数,则不会发生任何情况,但如果我通过双击执行 bat 文件,我会看到设备重新启动。可能是什么问题?
log.Info("Rebooting Pi " + ip );
string path = @"C:\data\rebootpi.bat";
if (File.Exists(path))
{
File.Delete(path);
}
using (StreamWriter w = new StreamWriter(path))
{
w.WriteLine("@echo off");
String s = string.Format("plink -batch root@{0} -pw secret_pass /sbin/reboot", ip);
w.WriteLine(s);
w.Close();
}
try
{
System.Diagnostics.Process proc2 = new System.Diagnostics.Process();
proc2.StartInfo.WorkingDirectory = @"C:\data\";
proc2.StartInfo.FileName = @"C:\data\rebootpi.bat";
bool b = proc2.Start();
log.Info("Rebooting Pi = " + b);
proc2.WaitForExit();
}
catch (Exception ex)
{}
您不需要 MS-DOS 批处理文件。您正在尝试使用
plink
,因此应使用 Process
来启动该程序。无论如何,在 .NET Core 中,您不能仅使用文档的路径来通过其注册的应用程序来运行它。
假设
plink
在 PATH 中,您可以使用 :
Process.Start("plink.exe",$"-batch root@{ip} -pw secret_pass /sbin/reboot");
或者,为了让事情更清楚:
string args=$"-batch root@{ip} -pw secret_pass /sbin/reboot";
var proc=Process.Start("plink.exe",args);
proc.WaitForExit();
不要使用
catch{}
来隐藏错误。在这种情况下,如果 plink.exe
不在路径上,则可能会出现异常,在这种情况下,您需要更改路径或使用工具的绝对路径。
您可以使用 stdout 或 stderr 重定向读取
plink
的实际输出,例如:
var pInfo = new ProcessStartInfo {
FileName = "plink.exe",
Arguments=args,
RedirectStandardError = true
};
var p=Process.Start(pInfo);
string output = p.StandardError.ReadToEnd();
p.WaitForExit();
Console.WriteLine($"\nError stream: {output}");