如何在批处理文件中持久设置Windows 7中的变量?

Kai*_*aan 46 windows path batch-file environment-variables

我试图使用bat文件在Windows 7中设置PATH环境变量; 但它似乎没有用.

我正在使用这个Windows命令:

set PATH=%cd%;%path%
pause
Run Code Online (Sandbox Code Playgroud)

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

Rya*_*ose 65

使用setx.exe而不是set.

setx PATH "%cd%;%path%;"
pause
Run Code Online (Sandbox Code Playgroud)

请注意,这将为所有将来的cmd实例设置路径,但为当前实例设置路径.如果需要,还可以运行原始的set命令.

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

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

  • 如果你执行SETX PATH"%PATH%; C:\ My\App"/ M,请小心,因为%PATH%变量扩展到用户路径+系统路径,这可能使整个%PATH%大于1024个字符,这是扩展的限制,它可能会复制一些条目.更好的方法是从PATH命令获取文字值,然后使用SETX设置文字值. (21认同)
  • @KaiserJohaan:还要注意缺少`=`,因为这两个命令看起来很相似,语法很容易混淆. (12认同)
  • @wizlb 很好的警告,它写着“警告:正在保存的数据被截断为 1024 个字符。”它搞砸了。 (2认同)

sim*_*mon 22

如果要在批处理文件中执行此操作,请使用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"
Run Code Online (Sandbox Code Playgroud)

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

  • 当你的路径超过1024个字符时,这是一个更好的主意. (7认同)

Den*_*kem 17

正如wizlb指出的那样

setx PATH "%cd%;%path%;" -m
Run Code Online (Sandbox Code Playgroud)

将本地环境复制到系统环境,没有-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
Run Code Online (Sandbox Code Playgroud)

该解决方案的信用额度为http://www.robvanderwoude.com/ntregistry.php

  • 很棒的答案!其他解决方案将变量扩展为costants(SystemRoot,JAVA_HOME等).你的将保留它们 (3认同)

Dav*_*nan 12

为了做到这一点,我认为你真的需要超越一个简单的批处理文件.在MSDN文档状态:

以编程方式添加或修改系统环境变量,把它们添加到HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \控制\会话管理\环境的注册表项,然后广播WM_SETTINGCHANGE消息的lParam设置为字符串"环境".这允许应用程序(如shell)获取更新.

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

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