将目录附加到Windows中的PATH环境变量

时间:2015-07-24 04:47:10

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

所以,我有这个批处理文件,据说将我的脚本附加到路径变量

@echo OFF

setx path "%path%;%cd%\script.py"

但是我遇到了一些问题。

  1. 附加我的script.py会导致路径大于1024个字符。因此输出警告。
  2.   

    警告:正在保存的数据被截断为1024个字符。

         

    成功:保存了指定的值。

    1. 使用上面的代码将PATH从系统路径复制到用户路径,然后尝试附加script.py。 (我在用户 PATH中有其他目录不在系统 PATH中,并使用该脚本覆盖这些目录。)
    2. 我的问题是,如何克服1024个字符的限制?

      如何正确地将script.py附加到用户 PATH而不复制系统 PATH中的那些?

      示例:

      原始

        

      USER PATH:C:\ dirA; ...; C:\ dirB;

           

      系统路径:C:\ dirC; ...; C:\ dirD;

      运行脚本后......

      预期

        

      USER PATH:C:\ dirA; ...; C:\ dirB; C:\ something \ script.py

           

      系统路径:C:\ dirC; ...; C:\ dirD;

      实际

        

      USER PATH:C:\ dirC; ...; C:\ dirD; C:\ somet(截断为1024个字符)

           

      系统路径:C:\ dirC; ...; C:\ dirD;

3 个答案:

答案 0 :(得分:1)

下一个脚本显示了一种可能的方法。

@ECHO OFF >NUL
SETLOCAL enableextensions
rem  enabledelayedexpansion
echo adding "%~1" to the user level HKCU\Environment /v Path
call :showReg old
call set "expanded=%~1"
if "%expanded%"=="" goto :usage
if not exist "%expanded%\" goto :usage
set "HKCU_type=REG_EXPAND_SZ"
set "HKCU_path="
for /F "tokens=1,2*" %%F in ('
  reg query HKCU\Environment /v Path 2^>NUL ^|findstr /I "path"
  ') do (
    set "HKCU_path=%%H"
    REG ADD HKCU\Environment /v Path /t %HKCU_type% /d %%H;%~1 /f >NUL
  ) 
if not defined HKCU_path (
    REG ADD HKCU\Environment /v Path /t %HKCU_type% /d %~1 /f >NUL
)
:endlocal
call :showReg new
ENDLOCAL
goto :eof

:usage
  echo      directory "%~1" ^("%expanded%"^) not found
goto :endlocal

:showReg
<NUL set /P "=%~1: "
reg query HKCU\Environment /v Path 2>NUL|findstr /I "path"|findstr /V /R "^$"
if errorlevel 1 echo not defined
goto :eof

提供的示例显示了添加

的尝试
  • 不存在的目录d:\FooBar(已拒绝);
  • 现有目录d:\bat(硬编码参考);
  • 现有目录%SystemRoot%(变量引用,在注册表中硬编码);
  • 现有目录^%windir^%(变量引用在注册表中保持可扩展)。

<强>输出

==>31602391.bat d:\FooBar
adding "d:\FooBar" to the user level HKCU\Environment /v Path
old: not defined
     directory "d:\FooBar" ("d:\FooBar") not found
new: not defined

==>31602391.bat d:\test
adding "d:\test" to the user level HKCU\Environment /v Path
old: not defined
new:     Path    REG_EXPAND_SZ    d:\test

==>31602391.bat %SystemRoot%
adding "C:\Windows" to the user level HKCU\Environment /v Path
old:     Path    REG_EXPAND_SZ    d:\test
new:     Path    REG_EXPAND_SZ    d:\test;C:\Windows

==>31602391.bat ^%windir^%
adding "%windir%" to the user level HKCU\Environment /v Path
old:     Path    REG_EXPAND_SZ    d:\test;C:\Windows
new:     Path    REG_EXPAND_SZ    d:\test;C:\Windows;%windir%

==>

答案 1 :(得分:0)

我在这里找到答案:https://superuser.com/questions/601015/how-to-update-the-path-user-environment-variable-from-command-line

@echo OFF


for /f "skip=2 tokens=3*" %%a in ('reg query HKCU\Environment /v PATH') do (
    if [%%b]==[] (
        setx PATH "%%~a;%cd%"
    ) else (
        setx PATH "%%~a %%~b;%cd%"
    )
)

答案 2 :(得分:-3)

setx path c:\whatever

对于path,setx会将指定的路径附加到现有路径。您不指定现有路径,只指定新路径。它也不会两次添加路径。

这是我使用的东西

%windir%\system32\setx path %~sdp0 > "%temp%\filter.tmp"

如果我尝试添加两次,重定向会隐藏错误消息。如果您不知道call /?是什么

,请参阅%~sdp0命令