Szenario
Nehmen wir an, wir haben folgende Umgebung:
- Datei „C:\temp\folder1\app.exe“, welche beim Ausführen „Ich bin App 1“ ausgibt.
- Datei „C:\temp\folder2\app.exe“, welche beim Ausführen „Ich bin App 2“ ausgibt.
- Path-Umgebungsvariable enthält „C:\temp\folder2″
Windows Command-Line
Wenn man sich in der Konsole im Arbeitsverzeichnis „C:\temp\folder1“ befindet und „app.exe“ ausführt, dann wird „Ich bin App1“ ausgegeben. Das heisst das Arbeitsverzeichnis hat Vorrang vor der Path-Umgebungsvariablen.
Windows PowerShell
Versucht man das gleiche mit Powershell, dann wird „Ich bin App 2“ ausgegeben.
Auf den ersten Blick könnte man meinen, dass in PowerShell die PATH-Umgebungsvariable Vorrang hätte vor dem Arbeitsverzeichnis. Allerdings liegt dieses Verhalten vielmehr daran, dass in PowerShell nur EXE-Dateien aus dem Umgebungspfad (Path-Umgebungsvariable) direkt ausgeführt werden können. Um auf eine EXE-Datei im aktuellen Verzeichnis zuzugreifen, verwendet man den Präfix „.\“. In unserem Beispiel würde also „.\app.exe“ den Output „Ich bin App 1“ liefern.
C# – Process.Start
Versucht man das gleiche in C# mit Process.Start zu implementieren, scheint es sich genauso zu Verhalten wie in der Windows Command-Line.
var startInfo = new ProcessStartInfo(“app.exe”);
startInfo.WorkingDirectory = @”c:\temp\folder1″;
Process.Start(startInfo);
Häufig benötigt man allerdings in C# den Output des Programms und setzt das „UseShellExecute“ Property auf „false“, damit man den Standard-Output lesen kann. So wird nun aber wieder „Ich bin App 2“ ausgegeben.
var startInfo = new ProcessStartInfo(“app.exe”);
startInfo.WorkingDirectory = @”c:\temp\folder1″;
startInfo.UseShellExecute = false;
Process.Start(startInfo);
Auch hier könnte man nun denken, dass die PATH-Umgebungsvariable Vorrang hätte vor dem Arbeitsverzeichnis. Allerdings liegt auch in diesem Fall der Grund woanders. Das Setzen von UseShellExecute auf „false“ bewirkt nämlich, dass das Arbeitsverzeichnis nur für den Prozess gilt, aber nicht zum Auffinden der EXE-Datei verwendet wird.