【问题标题】:How to persistently set a variable in Windows 7 from a batch file?如何从批处理文件中持久设置 Windows 7 中的变量?
【发布时间】:2011-09-25 07:45:01
【问题描述】:

我正在尝试使用 bat 文件在 Windows 7 中设置 PATH 环境变量;但是它似乎不起作用。

我正在使用这个 windows 命令:

set PATH=%cd%;%path%
pause

但是它似乎只对这个 cmd 实例有效。我希望它是永久的,因为我首先设置了 PATH,然后运行了一个需要在该文件夹中找到库的程序。

【问题讨论】:

  • 如果你切换到那个目录,你的程序不会选择它们吗?也许你可以通过完全回避这个问题来解决这个问题?
  • @Jon 依赖工作目录进行 DLL 搜索不是很危险吗?最棒的是将 DLL 与 .exe 放在同一目录中,这样就没有出错的余地了。
  • @DavidHeffernan:我不会说这是“危险的”。无论如何,微软和/或程序的作者已经做出了这个决定,所以没有改变。您的回答很好(实际上我是您的 +1),但也许这可以在 30 秒内解决?

标签: windows path batch-file environment-variables


【解决方案1】:

使用此命令 setx PATH "%PATH%;%MVN_HOME%\bin\"

无论如何它不会在你需要使用的当前会话中设置

设置 PATH="%PATH%;%MVN_HOME%\bin\"

【讨论】:

    【解决方案2】:

    假设我想创建一个名为“ZIP_PROGRAM”的系统环境变量,并将其指向路径“reg add C:\Program Files\7-Zip\7z.exe”的可执行文件

    我将在 DOS 提示符处执行以下操作:

    Step1:执行以下代码 reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v ZIP_PROGRAM /t REG_SZ /d "C:\Program Files\7-Zip\7z.exe" /f

    第2步:注销然后登录

    Step3: 打开 DOS Prompt 并执行: "set z" 应该可以看到系统环境变量更新了

    【讨论】:

      【解决方案3】:

      一个简单(可能更好)的解决方案是使用 PathMgr.cmd

      下载https://gallery.technet.microsoft.com/Batch-Script-To-Manage-7d0ef21e中的pathmgr_1.0.2.zip

      解压并把 pathmgr.cmd 和你的批处理文件放在同一个文件夹中,然后在你的批处理文件中写下这两行:

      call pathmgr.cmd /del %cd% /y
      call pathmgr.cmd /add %cd% /y
      

      这将:

      1) 只更新用户变量 PATH, 2) 不会多次包含系统路径

      您也可以多次运行批处理文件,它只会在 PATH 中包含您当前的路径一次。

      【讨论】:

        【解决方案4】:

        如果您想在批处理文件中执行此操作,请使用 reg 命令更改注册表中 HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment 键处的路径值。

        类似:

        reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_SZ /d "%path%;c:\newpath"
        

        检查 %path% 变量中的路径是否与系统路径匹配。

        【讨论】:

        • 当您的路径超过 1024 个字符时,这是一个更好的主意。
        • 我必须重新启动计算机才能应用更改。
        • 请注意,当您使用%path% 时,它将扩展恰好在%path% 中的所有变量。我认为您可以使用setlocal EnableDelayedExpansion 来防止这种情况发生。
        【解决方案5】:

        正如 wizlb 所说,做

        setx PATH "%cd%;%path%;" -m
        

        将本地环境复制到系统环境,没有 -m 它将系统环境复制到用户环境。两者都不可取。为了准确地只编辑注册表的一部分(系统或用户,在下面的示例中为系统),您需要这样做:

        for /F "tokens=2* delims= " %%f IN ('reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path ^| findstr /i path') do set OLD_SYSTEM_PATH=%%g
        setx.exe PATH "%OLD_SYSTEM_PATH%;%OTHER_STUFF%;" -m
        

        解决方案归功于http://www.robvanderwoude.com/ntregistry.php

        【讨论】:

        • 很好的答案!其他解决方案会将变量扩展到成本(SystemRoot、JAVA_HOME 等)。你的会保存它们
        • 一个警告是,您可能必须重新启动窗口,然后更改才能在任何地方生效。我忘了到底是哪里出了问题,所以如果你看到任何奇怪的东西,只需重新启动并重试。
        • 去掉代码中的`delims=`。在我(退休的)WinXP reg query 上用 TABs 分隔项目,而不是空格!在典型的输出行中,我们可以识别(在四个前导空格之后): 值名称 TAB 值类型 TAB 价值
        • +1 表示 -m。我的一个应用程序(将应用程序作为服务运行)要求我设置系统变量(而不是用户变量)。原来,我错过了 -m 开关。
        【解决方案6】:

        使用 setx.exe 代替 set。

        setx PATH "%cd%;%path%;"
        pause
        

        请注意,这将为所有未来的 cmd 实例设置路径,但 不是 为当前实例设置路径。如果你需要,也可以运行你原来的 set 命令。

        更新:如果第二个参数包含空格(%path% 总是有),则需要引用它。请注意,如果 %path% 中的最后一个字符是反斜杠,它将转义尾随引号,并且最后一个路径条目将停止工作。我通过在结束引号前附加一个分号来解决这个问题。

        如果您不想冒险获得“;;;;;;”在重复运行后的路径末尾,然后在设置之前从 %path% 变量中去除任何尾随反斜杠,它将正常工作。

        【讨论】:

        • @KaiserJohaan:还要注意没有=,因为这两个命令看起来很相似,而且语法很容易混淆。
        • 我得到这个回报:“错误:无效的语法。默认选项不允许超过 2 次”这意味着什么?
        • 好的,无法链接到带有尾随反斜杠讨论的主题(为什么帖子不能包含该内容,你这个愚蠢的网站?!)。搜索“setx 路径空间”以找到我正在谈论的线程。
        • 如果你做 SETX PATH "%PATH%;C:\My\App" /M 要小心,因为 %PATH% 变量会扩展为用户路径 + 系统路径,这可能会使整个%PATH% 大于 1024 个字符,这是扩展的限制,它可能会重复一些条目。更好的方法是从 PATH 命令中获取文字值,然后使用 SETX 设置文字值。
        • @wizlb 好警告,它读作 WARNING: The data being saved is truncated to 1024 characters. 它搞砸了。
        【解决方案7】:

        要正确执行此操作,我认为您确实需要超越简单的批处理文件。 MSDN documentation 声明:

        要以编程方式添加或修改系统环境变量,请将它们添加到 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment 注册表项,然后使用 lParam 广播 WM_SETTINGCHANGE 消息 设置为字符串“环境”。这允许应用程序(例如 shell)获取您的更新。

        首先,如果没有 UAC 提升提示,您将无法写入该密钥。最好通过将适当的清单添加到可执行文件来安排。其次,通过批处理文件广播WM_SETTINGCHANGE 并不简单。

        在你的位置上,我会编写一个简短的控制台应用程序来完成这项工作。

        【讨论】:

        • 您可能对名为 SendMessage 的实用程序感兴趣,用于广播您的 WM_SETTINGCHANGE,来自 stefanstools sf net。 source discussion 想知道本地 vbscript 是否会为此目的潜伏一些 API 包装器。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-05
        • 2021-07-29
        • 2011-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-11
        相关资源
        最近更新 更多