2016-04-12 2 views
0

Существуют ли какие-либо методы .Net, которые могут извлекать путь и имя файла из командной строки Windows и не включать аргументы?Получить имя_файла из команды с аргументами

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

Я попытался с помощью FileInfo, Path.GetFileName, и другие, каждый раз, когда объект имеет в нем команды.

Например,

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

выход

someConsoleApp.exe -k Something -i -user Bob 

Я хочу, чтобы получить только "someConsoleApp.exe" Предпочтительно, имеющий доступ к аргументам к.

ProcessStartInfo может сделать это как-то, но имеет ту же проблему, что и в FileName, и Аргументы пустые.

+0

Нет, так как файл ** ** может иметь следующее имя: 'someConsoleApp.exe -k что-то -i -user Bob' ,Вы должны разобрать его вручную –

+1

Почему бы вам просто не разделить эту строку в первую очередь? – rinukkusu

+1

Вам нужно обрабатывать потенциальные пространства на пути к exe? И если бы этот путь был процитирован? Это действительно единственное, что может помешать вам просто расстаться по космосу. – juharr

ответ

1

Вы можете использовать регулярное выражение для обработки с любым именем (с пробелами и периодов)

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); 

Даже если вы даете строковое

гр : \ somefolder \ some Console.App.bat -k Что-то -i -user Bob anotherApp.exe

результат будет

некоторые Console.App.bat

+0

Имена файлов могут содержать намного больше символов, чем буквенно-цифровые и тире. – CodeCaster

+0

Добавил их и все другие доступные символы – Artem

+0

Приятный, это даже работает с @ "c: \ somefolder.14 \ something.exe \ someConsoleApp.exe -k Что-то -i -user Bob"; –

-1

использовать следующий код, чтобы сделать это

 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

И что, если исполняемый файл был назван «Some Console App.exe»? – juharr

+0

'Some ConsoleApp.exe' является допустимым именем файла –

+0

@all для всех тех, кто делает голосование здесь, является решением – rashfmnb

0

Предполагая, что вы всегда ищем .exe файлы, которые вы можете пойти с этим:

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(); 
  • программа =>c:\somefolder\someConsoleApp.exe
  • парам =>-k Something -i -user Bob
+0

Exe может быть любым. Командная строка возвращается из API, мне нужно иметь возможность извлекать путь к файлу и имя файла во всех сценариях, не зная «.exe». –

0

Для командного окна строки, как это:

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

Вы можете получить реальное расширение делает это:

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

Затем замените расширение к реальному:

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

И, наконец, получите аргументы:

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

ВЫВОД:

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

У команды args могут быть расширения в них, которые, я думаю, сломают, что нет? Я думаю, что лучше всего было бы разделить на первый период в строке, а затем получить первую подстроку на втором элементе до первого пространства, и это расширение. Тогда все, что после этого, является аргументами. –

+0

Вы правы, 'GetExtension' и' ChangeExtension' принимает последний '. *' Как расширение. но разделение на '.' и принятие второго элемента не будет работать для таких файлов, как my.app.exe. Также обратите внимание, что 'someConsoleApp.exe -k Something -i -user Bob' является допустимым именем файла. –

Смежные вопросы