Process.Start(...)抛出"系统找不到指定的文件"

时间:2017-03-02 21:01:59

标签: c# process command-prompt

如果没有重新启动计算机立即进行注册表更改我发现使用

cmd.exe /c taskkill.exe /f /im explorer.exe & explorer.exe

正是我想做的事。

我知道您不能使用cmd.exe这样的文件,而不是他们的全部路径,因为他们没有 PATH 值并且不存在 System32 文件夹。

const string explorer = @"C:\Windows\explorer.exe";
string taskkill = "", commandprompt = "";
var task1 = Task.Run(() =>
    taskkill = Directory.GetDirectories(@"C:\Windows\WinSxS", "*microsoft-windows-taskkill_*")[0] + @"\taskkill.exe");
var task2 = Task.Run(() =>
    commandprompt = Directory.GetDirectories(@"C:\Windows\WinSxS", "*microsoft-windows-commandprompt_*")[0] + @"\cmd.exe");

Task.WaitAll(task1, task2);
Process.Start(string.Format($"{commandprompt} /c {taskkill} /f /im {explorer} & {explorer}"));

但是运行这段代码会抛出

"The system cannot find the file specified"

如果有人可以帮我解决这个问题,我将不胜感激!

编辑#1

Process.Start(commandprompt, string.Format($"/c {taskkill} /f /im {explorer} & {explorer}"));

通过将代码更改为已应答,命令提示符仅针对第二个ans打开,例如" 请求无效"之后,浏览器窗口打开。

2 个答案:

答案 0 :(得分:2)

您不必调用cmd.exe / c,您应该可以直接运行taskkill.exe。

这适用于我的机器(Windows 10)。您是否每次都需要搜索文件?我认为对于一个简单的实用程序应用程序,硬编码的路径应该没问题。

var startInfo = new ProcessStartInfo()
{
    Verb = "runas",
    Arguments = "/f /im explorer.exe",
    FileName = @"c:\windows\system32\taskkill.exe"
};
var process = new Process { StartInfo = startInfo };
process.Start();
process.WaitForExit();
startInfo = new ProcessStartInfo()
{
    Verb = "runas",
    FileName = @"C:\windows\explorer.exe"
};
process = new Process { StartInfo = startInfo };
process.Start();

答案 1 :(得分:1)

如果要传递命令行参数,则需要使用Process.Start {{1}}。