【问题标题】:Append a directory to PATH Environment Variable in Windows在 Windows 中将目录附加到 PATH 环境变量
【发布时间】:2015-07-24 04:47:10
【问题描述】:

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

@echo OFF

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

但是我遇到了一些问题。

  1. 附加我的 script.py 会导致路径超过 1024 个字符。从而输出警告。

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

成功:指定的值已保存。

  1. 使用上面的代码将 PATH 从 system PATH 复制到 user PATH,然后尝试附加 script.py。 (我在 user PATH 中有其他目录不在 system PATH 中,使用脚本会覆盖这些目录。)

我的问题是,如何克服 1024 个字符的限制?

我怎样才能正确地将 script.py 附加到 user PATH 而不从 system PATH 复制那些?

例子:

原创

用户路径:C:\dirA;...;C:\dirB;

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

运行脚本后...

预期

用户路径:C:\dirA;...;C:\dirB;C:\something\script.py

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

实际

用户路径:C:\dirC;...;C:\dirD;C:\somet(截断为 1024 个字符)

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

【问题讨论】:

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


【解决方案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%

==>

【讨论】:

  • 带有空格(非常常见)或与号(罕见)的文件夹路径未成功添加/附加到 用户 PATH。此外,如果 user PATH 已经存在且文件夹路径包含空格或 &amp;,则附加传递的文件夹路径将失败。原因:数据字符串周围的两个REG ADD 命令行中缺少双引号。此外,直接在REG ADD 命令行上使用%~1 可能对传递的文件夹路径以转义" 的反斜杠结尾(一旦添加)至关重要。所以需要确保传递的文件夹路径不以\结尾。
【解决方案2】:

我在这里找到了答案: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%"
    )
)

【讨论】:

  • 由于多种原因,此代码根本不起作用。如果 user PATH 在 Windows 注册表中不存在,reg query 只会输出错误消息,for 没有要处理的内容,因此 user PATH 不存在用当前目录路径定义。如果注册表值PATH 以空字符串存在,则没有第三个标记,因此for 再次什么也不做。换句话说,user PATH 必须至少存在一个文件夹路径才能添加当前目录。该批处理文件也仅适用于 Windows Vista 和更高版本的 Windows,但不适用于 Windows XP。
  • 代码不会检查 user PATH 是否已经以分号结尾,在这种情况下,应在不附加分号的情况下追加当前目录。但是这段代码的最大问题是 user PATH 的损坏,如果字符串变得超过 1024 个字符,因为 setx 截断 字符串显示为 1024 个字符适当的信息,然后将其添加到 Windows 注册表。因此,现有的 user PATH 可能会被此代码截断(乱码),而不是附加当前目录。
【解决方案3】:
setx path c:\whatever

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

这是我使用的东西

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

如果我尝试添加两次,重定向会隐藏错误消息。如果您不知道%~sdp0 是什么,请参阅call /? 命令

【讨论】:

  • "setx path c:\whatever" 实际上覆盖了整个环境变量,这对我也不利
  • 起初看起来这是非破坏性的,但它完全是。小心! %path% 变量是 machineuser 路径的串联;比尔答案中的命令完全替换了 user 路径。
  • setx 永久修改路径,set 仅修改当前 shell。此答案具有误导性并具有潜在危险。
猜你喜欢
  • 2010-12-27
  • 2019-09-04
  • 1970-01-01
  • 2020-04-20
  • 2017-10-31
  • 1970-01-01
  • 2014-04-21
  • 2021-03-05
相关资源
最近更新 更多