如何删除命令行的exe部分

时间:2016-03-24 15:50:42

标签: c#

这是我的代码。输入命令行为var1 val1 var2 val2

var rawCmd = Environment.CommandLine;
// Environment.CommandLine adds the .exe info that I don't want in my command line:
// rawCmd = "path\to\ProjectName.vshost.exe" var1 val1 var2 val2

// A. This correction makes it work, although it is pretty ugly:
var cleanCmd = rawCmd.Split(new string[] { ".exe\" " }, StringSplitOptions.None)[1];

// B. This alternative should be cleaner, but I can't make it work:
var exePath = System.Reflection.Assembly.GetCallingAssembly().Location;
cleanCmd = rawCmd.Replace(string.Format($"\"{exePath}\" "), "");

所以要使 B 工作,我应该能够找到.vhost.exe信息(我无法找到)。

但我也想知道是否有更清洁的方法来做这一切。

至于我想实现此目的的原因,这里是解释( tl; dr:从命令行解析json):{{3} }

5 个答案:

答案 0 :(得分:3)

无论您将其写为programprogram.exe.\programc:program"c:\Program Files\program",{{1 }}等或路径分隔符。

"\Program Files\program.exe"

它将保留双引号,脱字号以及参数之间的空格,甚至在开始处即程序名称之后的空格。请注意,开始时还有多余的空间,不要问我为什么。 如果让您感到困扰,请删除第一个字符,这应该很容易。最后一个var exe = Environment.GetCommandLineArgs()[0]; // Command invocation part var rawCmd = Environment.CommandLine; // Complete command var argsOnly = rawCmd.Remove(rawCmd.IndexOf(exe),exe.Length).TrimStart('"').Substring(1); 。我定义了两个变量以使其更具可读性。

编辑:
考虑到加引号的调用以及程序名称字符串恰巧出现在参数中的情况(例如,如果您的程序是.Substring(1)且您运行me.exe,则me "Call me Ishmael"会修剪第二.Replace也是如此)。现在我也要占用多余的空间。

答案 1 :(得分:2)

而不是使用

var rawCmd = Environment.CommandLine;

您可以使用:

var rawCmd = Environment.CommandLine;
var argsOnly = rawCmd.Replace("\"" + Environment.GetCommandLineArgs()[0] + "\"", "");

这将在您的示例中返回“var1 val1 var2 val2”。它应该与另一篇文章中的JSON示例一起使用。

答案 2 :(得分:2)

这是一个非常古老的问题,但从 Windows 10 20H2 和 .NET Framework 4.8 开始,上述所有解决方案似乎都以一种或另一种方式被破坏(例如,双引号分隔的 exe 路径)。

我需要以更通用的方式从 Environment.CommandLine 中删除 exe,因此我决定尝试基于正则表达式的方法。 (然后我遇到了 2 个问题,哈哈。)希望这对某人有所帮助!

    internal static string GetRawCommandLineArgs( )
    {
        // Separate the args from the exe path.. incl handling of dquote-delimited full/relative paths.
        Regex fullCommandLinePattern = new Regex(@"
            ^ #anchor match to start of string
                (?<exe> #capture the executable name; can be dquote-delimited or not
                    (\x22[^\x22]+\x22) #case: dquote-delimited
                    | #or
                    ([^\s]+) #case: no dquotes
                )
                \s* #chomp zero or more whitespace chars, after <exe>
                (?<args>.*) #capture the remainder of the command line
            $ #match all the way to end of string
            ",
            RegexOptions.IgnorePatternWhitespace|
            RegexOptions.ExplicitCapture|
            RegexOptions.CultureInvariant
        );

        Match m = fullCommandLinePattern.Match(Environment.CommandLine);
        if (!m.Success) throw new ApplicationException("Failed to extract command line.");

        // Note: will return empty-string if no args after exe name.
        string commandLineArgs = m.Groups["args"].Value;
        return commandLineArgs;
    }

测试完成:

  • 带/不带双引号的exe路径
  • 包含双引号并引用 exe 名称的参数
  • 调用不带参数的 exe 返回空字符串

[编辑] 测试未完成:

  • .NET 5 或任何其他运行时或操作系统

答案 3 :(得分:0)

我找到了获取vhost路径的方法:

var exePath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, System.AppDomain.CurrentDomain.FriendlyName);

...虽然我担心它可能导致不一致,具体取决于代码的执行位置(调试/生产......)。我希望不会,我将不得不继续测试。

答案 4 :(得分:0)

如果元素之间的空格数不重要,则只能Join参数数组,它在未加引号的空格字符上拆分,并且不包含可执行文件:

void Main(string[] args)
{
     var cleanCmd = string.Join(" ", args);
     // etc
}