启动应用程序时,Windows命令提示符是否在PATH变量指定的位置之外的其他位置搜索?


35

我尝试了以下实验。

在开始之前,我检查了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可能会自动浏览ProgramFiles和ProgramFiles(x86)(及其所有子目录)吗?这导致我尝试启动计算机上安装的另一个应用程序Audacity,该exe文件位于:

C:\Program Files (x86)\Audacity

再次让我惊讶的是,当我键入以下内容时,Audacity无法启动:

start audacity

在命令行中。

在此处输入图片说明

然后,我将包含audacity.exe的目录添加到PATH:

set path=%path%;C:\Program Files (x86)\Audacity

之后,我再次尝试启动Auda​​city:

start audacity

好吧,毫不奇怪,Audacity推出了。

我想知道的是命令提示符在何处查找可执行文件?为什么即使在包含winword.exe的目录不属于PATH的情况下启动winword.exe,但对于audacity.exe来说却并非如此?

我也尝试了其他应用程序。当我使用启动命令时,Chrome和Firefox可以工作。

更新:我正在运行Windows版本6.3.9600(Windows 8.1)


Answers:


44

最初,我认为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函数时,该函数会在多个位置查找文件。我们建议您在“应用程序路径”注册表子项中注册您的应用程序。这样做避免了应用程序需要修改系统PATH环境变量的需要。

  • 当前的工作目录。
  • 仅Windows目录(不搜索子目录)。
  • Windows \ System32目录。
  • PATH环境变量中列出的目录。
  • 推荐:HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ App路径

资料来源:申请注册


15

在命令提示符下,如果仅输入WinWord它将无法运行。

如果输入,START WinWord它将运行。

Start命令是关键。

当您尝试通过启动命令执行文件时,命令提示符不会执行任何搜索。相反,它将文件名(和参数)传递给Windows本身(通过ShellExecuteEx API调用),然后Windows必须搜索文件的位置。它按以下顺序搜索多个位置:

  • 当前的工作目录。

  • Windows目录只(不子目录中搜索)。

  • Windows\System32目录。

  • 目录在PATH环境变量中列出。

  • 推荐的:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

WinWord在该注册表项中。关键在于不要PATH太长。


7
请引用并引用所有资料。除非您从内存中编写了搜索顺序,否则您应该引用您的来源,该来源指出了列表及其搜索顺序。
Ramhound

来源将是我几年前从事的工作中得到的笔记。我不知道当时从哪里捡来的,网页来来去去。
拉里克

5
您从其他所有人都从同一文档中获得了它们。
Ramhound

7

找到以下命令后,即可启动Windows命令处理器(CMD.EXE)中的程序(当您在命令提示符下指定其模块名称而不包含驱动器/路径时):

  • 通过PATH环境变量(可执行文件及其同名的hardlink / softlink / shortcut)

  • 通过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在命令提示符下键入即可启动此应用程序。


0

尽管其他答案可能是您所遇到的具体原因,但对于其他问题,您可能还会遇到其他问题的答案:在您所查找的相同位置,但是具有不同的文件扩展名。

您专门说过您正在搜索扩展名为的文件exe。Windows还将尝试执行其他扩展名的文件。

执行命令时起作用的另一个环境变量是变量PATHEXT。这是;要执行的文件扩展名的分隔列表。如果您回声,PATHEXT您可能会看到类似.COM;.EXE;.BAT;.CMD;.VBS;...(等)的信息。某些应用程序将这些其他文件类型用作最终用户入口点。它很少见,但确实发生了。我已经使用了几种主要的从.BAT脚本开始的商业产品。以其中之一为例,standalone即使没有standalone.exe... ,我也可以使用命令启动它,而它有一个standalone.bat

PATHEXT我现在正在查看的某些扩展程序从未使用过应用程序。那些我已经更加普遍碰上(但显然不如exe)为:.com.bat.vbs.js.jar。前两个是Windows批处理脚本文件,其他三个是用于特定编程语言的文件类型,这些语言是从脚本或虚拟机而不是exes(分别是Visual Basic,javascript和Java)运行的。


不愿投票的人发表评论(我知道问通常是徒劳的,但有时我会得到回应)?我在某处犯错了吗?
罗杜维克

不是我,而是一个疯狂的猜测,这是因为虽然PATHEXT和和PATH都与使事情运行有关,但它们在各自的任务中有些正交。 PATH指定要在哪里查找要运行的事物,这是OP询问的内容,同时PATHEXT指定可以运行的事物
dgnuff

@dgnuff有趣,因为那是我的观点:OP以乞求帧挑战的方式专门表达了这个问题……用SE术语,他们通过假设正在运行的文件没有被问到“ XY问题”。在路径上已经被搜索到的地方。不管怎样,谢谢。
罗杜维克18'Aug

0

start winword不会告诉命令提示符启动winword。它告诉命令提示符start使用arguments 启动winwordStart使用自己的方法查找winword

只是winword告诉命令提示符启动winword。而且,如果尝试这样做,则由于winword不在上PATH,因此不会启动。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.