我尝试了下面的实验。
在开始之前,我检查了 cmd 中的 PATH 变量,它具有以下值:
Path=C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\ProgramData\Lenovo\ReadyApps;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files\Microsoft SQL Server\120\Tools\Binn\;C:\Program Files (x86)\Windows Live\Shared;C:\Program Files (x86)\Skype\Phone\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Calibre2\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;
起初,我以为 cmd 只会在 PATH 变量中包含的目录中查找可执行文件,因此我随机选择了一个应用程序 - winword.exe(Microsoft Word),并尝试从命令行启动它:
start winword
但令我惊讶的是,程序启动了!我之所以感到惊讶,是因为我已经搜索了 PATH 变量中的所有目录以查找名为“winword”的 exe 文件,但所有搜索均无结果!
因此,我得出结论,命令提示符必须知道在 PATH 变量中指定的位置以外的地方搜索可执行文件。
显然,我接下来要做的就是查找“winword”可执行文件所在的确切位置。事实证明,winword.exe 位于此处:
C:\Program Files\Microsoft Office 15\root\office15
因此,我想到 CMD 在执行“start”命令时可能会自动查看 ProgramFiles 和 ProgramFiles(x86)(及其所有子目录)?这导致我尝试启动计算机上安装的另一个应用程序 Audacity,其 exe 文件位于:
C:\Program Files (x86)\Audacity
再次令我惊讶的是,当我输入以下内容时,Audacity 无法启动:
start audacity
在命令行中。
然后我将包含 audacity.exe 的目录添加到 PATH:
set path=%path%;C:\Program Files (x86)\Audacity
之后我尝试再次启动 Audacity:
start audacity
嗯,毫不奇怪,Audacity 推出了。
我想知道的是命令提示符究竟在哪里查找可执行文件?为什么即使包含 winword.exe 的目录不属于 PATH 的一部分,winword.exe 也会启动,而 audacity.exe 却不是这样?
我也尝试了其他应用程序。当我使用启动命令时,Chrome 和 Firefox 可以正常工作。
更新:我正在运行 Windows 版本 6.3.9600(Windows 8.1)
答案1
起初,我以为 cmd 只会在 PATH 变量中包含的目录中查找可执行文件,因此我随机选择了一个应用程序 - winword.exe(Microsoft Word)并尝试从命令行启动它:
原因winword.exe
在于存在一个注册表项,它定义了 Microsoft Word (Winword.exe) 的路径。如果安装了 Firefox.exe 和 Chrome.exe,则存在类似的注册表项。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
我想知道命令提示符究竟在哪里寻找可执行文件?
系统 PATH 变量、用户 PATH 变量以及其中的各种键..\App Paths
。我可以确认 Audacity 在安装时不会为自己创建键。
当使用可执行文件的名称作为 lpFile 参数调用 ShellExecuteEx 函数时,该函数会在多个位置查找该文件。我们建议在 App Paths 注册表子项中注册您的应用程序。这样做可以避免应用程序修改系统 PATH 环境变量。
- 当前工作目录。
- 仅限 Windows 目录(不搜索子目录)。
- Windows\System32 目录。
- PATH 环境变量中列出的目录。
- 推荐:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
来源:应用程序注册
答案2
在命令提示符下,如果您只是输入,WinWord
它将无法运行。
如果你输入START WinWord
它就会运行。
命令Start
在这里是关键。
当您尝试通过启动命令执行文件时,命令提示符不会执行任何搜索。相反,它会将文件名(和参数)传递给 Windows 本身(通过 ShellExecuteEx API 调用),然后 Windows 必须搜索文件的位置。它会按以下顺序搜索几个地方:
当前工作目录。
仅限目录
Windows
(不搜索子目录)。目录
Windows\System32
。环境变量中列出的目录
PATH
。受到推崇的:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
WinWord
位于该注册表项中。该项的存在是为了避免PATH
太长。
答案3
在 Windows 命令处理器(CMD.EXE)中,可以在找到以下内容时启动该程序(在命令提示符中指定其模块名称而不指定驱动器/路径):
通过 PATH 环境变量(可执行文件及其同名的硬链接/软链接/快捷方式)
通过 DOSKEY 别名
通过应用程序路径
HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths
或HKCU\Software\Microsoft\Windows\CurrentVersion\App Paths
(使用start
命令时)
利用这些知识(尤其是最后一个),您可以创建自己的别名。例如,您可以HKCU\Software\Microsoft\Windows\CurrentVersion\App Paths\au.exe
使用默认值创建C:\Program Files (x86)\Audacity\Audacity.exe
,然后只需start au
在命令提示符中键入即可启动此应用程序。
答案4
start winword
不会告诉命令提示符启动winword
。它告诉命令提示符使用start
参数启动winword
。 Start
使用自己的方法查找winword
。
只是winword
告诉命令提示符启动winword
。如果您尝试这样做,由于winword
不在 上PATH
,因此它不会启动。