c# - Process.Start(...) 抛出 "The system cannot find the file specified"

标签 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}"));

通过更改回答的代码,命令提示符只会打开一秒钟,并显示类似“请求无效”的内容,然后资源管理器窗口将打开。

最佳答案

您不必调用 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();

关于c# - Process.Start(...) 抛出 "The system cannot find the file specified",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42565879/

相关文章:

windows - 如何通过cmd最大化特定窗口? ( Windows )

c# - 如何使用 .Net (C#) 在 Windows 中安全地存储 AES key ?

c# - 如何将值存储到通用类字段中 (Mono.Cecil)

debugging - 能够从进程 ID 识别进程身份的最佳 erlang 方法是什么?

c++ - 如何在 C++ 中按名称获取进程句柄?

C++ 解析命令行

java - 如何从命令行运行在两个不同包中具有源代码的java代码?

c# - 在 C# 中获取数据库字段名称数组?

c# - MYSQL 插入...重复值再次插入增量

Java进程挂起并继续