Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NET中获取原始(未拆分)命令行_C#_.net_Command Line Arguments - Fatal编程技术网

C# 在.NET中获取原始(未拆分)命令行

C# 在.NET中获取原始(未拆分)命令行,c#,.net,command-line-arguments,C#,.net,Command Line Arguments,在.NET中,我们可以从Main(string[])或Environment.GetCommandLineArgs()的参数轻松访问字符串数组中的拆分命令行参数。但是,有没有办法将未解析的命令行作为一个字符串 背景:我的应用程序正在将自己添加到FileExplorer上下文菜单(就像记事本+)中。当它以这种方式启动时,文件名将不加引号地传入,这意味着如果路径中有空格,它将被分解。我知道我可以通过在注册表中的引号中包含%1来解决此问题,如myapp.exe“%1”,但当我检查其他应用程序的注册表时

在.NET中,我们可以从
Main(string[])
Environment.GetCommandLineArgs()的参数轻松访问字符串数组中的拆分命令行参数。但是,有没有办法将未解析的命令行作为一个字符串


背景:我的应用程序正在将自己添加到FileExplorer上下文菜单(就像记事本+)中。当它以这种方式启动时,文件名将不加引号地传入,这意味着如果路径中有空格,它将被分解。我知道我可以通过在注册表中的引号中包含
%1
来解决此问题,如
myapp.exe“%1”
,但当我检查其他应用程序的注册表时,他们没有这样做。它们就像
notepad.exe%1
-它们得到了完整的命令行。我想知道它在.NET中是否可行以及如何实现。

尝试使用:
Environment.CommandLine
来获取必须从内核32调用的未经分析、原始、未修改的命令行。操作系统将进行一些解析。例如,无论使用何种技术,诸如foo.txt等IO重定向都将从命令行文本中排除

CommandLine可能就足够了,但请注意,它会删除参数之间的间隙空间(除非参数本身包含在引号中),并从引用的参数中删除引号

例如,对于命令行:

test.exe这是一个“测试”

CommandLine等于:“
这是一个测试

但GetCommandLine会产生:
test.exe这是一个“测试”
,空格和引号以及exe的路径保持不变


注意使用此技术时,您必须手动解析命令行文本,这可能涉及剥离到exe的路径,如果路径包含空格,则exe路径本身可能会被括在引号中。

Huh,不要显示您描述的行为
Environment.CommandLine
在我尝试的所有情况下都匹配
PInvoke
。我从
Environment.CommandLine
得到的结果与.NET 4.5.2中的PInvoke相同。你说得对。在我当前的系统设置中,两者都给出了相同的结果。我还没有找到我用来测试它的示例应用程序和系统(那是一年前的事),但如果它曾经坏过,它一定是来自比现在更旧的OS+.NET+编译器版本集。例如,这可能仅适用于较旧的VS更新。不知道是哪个版本。当我有机会的时候,我会尝试找出我使用的版本。无论如何,你是对的,这在当前的软件中并不明显。也许某个时候有个bug修复?我不能断定这在某一点上不是真的。Thx.我可以使用命令
dotnet run p1=123 p2=“一两个”
重现差异。它转换为:
dotnet run p1=123“p2=1-2”
。有没有办法从中轻松删除可执行文件名?@JaredBeach.Replace(Application.ExecutablePath,“”)@JaredBeach.BTW,
Environment.CommandLine
不是原始命令行——它是在交给控制台应用程序之前处理的。有关详细信息,请参阅