2017-07-08 1 views
0

Es gibt eine Batch-Datei, die ich ausführen möchte, wenn ich den Knopf drücke. Mein Code funktioniert gut, wenn ich den absoluten (vollen) Pfad verwende. Die Verwendung des relativen Pfads verursacht jedoch eine Ausnahme. Dies ist mein Code:Eine Stapeldatei im relativen Pfad ausführen?

private void button1_Click(object sender, EventArgs e) 
{ 
    //x64 
    System.Diagnostics.Process batchFile_1 = new System.Diagnostics.Process(); 
    batchFile_1.StartInfo.FileName = @"..\myBatchFiles\BAT1\f1.bat"; 
    batchFile_1.StartInfo.WorkingDirectory = @".\myBatchFiles\BAT1"; 
    batchFile_1.Start(); 
} 

und die erhöhte Ausnahme:

Das System kann die angegebene Datei nicht finden.

Das Verzeichnis der Batchdatei ist:

C:\Users\GntS\myProject\bin\x64\Release 

ich gesucht und keines der Ergebnisse hat mir geholfen:

C:\Users\GntS\myProject\bin\x64\Release\myBatchFiles\BAT1\f1.bat 

Die Ausgabe .exe Datei in befindet. Was ist der richtige Weg, um eine Batch-Datei im relativen Pfad zu laufen ?!

+2

Sie können ausführbaren Pfad erhalten, finden Sie unter: [HOW TO: Bestimmen Sie die Ausführung von Anwendungs ​​des Path] (https://msdn.microsoft.com/en-us/library/aa457089.aspx) –

+0

@MaciejLos Ja, kann ich. Aber was ist mit .. \\ oder \\? Ich habe sie immer erfolgreich benutzt. – GntS

+2

Laut der Dokumentation, wenn 'UseShellExecute' wahr ist (und das ist der Standardwert), wird die ausführbare Datei relativ zum Arbeitsverzeichnis durchsucht. Das bedeutet, dass Sie versuchen, '. \ MyBatchFiles \ BAT1 \ .. \ myBatchFiles \ BAT1 \ f1.bat' auszuführen, das in' C: \ Benutzer \ GntS \ myProject \ bin \ x64 \ Release \ myBatchFiles \ aufgelöst wird. myBatchFiles \ BAT1 \ f1.bat' (beachte die beiden 'myBatchFiles') –

Antwort

0

Nach JeffRSon `s Antwort und Kommentare werden von MaciejLos und KevinGosse mein Problem wie unten gelöst wurde:

string executingAppPath = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName; 

batchFile_1.StartInfo.FileName = executingAppPath.Substring(0, executingAppPath.LastIndexOf('\\')) + "\\myBatchFiles\\BAT1\\f1.bat"; 
batchFile_1.StartInfo.WorkingDirectory = executingAppPath.Substring(0, executingAppPath.LastIndexOf('\\')) + "\\myBatchFiles\\BAT1"; 

Eine alternative Möglichkeit ist:

string executingAppPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase); 
batchFile_1.StartInfo.FileName = executingAppPath.Substring(6) + "\\myBatchFiles\\BAT1\\f1.bat"; 
batchFile_1.StartInfo.WorkingDirectory = executingAppPath.Substring(6) + "\\myBatchFiles\\BAT1"; 

Ich berichte Es hofft hier jemand zu helfen.

2

Die Batch-Datei würde in das Arbeitsverzeichnis relativ sein (das heißt f1.bat)

Allerdings sollten Sie Ihr Arbeitsverzeichnis ein absoluter Pfad sein. Es wird nicht garantiert, welcher Pfad für Ihre Anwendung aktuell ist (möglicherweise in .lnk). Insbesondere ist es nicht der Exe-Pfad.

Also sollten Sie den Pfad Ihrer EXE-Datei verwenden, wie er von AppDomain.CurrentDomain.BaseDirectory (oder einer anderen bekannten Methode) erhalten wurde, um den Pfad Ihrer Batchdatei und/oder Ihres Arbeitsverzeichnisses zu erstellen.

Schließlich - Path.Combine verwenden, um einen korrekt formatierten Pfad zu bestimmen.

+0

Können Sie es bitte von einigen klarer machen Codes? – GntS

Verwandte Themen