这是我的代码。输入命令行为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} }
答案 0 :(得分:3)
无论您将其写为program
,program.exe
,.\program
,c: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;
}
测试完成:
[编辑] 测试未完成:
答案 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
}