2016-04-12 6 views
0

Gibt es irgendwelche .Net Methoden, die den Pfad und den Dateinamen aus einer Windows-Befehlszeichenfolge extrahieren können und die Argumente nicht einschließen?Get FileName aus Befehl mit Argumenten

var p = @"c:\somefolder\someConsoleApp.exe -k Something -i -user Bob" 

I Tried Fileinfo, Path.GetFileName und andere verwenden, jedes Mal, das Objekt die Befehle in sich hat.

Zum Beispiel

var fileName = System.IO.Path.GetFileName(p); 
Console.WriteLine(fileName); 

Ausgang

someConsoleApp.exe -k Something -i -user Bob 

ich nur "someConsoleApp.exe" Vorzugsweise mit Zugriff auf die Argumente erhalten möchten.

ProcessStartInfo könnte es irgendwie tun, aber es hat das gleiche Problem, FileName hat die ganze Sache und Argumente ist leer.

+0

Nein, da die Dateien sein ** können ** haben folgende Namen: 'someConsoleApp.exe -k Etwas -i -user Bob' .Sie müssen es mit der Hand analysieren –

+1

Warum trennen Sie diese Saite überhaupt nicht? – rinukkusu

+1

Müssen Sie mit möglichen Leerzeichen im Pfad der EXE umgehen? Und wenn ja, würde der Pfad zitiert werden? Das ist wirklich die einzige Sache, die dich davon abhalten könnte, nur den Weltraum zu teilen. – juharr

Antwort

1

Sie Regex Ausdruck mit einem beliebigen Dateinamen umgehen können (mit Leerzeichen und Perioden)

string input = @"c:\somefolder\someConsoleApp.exe -k Something -i -user Bob"; 
var name = System.IO.Path.GetFileName(input); 
var match = Regex.Match(name, @"([A-Za-z0-9\-+=\s\.!%&[email protected]{}\[\]'_])+\.([A-Za-z0-9\-+=!%&[email protected]{}\[\]'_])+\s", RegexOptions.IgnoreCase); 
var shortname = match.Value; 
if (shortname == "") 
    shortname = name; 
else 
    shortname = shortname.Substring(0, shortname.Length - 1); 

Auch wenn Sie die Zeichenfolge

c geben : \ somefolder \ irgendwas Console.App.bat -k Etwas -i -user Bob anotherApp.exe

das Ergebnis wäre

einige Console.App.bat

+0

Dateinamen können viel mehr Zeichen enthalten als alphanumerische und Bindestriche. – CodeCaster

+0

Added sie und alle anderen verfügbaren Symbole – Artem

+0

Nizza, dies auch mit @ funktioniert "c: \ somefolder.14 \ something.exe \ someConsoleApp.exe -k Etwas -i -user Bob"; –

-1

verwenden Sie den folgenden Code, um dieses

 string p = @"c:\somefolder\some Console App.exe -k Something -i -user Bob"; 
     string s = p.Substring(0, p.IndexOf(".exe") + 4); 
     Console.WriteLine(p.Substring(0, p.IndexOf(".exe")+4)); 
     Console.WriteLine(Path.GetFileName(s)); 
+3

Und was, wenn das ausführbare Programm "Console App.exe" genannt wurde? – juharr

+0

'Einige ConsoleApp.exe' ist ein gültiger Dateiname –

+0

@all für alle, die hier niederstimmen machen die Lösung – rashfmnb

0

Sie tun Unter der Annahme, sind immer auf der Suche nach .exe Dateien, die Sie mit diesem gehen kann:

var p = @"c:\somefolder\someConsoleApp.exe -k Something -i -user Bob";    
var list = p.Split(new [] {".exe"}, StringSplitOptions.None); 
var program = list.First() + ".exe"; 
var param = list.LastOrDefault(); 
  • Programm =>c:\somefolder\someConsoleApp.exe
  • param =>-k Something -i -user Bob
+0

Exe könnte alles sein. Die Befehlszeichenfolge wird von einer API zurückgegeben, ich muss den Dateipfad und den Dateinamen in allen Szenarien extrahieren können, ohne ".exe" zu kennen –

0

für eine Windows-Befehlsfolge wie folgt aus:

var p = @"c:\somefolder\someConsoleApp.exe -k Something -i -user Bob"; 

Sie können die wirkliche Erweiterung dieses erhalten tun:

var extension = Path.GetExtension(p).Split().First(); 

dann die Erweiterung auf die reale ersetzen:

var path = Path.ChangeExtension(p, extension); 

Und schließlich die Argumente:

var query = p.Replace(path, string.Empty); 

OUTPUT:

extension = .exe 
path  = c:\somefolder\someConsoleApp.exe 
query  = -k Something -i -user Bob 
+0

Die Befehlsargumente könnten Erweiterungen enthalten, was würde ich für den Fall, dass nein? Ich bin der Meinung das Beste, was auf der ersten Periode in der Zeichenfolge zu tun sein könnte zu spalten, erhält dann die erste Teilkette auf dem zweite Element mit dem ersten Platz und das ist die Erweiterung. Dann ist alles danach Argumente. –

+0

Sie haben recht, 'GetExtension' und' ChangeExtension' nehmen die letzte '. *' Als Erweiterung. Aber das Teilen durch '.' und das Verwenden des zweiten Elements funktionieren nicht für Dateien wie my.app.exe. Beachten Sie auch, dass 'someConsoleApp.exe -k Something -i -user Bob' ein gültiger Dateiname ist. –