当 useshellexecute = false 时 Process.start 找不到文件

Mik*_*ika 5 c# processstartinfo start-process uwp

我需要从我的 UWP 应用程序调用批处理文件。这样做的方法似乎是Process.Start(),但它说当我按照它输出的路径时,它甚至没有找到文件,它肯定存在。文件路径和工作目录都作为使用 shellexecute = false 时所需的完整路径给出。

当我设置 useshellexecute = true 时它起作用。由于完整路径在这里有效,文件显然就在那里。使用 shellexecute = true 时,工作目录仅指定应搜索文件的位置,命令提示符在 system32 目录中启动,但我需要工作目录是打开的批处理所在的位置。

因此,ShellExecute = false。

我试过: 1. ShellExecute = true。它找到了文件,但工作目录设置不正确。2. 硬编码批处理的绝对路径。还是没找到。3. 设置 StartInfo.FileName 而不是通过参数给它。4. 相对路径 5. Process.Start(Filename)。Can't set Working Directory without StartInfo 6.看类似的问题,但答案总是我已经有了(当shellexecute = false时使用完整路径)

string executable = args[2];

string path = Assembly.GetExecutingAssembly().CodeBase;
string directory = Path.GetDirectoryName(path);

var startInfo = new ProcessStartInfo(directory + @"\Diagnose\_data\Updater\" + executable);

startInfo.UseShellExecute = false;
startInfo.WorkingDirectory = directory + @"\Diagnose\_data\Updater";

startInfo.RedirectStandardError = true;
startInfo.RedirectStandardInput = true;
startInfo.RedirectStandardOutput = true;

Process.Start(startInfo);
Run Code Online (Sandbox Code Playgroud)

它应该找到该文件,因为给出了一个完整的绝对路径,并且该文件绝对存在,但它给出了一个找不到文件的错误。

Pan*_*vos 4

使用Assembly.Location而不是Application.CodeBaseApplication.CodeBase以 URL 而非文件路径的形式返回程序集的源位置。程序集可以从 URL 或字节数组加载并CodeBase反映这一点。它返回类似:

file:///C:/TEMP/LINQPad6/_kighplqc/neuyub/LINQPadQuery.dll
Run Code Online (Sandbox Code Playgroud)

Windows shell 可以处理文件 URL 并将其转换为实际的文件路径。但操作系统本身需要文件路径。

Path.Combine也应该使用而不是连接字符串,以避免出现额外或缺失斜杠的问题。你应该使用类似的东西:

string path = Assembly.GetExecutingAssembly().Location;
string directory = Path.GetDirectoryName(path);
var execPath=Path.Combine(directory,"Diagnose\_data\Updater",executable);

var startInfo = new ProcessStartInfo(execPath);
Run Code Online (Sandbox Code Playgroud)