为什么我可以执行不在PATH环境变量中的程序?


9

我想知道为什么该命令java -version全局访问?

我可以从任何目录运行它,并且可以运行:

在此处输入图片说明

它是如何工作的?

这是我的系统PATH变量的样子:

C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;
%SystemRoot%\system32;
%SystemRoot%;
%SystemRoot%\System32\Wbem;
%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\

至于我,java.exe位于%programfiles%\java\jre7\bin



我目前没有详细信息,这就是为什么这是评论而不是答案,但是如果java.exe(或java.com等)不在您的位置PATH,则还有另一个注册表项可以指定可执行路径。
马克·赫德

1
@MarkHurd cmd(和CreateProcess)不检查“应用程序路径”注册表项,仅ShellExecute [并因此检查“运行”对话框]。
Random832 2012年

@MarkHurd,如你所料,这是不是在我的PATH变量..
Pacerier

1
@Pacerier在%SystemRoot%\ System32 \中找到了Java可执行文件
Dwayne Hinterlang

Answers:


13

通常,存在一组目录,Windows会在这些目录中找到重复使用的可执行文件,但是在实践中,没有特定的理由是否将命令用作全局命令。开发人员过去常常将其作为“全局”包含在内,他们可以自由地这样做。如果要将任何命令用作“全局”,则需要将命令添加为“ Windows环境变量”。为此,您可以使用以下方法

  1. 使用“ Windows系统属性”手动添加: 在此处输入图片说明

  2. 使用附加工具Setx.exe:

它不是标准Windows XP安装程序的一部分,但Windows XP Service Pack 2支持工具中包含一个名为setx.exe的命令行工具。该工具扩展了set命令,以便可以对环境变量进行永久更改。例如,要将文件夹C:\ New Folder添加到路径,命令将是

setx path "%PATH%;C:\New Folder" 
  1. 列出环境变量的脚本:

可以在命令提示符中使用“设置”命令,以及将其重定向到文本文件以列出当前环境变量的列表。该命令可能是

set > C:\env_list.txt 

文件名“ C:\ env_list.txt”可以替换为任意名称。

Microsoft也有一个VBScript,它在此页上列出了环境变量。

  1. 环境变量的注册表项:

对于那些具有编辑注册表经验的人,还有另一种方法可以更改环境变量。用户环境变量存储在注册表中的项中:

HKEY_CURRENT_USER\Environment

在关键字中找到系统变量:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

请注意,任何形式需要扩展的环境变量(例如,%PATH%)都必须作为REG_EXPAND_SZ注册表值存储在注册表中。编辑注册表主要是针对系统管理员使用的脚本,不建议普通PC用户使用。

您可以在此处找到有关它的更多信息


1
但是,java.exe位于中%programfiles%\java\jre7\bin。此文件夹没有出现在我的系统的PATH变量..
Pacerier

7
Java.exe也可以在%SystemRoot%\ System32 \中找到,该文件确实会出现在PATH变量中
Dwayne Hinterlang 2012年

5

“全局命令”由您的环境变量确定。

取决于要使用的操作系统来进行设置,这是完全不同的。

最通用的方法是

右键单击“我的电脑”,选择“属性”

在Windows7中,您必须在左侧窗格中选择“高级系统设置”。

打开“系统属性”对话框后,选择“高级”选项卡。

在底部,有一个按钮“环境变量”

在“环境变量”对话框中,您将能够为每个用户或整个系统配置环境变量。

例如,简化的系统变量“路径”看起来像这样...

C:\ Program Files \ Java \ jre6 \ bin ; C:\ Ruby19 \ bin;

这些路径中的可执行文件可以直接从命令行调用。

您可以从“运行”对话框调用calc,mspaint,cmd的原因是因为C:\ windows \ system32在Path环境变量中。

您可以在环境变量中添加自定义路径,请注意不要覆盖现有路径,并使用分号分隔路径。“;”

然后,您可以直接在命令行中从该路径运行可执行文件,而无需像java -version命令那样输入整个路径。

欲了解更多信息,请参见以下链接...

环境变量

了解和配置环境变量

全新安装上的Java.exe搜索


3

这是一个简单的which命令,它显示当前PATHEXT扩展名在PATH中的所有命令命中:

@for %%I in ("%path:;=\" "%") do @for %%E in (%pathext:;= %) do @if exist "%%~dpI%1%%E" @echo %%~dpI%1%%E

放进去where.cmd(如果可以的话which,可以从其他地方来!)并用调用where java

现在,在上面的评论中,我建议如果您的java没有出现PATH,则可以签入HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths [ref],但是在实际尝试此操作后,它不适用于命令行,仅适用于使用的东西ShellExecuteEx,例如Start RunstartCLI命令。


2

输入命令时,Shell将查看一个名为PATH的环境变量(%PATH%,$ PATH,取决于操作系统)。它查询PATH上的每个目录,以查看是否遇到与您输入的命令匹配的可执行文件。找到的第一个将被执行。

有关设置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.