如果你关注过命令行参数,也许发现有时你会在命令行参数的第一个参数中中看到应用程序的路径,有时又不会。那么什么情况下有路径呢?


其实是否有路径只是取决于获取命令行参数的时候用的是什么方法。而这是 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 核心编程》一书中是有说明的。

总结

  1. Main 函数的参数中不包含应用程序执行路径;
  2. System.Environment.GetCommandLineArgs() 得到的命令行参数中包含应用程序的执行路径;
  3. Windows 上的所有程序其命令行参数的行为表现都是如此,这不是 .NET 的专属特性。

.NET 命令行参数包含应用程序路径吗?的更多相关文章

  1. R语言 使用命令行参数运行R程序

    args_test.R 代码如下: Args <- commandArgs()cat("Args[1]=",Args[1],"\n")cat(" ...

  2. (转)C#_WinForm接收命令行参数

    本文转载自:http://blog.csdn.net/lysc_forever/article/details/38356007 首先,我要仔细的声明下,本文讲的是接受命令行参数,让程序启动.而不是启 ...

  3. C#_WinForm接收命令行参数

    C#_WinForm接收命令行参数 2014-08-03 10:17 534人阅读 评论(0) 收藏 举报 首先,我要仔细的声明下,本文讲的是接受命令行参数,让程序启动.而不是启动那个黑黑的框...我 ...

  4. Perl的命令行参数和ARGV

    程序名:$0 $0表示当前正在运行的Perl脚本名.有3种情况: 如果执行方式为perl x.pl,则$0的值为x.pl而非perl命令本身 如果执行方式为./x.pl,则$0的值为./x.pl 如果 ...

  5. C语言中使用库函数解析命令行参数

    在编写需要命令行参数的C程序的时候,往往我们需要先解析命令行参数,然后根据这些参数来启动我们的程序. C的库函数中提供了两个函数可以用来帮助我们解析命令行参数:getopt.getopt_long. ...

  6. Win32程序支持命令行参数的做法(转载)

    转载:http://www.cnblogs.com/lanzhi/p/6470406.html 转载:http://blog.csdn.net/kelsel/article/details/52759 ...

  7. Win32程序支持命令行参数的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 首先说说Win 32 API程序如何支持命令行参数.Win 32程序的入口函数为: int APIENTRY _tWi ...

  8. 7z命令行参数中的路径

    最近在自动化的过程中用到了7z命令行工具,发现其参数中的路径挺有意思的,在此总结一下.本文中所有demo使用的7z版本为:15.14 x64. 压缩某个文件夹 下面的命令会把g:\temp\目录和目录 ...

  9. Delphi 获取进程路径及命令行参数

    Delphi 获取进程路径及命令行参数, 但有的进程获取时会报错,不知为啥 type PVOID64 = UINT64; _UNICODE_STRING = packed record Length ...

随机推荐

  1. CentOS7 忘了root密码怎么办

    今天打开很久没开机的另2台虚拟机,发现不记得root密码了. 于是参考了google搜索到的第一个答案,https://www.unixmen.com/reset-root-password-cent ...

  2. 前端学习笔记之CSS属性设置

    CSS属性设置   阅读目录 一 字体属性 二 文本属性 三 背景属性 四 盒子模型 五 盒子模型各部分详解 一 字体属性 1.font-weight:文字粗细 取值 描述 normal 默认值,标准 ...

  3. InstallShieldPro 2015中Basic MSI工程类型如何调用InstallScript脚本

    转载:http://blog.csdn.net/mengzhishen/article/details/8953901 这是一个Basic MSI基础知识. A. 首先在Installation De ...

  4. python 生成zip压缩包

    import zipfile file_name="a.txt" f = zipfile.ZipFile('test.zip','w',zipfile.ZIP_STORED) f. ...

  5. Java回顾之ORM框架

    这篇文章里,我们主要讨论ORM框架,以及在使用上和JDBC的区别. 概述 ORM框架不是一个新话题,它已经流传了很多年.它的优点在于提供了概念性的.易于理解的数据模型,将数据库中的表和内存中的对象建立 ...

  6. vue-router详解

    对于单页应用,官方提供了vue-router进行路由跳转的处理,本篇主要也是基于其官方文档写作而成. 安装 基于传统,我更喜欢采用npm包的形式进行安装. npm install vue-router ...

  7. JavaScript--语法2--语句结构

    JavaScript--语句结构 一.心得 判断的时候常量放左边java中switch只支持四种类型,javaScript是弱类型,所有的都支持. 显示方法: 77 // alert("x= ...

  8. 一个故意消耗内存的java程序MemoryEater

    公司提供的测试服务器是vmware的,号称给我6G, 物理内存事实上是按需分配的. 等到真正拿到6G物理内存,黄花菜都凉了. 看到下面的文章,觉得故意用java程序侵占6G内存, 然后把侵占到内存的释 ...

  9. API To Import Negotiations(转)

    原文地址 API To Import Negotiations

  10. hdu5818

    题解: 维护两个左偏树 按照左偏树模板来做 代码: #include<cstdio> #include<cmath> #include<algorithm> #in ...