.NET 命令行参数包含应用程序路径吗?
如果你关注过命令行参数,也许发现有时你会在命令行参数的第一个参数中中看到应用程序的路径,有时又不会。那么什么情况下有路径呢?
其实是否有路径只是取决于获取命令行参数的时候用的是什么方法。而这是 Windows 操作系统的机制,与具体的运行环境无关。
测试程序
考虑下面这样的测试程序:
using System;
using System.Globalization;
namespace Walterlv.Demo.CommandLines
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine($"参数总数:{args.Length}");
OutputArgsInfo(args);
Console.WriteLine($"按任意键继续……");
Console.ReadKey();
}
private static void OutputArgsInfo(string[] args)
{
var digitCount = (args.Length - 1).ToString(CultureInfo.InvariantCulture).Length;
for (var i = 0; i < args.Length; i++)
{
Console.WriteLine($"[{i.ToString().PadLeft(digitCount, ' ')}] {args[i]}");
}
}
}
}
当我们向命令行中传入参数的时候,我们可以得到所有的命令行。
▲ Main 函数中的命令行参数
这种行为与具体的 .NET SDK 无关。看我们的项目文件,可以发现,无论是老旧的 .NET Framework 4.5 还是新的 .NET Framework 4.7.2 还是更加主流的 .NET Core 2.1,命令行参数中都是没有应用程序路径的。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>net45;net472;netcoreapp2.1</TargetFrameworks>
</PropertyGroup>
</Project>
那为什么有时候会看到应用程序路径呢?
解释
在《Windows 核心编程》一书中有说到:
可以获得一个指向进程的完整命令行的指针,方法是调用 GetCommandLine 函数:
PTSTR GetCommandLine();
该函数返回一个指向包含完整命令行的缓存的指针,该命令行包括执行文件的完整路径名。
也就是说,调用 GetCommandLine 函数时,我们将得到包含执行文件的完整路径名的命令行参数。这个方法对应到 .NET 中,是 System.Environment.GetCommandLineArgs()。
于是修改我们刚刚的函数,加上 Environment.GetCommandLineArgs() 的调用:
using System;
using System.Globalization;
namespace Walterlv.Demo.CommandLines
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine($"Main 函数参数列表中参数总数:{args.Length}");
OutputArgsInfo(args);
args = Environment.GetCommandLineArgs();
Console.WriteLine($"GetCommandLineArgs 参数总数:{args.Length}");
OutputArgsInfo(args);
Console.WriteLine($"按任意键继续……");
Console.ReadKey();
}
private static void OutputArgsInfo(string[] args)
{
var digitCount = (args.Length - 1).ToString(CultureInfo.InvariantCulture).Length;
for (var i = 0; i < args.Length; i++)
{
Console.WriteLine($"[{i.ToString().PadLeft(digitCount, ' ')}] {args[i]}");
}
}
}
}
现在,我们能看到参数列表中多了应用程序的完整路径:
▲ GetCommandLineArgs 中的命令行参数
事实上这样的差异不止在 .NET 中有体现,整个 Windows 上的程序都是这样的特性。这在《Windows 核心编程》一书中是有说明的。
总结
- Main 函数的参数中不包含应用程序执行路径;
System.Environment.GetCommandLineArgs()得到的命令行参数中包含应用程序的执行路径;- Windows 上的所有程序其命令行参数的行为表现都是如此,这不是 .NET 的专属特性。
.NET 命令行参数包含应用程序路径吗?的更多相关文章
- R语言 使用命令行参数运行R程序
args_test.R 代码如下: Args <- commandArgs()cat("Args[1]=",Args[1],"\n")cat(" ...
- (转)C#_WinForm接收命令行参数
本文转载自:http://blog.csdn.net/lysc_forever/article/details/38356007 首先,我要仔细的声明下,本文讲的是接受命令行参数,让程序启动.而不是启 ...
- C#_WinForm接收命令行参数
C#_WinForm接收命令行参数 2014-08-03 10:17 534人阅读 评论(0) 收藏 举报 首先,我要仔细的声明下,本文讲的是接受命令行参数,让程序启动.而不是启动那个黑黑的框...我 ...
- Perl的命令行参数和ARGV
程序名:$0 $0表示当前正在运行的Perl脚本名.有3种情况: 如果执行方式为perl x.pl,则$0的值为x.pl而非perl命令本身 如果执行方式为./x.pl,则$0的值为./x.pl 如果 ...
- C语言中使用库函数解析命令行参数
在编写需要命令行参数的C程序的时候,往往我们需要先解析命令行参数,然后根据这些参数来启动我们的程序. C的库函数中提供了两个函数可以用来帮助我们解析命令行参数:getopt.getopt_long. ...
- Win32程序支持命令行参数的做法(转载)
转载:http://www.cnblogs.com/lanzhi/p/6470406.html 转载:http://blog.csdn.net/kelsel/article/details/52759 ...
- Win32程序支持命令行参数的做法
作者:朱金灿 来源:http://blog.csdn.net/clever101 首先说说Win 32 API程序如何支持命令行参数.Win 32程序的入口函数为: int APIENTRY _tWi ...
- 7z命令行参数中的路径
最近在自动化的过程中用到了7z命令行工具,发现其参数中的路径挺有意思的,在此总结一下.本文中所有demo使用的7z版本为:15.14 x64. 压缩某个文件夹 下面的命令会把g:\temp\目录和目录 ...
- Delphi 获取进程路径及命令行参数
Delphi 获取进程路径及命令行参数, 但有的进程获取时会报错,不知为啥 type PVOID64 = UINT64; _UNICODE_STRING = packed record Length ...
随机推荐
- ssm所需要的pom(jre8、tomcat8、spring4)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- c++第二十三天
p124~p126: 算数运算符 1.形如+ -(一元) * / % + -(二元)为算数运算符. 2.所有算数运算符都满足左结合律. 3.算数运算符的运算对象和求值结果都是右值. 4.在表达式求值之 ...
- SNMP学习笔记之SNMPWALK 命令
SNMPWALK是一个通过SNMP GET-NEXT类型PDU,实现对目标AGENT的某指定MIB分支信息进行完整提取输出的命令工作. 命令行: snmpwalk [选项] agent [oid] 选 ...
- ubuntu16.04安装tensorflow官方教程与机器学习资料【学习笔记】
tensorflow官网有官方的安装教程:https://www.tensorflow.org/install/install_linux google的机器学习官方快速入门教程:https://de ...
- 第四章 consul cluster
1.vagrant 为了模拟集群效果,使用vagrant. 1.1.首先下载vagrant https://www.vagrantup.com/downloads.html 说明:浏览器下载可能比较慢 ...
- Gym 101246H ``North-East''(LIS)
http://codeforces.com/gym/101246/problem/H 题意: 给出n个点的坐标,现在有一个乐队,他可以从任一点出发,但是只能往右上方走(包括右方和上方),要经过尽量多的 ...
- UVa 11383 少林决胜(二分图最佳完美匹配)
https://vjudge.net/problem/UVA-11383 题意: 给定一个N×N矩阵,每个格子里都有一个正整数W(i,j).你的任务是给每行确定一个整数row(i),每列也确定一个整数 ...
- 子网掩码与ip有实际关系吗?
子网掩码是作为ip地址的标识,还是本身就是ip地址的一部分?例如10.10.10.1/24和10.10.10.1/25是同一个ip地址吗? 作者:知乎用户链接:https://www.zhihu.co ...
- spark udf 初识初用
直接上代码,详见注释 import org.apache.spark.sql.hive.HiveContext import org.apache.spark.{SparkContext, Spark ...
- javascript之反柯里化(uncurrying)
在JavaScript中,当我们调用对象的某个方法时,其实不用去关心该对象原本是否被设计为拥有这个方法,这是动态类型语言的特点.可以通过反柯里化(uncurrying)函数实现,让一个对象去借用一个原 ...