cmd如何获取参数列表

cmd如何获取参数列表

我有一个文件a.cmd。该文件的路径是C:\Program Files\a\a.cmd,并且C:\Program Files\aPATH环境变量中。当我a.cmd从 PowerShell(v. 7.2)调用时,我看到创建了一个具有以下命令行的进程:

C:\WINDOWS\system32\cmd.exe /c ""C:\Program Files\a\a.cmd""

我想知道引号添加了什么(OS、PowerShell 还是其他)以及 cmd.exe 如何处理参数列表。当我用自定义 .NET 程序替换 cmd.exe(例如通过更改COMSPEC环境变量)时,我看到以下命令行参数(从 cmd.exe 替换角度来看):

arg 0: /c
arg 1: C:\Program
arg 2: Files\a\a.cmd

整个命令行是(System.Environment.CommandLine):

replaced.exe /c C:\Program Files\a\a.cmd

这对我来说很有意义。

据我所知,操作系统会解析命令行并将其传递给进程。cmd.exe 如何处理这些参数以及 cmd.exe 如何打开正确的文件?

答案1

引文补充道:CMD 中的双引号可以有时可以通过将它们加倍转义为""。在这种情况下,CMD 只会将它们视为一个双引号。如果启动程序未引用该路径,则使用第二个双引号。

cmd.exe 如何处理参数列表:对此有很多传统的答案,但在这种情况下:

  • Powershell 启动文件的默认程序.cmdcmd.exe
  • Windows 注册表项决定哪些参数/如何传递给默认程序:
Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Classes\cmdfile\shell\runas\command

(default)    : C:\WINDOWS\System32\cmd.exe /C "%1" %*

其中说明了:

  1. cmd.exe使用参数启动/C
  2. 然后将第一个参数%1放在引号中(这也是为什么在进程命令行中看到双引号的原因)
  3. 然后是剩余的参数%*(以空格分隔)

因此 powershell (或任何程序) 也可以将更多参数传递给 .cmd 脚本,例如a.cmd arg1 arg2

相关内容