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

时间:2017-11-02 07:51:38

标签: batch-file command-line path environment-variables

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

我最初的尝试是:

set PATH=%PATH%;%cd%

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

接下来,我试过了:

setx PATH=%PATH%;%cd%

根据我在此处找到的一些答案,这可能在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]

长话短说,我无法让它发挥作用:

ERROR: Invalid syntax. Default option is not allowed more than '2' time(s).

有人可以建议如何以最简单的方式完成我的目标吗?

如果每个Windows版本的语法不同,那么我也很乐意收到这些信息。

非常感谢!!!

2 个答案:

答案 0 :(得分:3)

正如在Why are other folder paths also added to system PATH with SetX and not only the specified folder 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

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

避免这种情况的解决方案是在下一批文件MyAppPath中调用的特定于应用程序的环境变量的定义,该变量在执行批处理文件时始终被覆盖。如果用户 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

在这种情况下,存储在注册表中的用户 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 /?

以下内容也应该阅读:

答案 1 :(得分:-1)

简单的解决方案:

setx的语法与set的语法略有不同。

使用set,我会这样做:

set PATH=%PATH%;%cd%

使用setx,我需要这样做:

setx PATH "%cd"

第一个参数指定环境变量的名称。

第二个参数指定要添加到此变量的值。

当第二个参数包含空格时,需要双引号。

顺便说一下,set可能就是这种情况。