Process.start не находит файл, когда используетhellexecute = false - PullRequest
2 голосов
/ 27 июня 2019

Мне нужно вызвать пакетные файлы из моего приложения UWP. Кажется, что это можно сделать с помощью Process.Start (), но он говорит, что не находит файл, даже если он определенно находится там, когда я следую по пути, который он выводит. Filepath и рабочий каталог оба задаются как полные пути, как это требуется при использовании shellexecute = false.

Это работает, когда я устанавливаю использованиеhellexecute = true. Поскольку полный путь работает здесь, файл явно там. При значении shellexecute = true рабочий каталог только указывает, где он должен искать файл, а командная строка запускается в каталоге system32, но мне нужно, чтобы рабочий каталог находился там, где находится открытый пакет.

Следовательно, ShellExecute = false.

Я пытался: 1. ShellExecute = true. Он находит файл, но рабочий каталог установлен неправильно. 2. Жесткое кодирование абсолютного пути к пакету. Все еще не найден. 3. Установка StartInfo.FileName вместо предоставления его через аргумент. 4. относительные пути 5. Process.Start (имя файла). Не могу установить рабочий каталог без 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);

Он должен найти файл, поскольку указан полный абсолютный путь и файл определенно находится там, но выдает ошибку "файл не найден".

1 Ответ

2 голосов
/ 27 июня 2019

Используйте Assembly.Location вместо Application.CodeBase . Application.CodeBase возвращает исходное расположение сборки в виде URL, а не пути к файлу. Сборки могут быть загружены из URL-адресов или байтовых массивов, и CodeBase отражает это. Возвращает что-то вроде:

file:///C:/TEMP/LINQPad6/_kighplqc/neuyub/LINQPadQuery.dll

Оболочка Windows может обрабатывать 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);
...