如何删除命令行的exe部分

这是我的代码。 输入命令行是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): https : //stackoverflow.com/a/36203572/831138

而不是使用

 var rawCmd = Environment.CommandLine; 

您可以使用:

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

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

这只剥离了命令调用部分,无论你把它写成programprogram.exe.\programc:program"c:\Program Files\program""\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也会修剪第二个me ) 。 现在我也拿出了额外的空间。

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

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

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

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

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