我有一个文件a.cmd
。该文件的路径是C:\Program Files\a\a.cmd
,并且C:\Program Files\a
在PATH
环境变量中。当我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 启动文件的默认程序
.cmd
:cmd.exe
- Windows 注册表项决定哪些参数/如何传递给默认程序:
Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Classes\cmdfile\shell\runas\command
(default) : C:\WINDOWS\System32\cmd.exe /C "%1" %*
其中说明了:
cmd.exe
使用参数启动/C
,- 然后将第一个参数
%1
放在引号中(这也是为什么在进程命令行中看到双引号的原因) - 然后是剩余的参数
%*
(以空格分隔)
因此 powershell (或任何程序) 也可以将更多参数传递给 .cmd 脚本,例如a.cmd arg1 arg2