如果为Process.StartInfo.UseShellExecute = false
,则获取标准输出为easy。然而,在我的例子中,UseShellExecute必须保持为真。原因是我启动的.exe恰好在PATH中,但不在当前工作目录中。
下面是我不能使用UseShellExecute = false
的原因
var psi = new ProcessStartInfo("cleancss", "--help")
{
WorkingDirectory = @"C:\SomeRandomDirectory",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardInput = true
};
Process cssClean = Process.Start(psi); //blows up with The system cannot find the file specified
它正确地爆炸了,因为UseShellExecute = false
需要一个绝对路径。我没有绝对的路径。
如果我在上面的示例中设置了UseShellExecute = true
,它会告诉我重定向标准输出在这种情况下不起作用。
当UseShellExecute为true时,如何获得标准输出?
发布于 2020-06-06 02:48:44
如果不提供绝对路径,Windows将:
然后,
(请注意,Windows/DOS控制台有一个0:“检查这是否是我应该对自己作出反应的保留关键字”)。几十年来,程序不断地从关键字转换到专用流程,然后再转换回来)。
理想情况下,您应该在应用程序设置中设置此路径-以任何方式保存您正在使用的应用程序设置。然后,您可以有选择地为用户提供一个UI来设置该路径。让Windows找出你指的是的哪个文件是如此的DOS时代。我们没有像注册表这样的选项。或“查找文件”对话框。它不应该在2020年使用。
如果你不得不坚持这样做(或者你需要找到一个缺省值),实现Windows搜索模式将是微不足道的。在计划的工作目录中尝试所有3个扩展。检索path变量并对其进行迭代。
最后,Windows中的每个程序调用都使用绝对路径。只是有时Windows必须为你找出绝对路径,因为你是一个愚蠢的普通用户,在远离系统目录时输入"EDIT“。
发布于 2020-06-06 03:09:40
您可以使用/c参数启动您自己的CMD.exe,后跟要执行的内容。Cmd不需要路径,但如果启动,它会从调用者那里继承环境,并且确实有一个完全填充的路径。
var psi = new ProcessStartInfo("cmd", "/c cleancss --help")
{
WorkingDirectory = @"C:\SomeRandomDirectory",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardInput = true
};
Process cssClean = Process.Start(psi);
cmd.exe的/c参数说明如下:
执行由字符串指定的命令,然后终止
在我的测试中,以这种方式启动的任何输出都会通过管道-d到达父进程。
https://stackoverflow.com/questions/62221916
复制相似问题