2017-03-02 452 views
2

对于直接更改注册表,无需重新启动,我发现,使用的Process.Start(...)抛出“系统找不到指定文件”

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打开类似于“的请求无效”,之后的探险家窗口打开。

+0

不知道是否有其他的问题,但最主要的是,如果你想带参数运行的Process.Start - 你必须通过两个参数:文件名和参数。所以你的情况首先是'commandprompt',其次是所有其余的。 – Evk

回答

2

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

此工程在我的机器上(窗口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(); 
+0

原因寻找档案是我没有知道他们在位于** ** SYSTEM32也和我搜索的目录是完全用户特定,所以你不能硬编码。但是,谢谢你现在工作正常! –

+0

我不认为资源管理器和任务杀死应该是用户特定的,也许特定于操作系统。是不是用于DEP和Windows更新的WinSxS文件夹?无论如何,很高兴它为你工作。 –

+0

是它的东西就像一个“组件商店”和保险箱一些systemfiles用于备份的种类 –

相关问题