将当前目录永久添加到 Windows 路径

goo*_*ion 3 command-line path batch-file environment-variables

我正在尝试将当前目录(从命令行)永久添加到 Windows 路径,但是我在实现这个时遇到了严重的问题。

我最初的尝试是:

set PATH=%PATH%;%cd%
Run Code Online (Sandbox Code Playgroud)

但是,这只适用于当前会话;只要我关闭命令行窗口,PATH环境变量就会保留其先前的值。

接下来,我尝试:

setx PATH=%PATH%;%cd%
Run Code Online (Sandbox Code Playgroud)

根据我在此处找到的一些答案,这可能适用于 Windows 7 和 8,但在 Windows 10 中,该setx命令具有三种工作方式:

Syntax 1:
    SETX [/S system [/U [domain\]user [/P [password]]]] var value [/M]

Syntax 2:
    SETX [/S system [/U [domain\]user [/P [password]]]] var /K regpath [/M]

Syntax 3:
    SETX [/S system [/U [domain\]user [/P [password]]]]
         /F file {var {/A x,y | /R x,y string}[/M] | /X} [/D delimiters]
Run Code Online (Sandbox Code Playgroud)

长话短说,我无法让它工作:

ERROR: Invalid syntax. Default option is not allowed more than '2' time(s).
Run Code Online (Sandbox Code Playgroud)

我怎样才能以最简单的方式完成我的目标?

如果每个 Windows 版本有不同的语法,那么我也很乐意获得此信息。

Mof*_*ofi 5

正如回答中详细描述的为什么其他文件夹路径也使用 SetX 添加到系统 PATH 而不仅仅是指定的文件夹路径?这是不好修改系统用户 PATH通过简单地重写或者附加到文件夹路径从一个批处理文件中PATH使用存储在注册表地方 PATH

此任务向用户 添加当前目录路径的一种解决方案PATH是在 Windows Vista 或更高版本的 Windows 上使用此代码:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "skip=2 tokens=1,2*" %%N in ('%SystemRoot%\System32\reg.exe query "HKEY_CURRENT_USER\Environment" /v "Path" 2^>nul') do (
    if /I "%%N" == "Path" (
        set "UserPath=%%P"
        if defined UserPath goto CheckPath
    )
)

set "UseSetx=1"
if not "%CD:~1024,1%" == "" set "UseSetx="
if not exist %SystemRoot%\System32\setx.exe set "UseSetx="
if defined UseSetx (
    %SystemRoot%\System32\setx.exe Path "%CD%" >nul
) else (
    %SystemRoot%\System32\reg.exe ADD "HKCU\Environment" /f /v Path /t REG_SZ /d "%CD%" >nul
)

endlocal
goto :EOF

:CheckPath
setlocal EnableDelayedExpansion
set "Separator="
if not "!UserPath:~-1!" == ";" set "Separator=;"
set "PathCheck=!UserPath!%Separator%"
if "!PathCheck:%CD%;=!" == "!PathCheck!" (
    set "PathToSet=!UserPath!%Separator%%CD%"
    set "UseSetx=1"
    if not "!PathToSet:~1024,1!" == "" set "UseSetx="
    if not exist %SystemRoot%\System32\setx.exe set "UseSetx="
    if defined UseSetx (
        %SystemRoot%\System32\setx.exe Path "!PathToSet!" >nul
    ) else (
        set "ValueType=REG_EXPAND_SZ"
        if "!PathToSet:%%=!" == "!PathToSet!" set "ValueType=REG_SZ"
        %SystemRoot%\System32\reg.exe ADD "HKCU\Environment" /f /v Path /t !ValueType! /d "!PathToSet!" >nul
    )
)
endlocal
endlocal
Run Code Online (Sandbox Code Playgroud)

这种解决方案的缺点是用户 PATH是最后例如C:\Temp;C:\Temp\Other Folder;C:\Temp\One More Folder当当前目录是第一个C:\Temp,在批处理文件的下一个运行 C:\Temp\Other FolderC:\Temp\One More Folder对批处理文件的第三执行。

避免这种情况的解决方案是定义在下一个批处理文件中调用的特定于应用程序的环境变量,MyAppPath它总是在执行批处理文件时被覆盖。如果user 中不存在,则仅向用户 PATH添加对环境变量的引用。MyAppPath PATH

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "UseSetx=1"
if not "%CD:~1024,1%" == "" set "UseSetx="
if not exist %SystemRoot%\System32\setx.exe set "UseSetx="
if defined UseSetx (
    %SystemRoot%\System32\setx.exe MyAppPath "%CD%" >nul
) else (
    %SystemRoot%\System32\reg.exe ADD "HKCU\Environment" /f /v MyAppPath /t REG_SZ /d "%CD%" >nul
)

set "UserPath="
for /F "skip=2 tokens=1,2*" %%N in ('%SystemRoot%\System32\reg.exe query "HKEY_CURRENT_USER\Environment" /v "Path" 2^>nul') do (
    if /I "%%N" == "Path" (
        set "UserPath=%%P"
        if defined UserPath goto CheckPath
    )
)

if exist %SystemRoot%\System32\setx.exe (
    %SystemRoot%\System32\setx.exe Path "%%MyAppPath%%" >nul
) else (
    %SystemRoot%\System32\reg.exe ADD "HKCU\Environment" /f /v Path /t REG_EXPAND_SZ /d "%%MyAppPath%%" >nul
)
endlocal
goto :EOF

:CheckPath
setlocal EnableDelayedExpansion
set "Separator="
if not "!UserPath:~-1!" == ";" set "Separator=;"
if "!UserPath:%%MyAppPath%%=!" == "!UserPath!" (
    set "PathToSet=!UserPath!%Separator%%%MyAppPath%%"
    set "UseSetx=1"
    if not "!PathToSet:~1024,1!" == "" set "UseSetx="
    if not exist %SystemRoot%\System32\setx.exe set "UseSetx="
    if defined UseSetx (
        %SystemRoot%\System32\setx.exe Path "!PathToSet!" >nul
    ) else (
        %SystemRoot%\System32\reg.exe ADD "HKCU\Environment" /f /v Path /t REG_EXPAND_SZ /d "!PathToSet!" >nul
    )
)
endlocal
endlocal
Run Code Online (Sandbox Code Playgroud)

在这种情况下,存储在注册表中的用户 PATH始终只包含%MyAppPath%并且注册表值的类型为REG_EXPAND_SZ。环境变量的值MyAppPath也存储在注册表中,但类型为REG_SZ。的值MyAppPath在每次执行批处理文件时更新为当前目录路径。因此,每次执行来自不同文件夹的批处理文件时,注册表中的用户 PATH不会变得越来越长。

通常,如果应用程序或应用程序套件的应用程序文件夹或其子文件夹之一必须在本地 PATH执行应用程序或套件中的任何应用程序才能正常工作,则应用程序或应用程序套件的编码效果不佳。应用程序或应用程序套件还可以将其安装路径存储在注册表中的其他位置,如(用户帐户相关的标准应用程序数据路径)App Paths的子文件夹中的文件中%APPDATA%,下次运行时可以从中读取。仅当此应用程序很可能主要由用户在命令提示符窗口内执行时,安装程序包才应修改用户系统 PATH

要了解使用的命令及其工作原理,请打开命令提示符窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • reg /?
  • reg add /?
  • reg query /?
  • set /?
  • setlocal /?
  • setx /?

还应阅读以下内容: