C# 从带有参数的命令中获取文件名

C# 从带有参数的命令中获取文件名,c#,command-prompt,C#,Command Prompt,是否有任何.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); 输出 someConsol

是否有任何.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也许能以某种方式实现这一点,但它也有同样的问题,文件名包含全部内容,参数为空。

使用以下代码来实现这一点

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

假设您一直在查找
.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
  • param=>
    -k Something-i-user Bob

对于以下windows命令字符串:

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

可以使用正则表达式处理任何文件名(带空格和句点)

即使你给了绳子

c:\somefolder\some Console.App.bat-k Something-i-user Bob anotherApp.exe

结果将是


some Console.App.bat

否,因为您的文件可以有以下名称:
someConsoleApp.exe-k Something-i-user Bob
。你必须用手工解析它为什么你不首先把这些字符串分开?你必须处理exe路径中的潜在空格吗?如果是的话,会引用路径吗?这是唯一可能阻止您在空间上拆分的东西。拆分字符串并获取第一项,这应该是您的名称exe@Pankaj除非exe名称中有空格。如果可执行文件名为“some Console App.exe”,该怎么办?
某些ConsoleApp.exe
是有效的filename@all对于所有在这里投票的人,解决方案ID建议您可能希望将其更改为.exe,它将查找+4,如果您喜欢psexec.exe,那么
myexe.exe
呢?文件名可以包含比字母数字和破折号多得多的字符。添加它们和所有其他可用的符号nice,这甚至可以与@“c:\somefolder.14\something.exe\someConsoleApp.exe-k something-i-user Bob”一起使用;是否有方法获取匹配项以返回路径和文件名,并且只删除参数?是:var fullpath=System.IO.path.GetDirectoryName(输入)+shortname;或者你的意思是根本不使用IO.Path?命令args中可能有扩展名,我想这会打破这个不?我认为最好的办法可能是在字符串的第一个句点上拆分,然后将第二个元素的第一个子字符串放到第一个空间,这就是扩展。你是对的,
GetExtension
ChangeExtension
将最后一个
*
作为扩展名。但是按
拆分并获取第二个元素对于像my.app.exe这样的文件不起作用。还要注意的是,
someConsoleApp.exe-k Something-i-user Bob
是一个有效的文件名。exe可以是任何东西。命令字符串是从API返回的,我需要能够在不知道“.exe”的情况下提取所有场景中的文件路径和文件名
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\.!%&$@{}\[\]'_])+\.([A-Za-z0-9\-+=!%&$@{}\[\]'_])+\s", RegexOptions.IgnoreCase);
var shortname = match.Value;
if (shortname == "")
    shortname = name;
else
    shortname = shortname.Substring(0, shortname.Length - 1);