【问题标题】:Get FileName from Command with Arguments从带有参数的命令中获取文件名
【发布时间】:2016-04-12 14:56:29
【问题描述】:

是否有任何 .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 包含整个内容,而 Arguments 为空。

【问题讨论】:

  • 不,因为您的文件可以具有以下名称:someConsoleApp.exe -k Something -i -user Bob。你必须手动解析它
  • 你为什么不先把这些字符串分开?
  • 你必须处理exe路径中的潜在空格吗?如果是这样,路径会被引用吗?这真的是唯一可以阻止你在空间上分裂的事情。
  • 拆分字符串并获取第一项,这应该是您的 exe 的名称
  • @Pankaj 除非 exe 名称中有空格。

标签: c# command-prompt


【解决方案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\.!%&$@{}\[\]'_])+\.([A-Za-z0-9\-+=!%&$@{}\[\]'_])+\s", RegexOptions.IgnoreCase);
var shortname = match.Value;
if (shortname == "")
    shortname = name;
else
    shortname = shortname.Substring(0, shortname.Length - 1);

即使你给了字符串

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

结果是

一些 Console.App.bat

【讨论】:

  • 文件名可以包含比字母数字和破折号更多的字符。
  • 添加了它们和所有其他可用的符号
  • 很好,这甚至适用于 @"c:\somefolder.14\something.exe\someConsoleApp.exe -k Something -i -user Bob";
  • 有没有办法让 Match 返回路径和文件名并且只删除参数?
  • 是:var fullpath = System.IO.Path.GetDirectoryName(input) + shortname;或者您的意思是根本不使用 IO.Path?
【解决方案2】:

对于这样的 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

【讨论】:

  • 命令 args 中可能有扩展名,我认为这会破坏它吗?我认为最好的办法可能是在字符串的第一个句点上拆分,然后将第二个元素上的第一个子字符串直到第一个空格,这就是扩展名。之后的一切都是争论。
  • 你是对的,GetExtensionChangeExtension 将最后一个 .* 作为扩展名。但是按. 拆分并获取第二个元素不适用于 my.app.exe 之类的文件。另请注意,someConsoleApp.exe -k Something -i -user Bob 是一个有效的文件名。
【解决方案3】:

假设您一直在寻找 .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

【讨论】:

  • Exe 可以是任何东西。命令字符串是从 API 返回的,我需要能够在不知道“.exe”的情况下提取所有场景中的文件路径和文件名
【解决方案4】:

使用下面的代码来做到这一点

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

【讨论】:

  • 如果可执行文件被命名为“some Console App.exe”呢?
  • Some ConsoleApp.exe 是一个有效的文件名
  • @all 为所有在这里投票的人提供解决方案
  • 我建议您可能希望将其更改为 .exe 它会寻找 +4,就像您喜欢 psexec.exe 一样
  • myexe.exe 呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多