我试图在Windows中添加C:\xampp\php到我的系统PATH环境变量。

我已经使用环境变量对话框添加了它。

但当我在控制台输入:

C:\>path

它不会显示新的C:\xampp\php目录:

PATH=D:\Program Files\Autodesk\Maya2008\bin;C:\Ruby192\bin;C:\WINDOWS\system32;C:\WINDOWS;
C:\WINDOWS\System32\Wbem;C:\PROGRA~1\DISKEE~2\DISKEE~1\;c:\Program Files\Microsoft SQL
Server\90\Tools\binn\;C:\Program Files\QuickTime\QTSystem\;D:\Program Files\TortoiseSVN\bin
;D:\Program Files\Bazaar;C:\Program Files\Android\android-sdk\tools;D:\Program Files\
Microsoft Visual Studio\Common\Tools\WinNT;D:\Program Files\Microsoft Visual Studio\Common
\MSDev98\Bin;D:\Program Files\Microsoft Visual Studio\Common\Tools;D:\Program Files\
Microsoft Visual Studio\VC98\bin

我有两个问题:

为什么会发生这种情况?我做错什么了吗? 另外,如何使用控制台(并以编程方式,使用批处理文件)向PATH变量添加目录?


当前回答

我会用PowerShell代替!

使用PowerShell将一个目录添加到PATH,执行以下操作:

$PATH = [Environment]::GetEnvironmentVariable("PATH")
$xampp_path = "C:\xampp\php"
[Environment]::SetEnvironmentVariable("PATH", "$PATH;$xampp_path")

要为机器范围内的所有用户设置变量,最后一行应该如下所示:

[Environment]::SetEnvironmentVariable("PATH", "$PATH;$xampp_path", "Machine")

在PowerShell脚本中,您可能希望在添加到PATH之前检查是否存在C:\xampp\php(以防之前已经添加了它)。你可以用if条件句把它包装起来。

所以把它们放在一起:

$PATH = [Environment]::GetEnvironmentVariable("PATH", "Machine")
$xampp_path = "C:\xampp\php"
if( $PATH -notlike "*"+$xampp_path+"*" ){
    [Environment]::SetEnvironmentVariable("PATH", "$PATH;$xampp_path", "Machine")
}

更好的是,可以创建一个泛型函数。只需提供您希望添加的目录:

function AddTo-Path{
param(
    [string]$Dir
)

    if( !(Test-Path $Dir) ){
        Write-warning "Supplied directory was not found!"
        return
    }
    $PATH = [Environment]::GetEnvironmentVariable("PATH", "Machine")
    if( $PATH -notlike "*"+$Dir+"*" ){
        [Environment]::SetEnvironmentVariable("PATH", "$PATH;$Dir", "Machine")
    }
}

你可以通过打磨来让事情变得更好。例如,使用Test-Path确认目录确实存在。

其他回答

我会用PowerShell代替!

使用PowerShell将一个目录添加到PATH,执行以下操作:

$PATH = [Environment]::GetEnvironmentVariable("PATH")
$xampp_path = "C:\xampp\php"
[Environment]::SetEnvironmentVariable("PATH", "$PATH;$xampp_path")

要为机器范围内的所有用户设置变量,最后一行应该如下所示:

[Environment]::SetEnvironmentVariable("PATH", "$PATH;$xampp_path", "Machine")

在PowerShell脚本中,您可能希望在添加到PATH之前检查是否存在C:\xampp\php(以防之前已经添加了它)。你可以用if条件句把它包装起来。

所以把它们放在一起:

$PATH = [Environment]::GetEnvironmentVariable("PATH", "Machine")
$xampp_path = "C:\xampp\php"
if( $PATH -notlike "*"+$xampp_path+"*" ){
    [Environment]::SetEnvironmentVariable("PATH", "$PATH;$xampp_path", "Machine")
}

更好的是,可以创建一个泛型函数。只需提供您希望添加的目录:

function AddTo-Path{
param(
    [string]$Dir
)

    if( !(Test-Path $Dir) ){
        Write-warning "Supplied directory was not found!"
        return
    }
    $PATH = [Environment]::GetEnvironmentVariable("PATH", "Machine")
    if( $PATH -notlike "*"+$Dir+"*" ){
        [Environment]::SetEnvironmentVariable("PATH", "$PATH;$Dir", "Machine")
    }
}

你可以通过打磨来让事情变得更好。例如,使用Test-Path确认目录确实存在。

如果您运行命令cmd,它将更新该命令窗口的所有系统变量。

选项1

在使用GUI更改PATH之后,关闭并重新打开控制台窗口。

这是可行的,因为只有在更改之后启动的程序才能看到新的PATH。

选项2

此选项仅影响当前shell会话,而不会影响整个系统。在已打开的命令窗口中执行以下命令:

set PATH=%PATH%;C:\your\path\here\

该命令将C:\your\path\here\追加到当前路径。如果路径包含空格,则不需要包含引号。

分解一下:

set -仅为当前cmd会话更改cmd的环境变量的命令;其他程序和系统不受影响。 PATH= -表示PATH是要临时更改的环境变量。 %PATH%;C:\your\ PATH \here\ - %PATH%部分扩展为PATH的当前值,然后;C:\your\ PATH \here\被连接到它。这将成为新的PATH。

命令行更改将不是永久的,并且将在控制台关闭时丢失。 这条路就像先到先得一样。 您可能希望覆盖其他已经包含的可执行文件。例如,如果您的路径上已经有了另一个版本,而您希望添加不同的版本,而不需要对路径进行永久更改,则应该将目录放在命令的开头。

重写已包含的可执行文件;

设置路径= C: \ xampp \ php; % %路径;

在Windows 10 LTSB上查看上述建议,并浏览一下“帮助”概要(可以在输入'command /?’),让我得出结论,PATH命令只改变当前会话的系统环境变量PATH值,但重新启动后,所有值重置为默认值-就像使用PATH命令之前一样。

另一方面,使用具有管理权限的SETX命令要强大得多。它会永久地改变这些值(或者至少在下次使用此命令或在下一次手动GUI操作这些值之前……).

最适合我的SETX语法用法:

SETX PATH "%PATH%;C:\path\to\where\the\command\resides"

这里应该避免使用等号“=”,不要担心空格!对于包含空格的路径,不需要再插入任何引号——分隔符号';'就可以了。

SETX后面的PATH关键字定义了在系统环境变量可能的值中应该改变哪一组值,而引号内的%PATH%(被百分号包围的单词PATH)告诉操作系统保持现有PATH值不变,并将下面的路径(跟随分隔符号';'的路径)添加到现有值中。