我可以做到:
using (var process = new Process()) {
process.StartInfo.FileName = executable;
process.StartInfo.Arguments = arguments;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
//process.StartInfo.Verb = "Open";
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
...
}
但是随后我必须寻找其关联(AssocQueryString
),解析关联字符串,该字符串可能非常复杂,例如:
"%systemroot%\system32\mspaint.exe" /pt "%1" "%2" "%3" "%4"
或者:
C:\Python27\python.exe "%1" %*
然后拆分为可执行部分,使用Environment.ExpandEnvironmentVariables(exeFile)
进行扩展,然后将所有百分比替换为已解析的argmunets,依此类推。
在少数情况下,关联字符串可能很奇怪,例如(请注意所有斜杠-谁知道它甚至还可以工作...):
\"C:\Program Files\Microsoft\R Client\R_SERVER\\\bin\\x64\\RGui.exe\" \"%1\"
我可以使用过时的WinExec
或ShellExecute
,但是我不能重定向stdout / stderr。
调用CreateProcess
基本上就像C#的new Process()
:MSDN指出
...请注意,此功能不会搜索“应用程序路径”注册表项指定的每个应用程序路径。
那么我注定要独自完成所有工作吗?没有更简单的解决方案?