Каталог .NET Process.Start за замовчуванням?


114

Я запускаю програму Java зсередини консольної програми C # .NET . Це чудово працює у випадку, коли додатку Java не важливо, що таке каталог «за замовчуванням», але виходить з ладу для програми Java, яка лише шукає файли підтримки в поточному каталозі.

Чи є параметр процесу, який можна встановити, щоб вказати каталог за замовчуванням, в якому запускається процес?

Відповіді:


183

Так! ProcessStartInfo Має властивість під назвою WorkingDirectory , просто використовуйте:

...
using System.Diagnostics;
...

var startInfo = new ProcessStartInfo();

  startInfo.WorkingDirectory = // working directory
  // set additional properties 

Process proc = Process.Start(startInfo);

Чи може WorkingDirectoryбути відносний шлях, і якщо так, то яке відношення до поточного файлу чи каталогу поточного виконуваного файлу? У мене виникають проблеми з отриманням програми, щоб знайти виконуваний файл, який я намагаюся запустити. Я встановив робочий каталог в каталог EXE (щодо поточного файлу та до поточного exe), але він не може його знайти.
пушкін

56

Використовуйте властивість ProcessStartInfo.WorkingDirectory, щоб встановити його перед початком процесу. Якщо властивість не встановлено, типовим робочим каталогом є% SYSTEMROOT% \ system32.

Ви можете визначити значення% SYSTEMROOT%, використовуючи:

string _systemRoot = Environment.GetEnvironmentVariable("SYSTEMROOT");  

Ось приклад коду, який відкриває Notepad.exe з робочою каталогом% ProgramFiles%:

...
using System.Diagnostics;
...

ProcessStartInfo _processStartInfo = new ProcessStartInfo();
  _processStartInfo.WorkingDirectory = @"%ProgramFiles%";
  _processStartInfo.FileName         = @"Notepad.exe";
  _processStartInfo.Arguments        = "test.txt";
  _processStartInfo.CreateNoWindow   = true;
Process myProcess = Process.Start(_processStartInfo);

Існує також змінна середовище, яка контролює поточний робочий каталог для вашого процесу, до якого ви можете отримати доступ безпосередньо через властивість Environment.CurrentDirectory .


Приємно, я не знав, що ви можете використовувати змінні середовища у властивості .WorkingDirectory.
Brain2000

1
Бінго, це відповідь - за замовчуванням каталог SYSTEMROOT. +1
ashes999

17

Лише замітка після удару в голову, намагаючись це здійснити. Встановлення значення WorkingDirectory не працює, якщо для параметра "UseShellExecute" встановлено значення false.


1
Це не дає відповіді на запитання. Щоб критикувати або вимагати роз'яснення у автора, залиште коментар під їх публікацією - ви завжди можете коментувати свої власні публікації, і коли ви матимете достатню репутацію, ви зможете коментувати будь-яку публікацію .
Cyclonecode

1
Навіть через 6 років цей коментар про UseShellExecute виявився корисним. Виправлена ​​проблема.
AlanC


6

Метод Process.Start має перевантаження, яке приймає екземпляр ProcessStartInfo. Цей клас має властивість під назвою "WorkingDirectory".

Встановіть цю властивість у папку, яку ви хочете використовувати, і вона повинна змусити її запускатись у правильній папці.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.