Adding the current directory to Windows path permanently

后端 未结 2 1568
渐次进展
渐次进展 2020-11-27 23:39

I am trying to add the current directory (from a command-line) to Windows path permanently, but I am having serious problems implementing this.

My initial attempt was

相关标签:
2条回答
  • 2020-11-28 00:23

    Simple solution:

    The syntax of setx is slightly different than the syntax of set.

    With set, I would do:

    set PATH=%PATH%;%cd%
    

    With setx, I needed to do:

    setx PATH "%cd"
    

    The first argument specifies the name of the environment variable.

    The second argument specifies the value to add to this variable.

    The double-quotes are required for when the second argument contains spaces.

    This might also be the case with set, by the way.

    0 讨论(0)
  • 2020-11-28 00:28

    As described in detail in answer on Why are other folder paths also added to system PATH with SetX and not only the specified folder path? it is not good to modify system or user PATH from within a batch file by simply overwriting or appending a folder path to PATH stored in registry using the local PATH.

    One solution for this task to add current directory path to user PATH is using this code on Windows Vista or later released versions of 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
    

    The disadvantage of this solution is a user PATH being finally for example C:\Temp;C:\Temp\Other Folder;C:\Temp\One More Folder when current directory is first C:\Temp, on next run of the batch file C:\Temp\Other Folder and C:\Temp\One More Folder on third execution of the batch file.

    The solution to avoid this is a definition of an application specific environment variable called in next batch file MyAppPath which is always overwritten on execution of the batch file. To the user PATH is added only the reference to the environment variable MyAppPath if not already existing in user 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
    

    In this case user PATH as stored in registry contains always just %MyAppPath% and registry value is of type REG_EXPAND_SZ. The value of environment variable MyAppPath is also stored in registry, but is of type REG_SZ. The value of MyAppPath is updated to current directory path on each execution of the batch file. So the user PATH in registry does not get longer and longer on each execution of a batch file from a different folder than before.

    In general an application or application suite is not good coded if its application folder or one of its subfolders must be in local PATH on execution of the application or any application from the suite to work properly at all. The application or application suite can store its installation path also somewhere else in registry like App Paths or in a file in a subfolder of %APPDATA% (user account related standard application data path) from which it can be read on next run. An installer package should modify user or system PATH only if this application is most likely executed mainly from within a command prompt window by a user.

    For understanding the used commands and how they work, open a command prompt window, execute there the following commands, and read entirely all help pages displayed for each command very carefully.

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

    Following should be also read:

    • Wikipedia article about Windows Environment Variables.
    • Microsoft article about Using command redirection operators explaining >nul.
    • Answer on Where is "START" searching for executables? with details about App Paths.
    • Answer on What is the reason for "X is not recognized as an internal or external command, operable program or batch file"? with details about local, system and user PATH.
    • Answer on How to set PATH environment variable in batch file only once on Windows?
    • Answer on How can I use a .bat file to remove specific tokens from the PATH environment variable?
    0 讨论(0)
提交回复
热议问题