如何使用setx添加到Windows PATH变量?有奇怪的问题

时间:2013-10-10 04:56:27

标签: windows path cmd setx

我想使用setx修改Windows PATH变量。以下在Windows 8上至少有50%的时间工作:

setx PATH %PATH%;C:\Python27\;C:\Python27\Scripts\

如果它给出错误“默认参数只能使用2次”,那么下面的一些时间会起作用:

setx PATH "%PATH%;C:\Python27\;C:\Python27\Scripts\"

不同之处在于我们将第二个参数包装在引号中。我相信当%PATH%展开以包含空格时,引号是必要的。

但是,我在Windows 7上遇到了一些奇怪的问题。在一台特定的Windows 7机器上,我遇到了这个问题:

echo %PATH%

打印:

C:\Foo\;C:\Bar\;[...lots of stuff...]C:\Baz\

然后我这样做:

setx PATH "%PATH%;C:\Quux\"

然后它说“错误:截断1,024个字符。”现在让我们检查一下PATH包含的内容:

echo %PATH%

打印:

C:\Foo\;C:\Foo\;C:\Bar\;C:\Bar\;[...lots of stuff, now duplicated...]C:\B

...它被裁减为1,024个字符。由于重复,它跑了过来。同样有趣的是:尽管setx引发了错误而没有说“成功”,但PATH的价值也发生了变化。

我能够多次重复这种奇怪的行为(幸运的是我保存了PATH的原始内容)。

目前,我知道附加到PATH的唯一可靠方法如下:

  1. echo路径。

  2. 将PATH的内容复制到文本文件中,并手动将;C:\Python27\;C:\Python27\Scripts\添加到路径的末尾。

  3. 将整个内容复制出文本文件。

  4. setx PATH "<paste the string here>"

  5. 该过程在Windows 7和Windows 8上每次都有效。

    我应该能够在一个命令中执行此操作。我做错了什么?

    谢谢。

12 个答案:

答案 0 :(得分:67)

以管理员身份运行cmd,然后:

setx /M PATH "%PATH%;<your-new-path>"

/ M选项将变量设置为SYSTEM范围。默认行为是为USER设置它。

<强> TL; DR

发生截断问题是因为当您回显%PATH%时,它将显示SYSTEM和USER值的串联。因此,当您在setx的第二个参数中添加它时,它将适合USER var中的SYSTEM和USER值。当你再次回声时,事情会加倍。

此外,/ M选项需要管理员权限,因此您需要以&#34;以管理员身份运行&#34;打开您的终端,否则setx会抱怨&#34;访问注册表路径被拒绝&#34;

最后要注意的事项:当您以这种方式设置后回显%PATH%时,您不会看到新值,您需要关闭cmd并再次打开。

如果要检查存储在注册表中的实际值,请检查this question

答案 1 :(得分:7)

这非常有效:

for /f "usebackq tokens=2,*" %A in (`reg query HKCU\Environment /v PATH`) do set my_user_path=%B

setx PATH "C:\Python27;C:\Python27\Scripts;%my_user_path%"

第一个命令将USER环境变量&#39; PATH&#39;转换为&#39; my_user_path&#39;变量 第二行预先设置&#39; C:\ Python27; C:\ Python27 \ Scripts;&#39;到USER环境变量&#39; PATH&#39;

答案 2 :(得分:4)

如果您不感谢setx,则可以使用其他命令行工具,例如pathed。在https://superuser.com/questions/297947/is-there-a-convenient-way-to-edit-path-in-windows-7/655712#655712

有一个更全面的替代PATH编辑器列表

您也可以直接编辑注册表值,这是setx的作用。更多内容answer

奇怪的是,%PATH%被截断为1024个字符。我以为setx没有那个问题。虽然你应该清理无效的路径条目。

答案 3 :(得分:4)

没有管理员权限,对我有用的唯一方法是一个包含以下代码的bat文件:

for /F "tokens=2* delims= " %%f IN ('reg query HKCU\Environment /v PATH ^| findstr /i path') do set OLD_SYSTEM_PATH=%%g
setx PATH "%USERPROFILE%\wev-tools;%OLD_SYSTEM_PATH%"

代码是答案https://stackoverflow.com/a/45566845/4717152https://stackoverflow.com/a/10292113/4717152的组合

答案 4 :(得分:3)

我遇到了同样的问题,现在找到了一个简单的解决方案。

使用pathman。

pathman /as %M2%

将%M2%添加到系统路径。没有更多,也没有更少。获得用户PATH和系统路径的混合没有更多问题。没有更难以从注册表中获取正确的值...

在Windows 10上尝试

答案 5 :(得分:2)

setx path "%PATH%; C:\Program Files (x86)\Microsoft Office\root\Office16" /m

这应该在不添加任何额外内容的情况下追加到系统环境变量路径,并保持原始数据完整无损。我已使用此命令解决了McAfee Web Control对Microsoft Outlook桌面客户端所做的问题。

在路径值中使用引号,因为命令行将空格视为定界符,并将尝试在命令行中执行下一个值。引号会覆盖此行为,并将引号内的所有内容作为字符串处理。

答案 6 :(得分:1)

如果有人想在PowerShell中运行它,就像下面一样,

以管理员身份运行Powershell

然后

setx /M PATH "$Env:PATH;<path to add>"

要验证,请打开另一个Powershell并查看PATH,如下所示

$Env:PATH

答案 7 :(得分:1)

只想重申:earlier answer 中的 Manohar Reddy Poreddy 是正确的。

有许多可以改进的地方,我认为分享可能会有所帮助:

@echo off

REM -- Use directory where script is located. For current working directory, use %CD%
set CURRENT_DIR=%~dp0
REM -- Great example from Strawberry Perl's portable shell launcher:
if #%CURRENT_DIR:~-1%# == #\# set CURRENT_DIR=%CURRENT_DIR:~0,-1%

REM -- Load the user PATH from the registry, making sure it is not blank
reg query HKCU\Environment /v PATH 1>nul 2>&1
if ERRORLEVEL 1 goto skipLoadPath
for /f "usebackq tokens=2,*" %%A in (`reg query HKCU\Environment /v PATH`) do set MY_USER_PATH=%%B

REM -- Optionally, checks if this directory is already part of the user PATH
REM -- This will avoid duplication, and allow this to be run multiple times,
REM -- but if a sub-directory of the current is already part of the user PATH,
REM -- this script will simply not do anything
echo %MY_USER_PATH%|find "%CURRENT_DIR%" >nul
if errorlevel 1 (goto skipLoadPath) else (goto skipSetXPath)
:skipLoadPath

REM -- Avoid adding a useless semicolon to the previous user PATH
if not "" == "%MY_USER_PATH%" set "MY_USER_PATH=%MY_USER_PATH%;"
REM -- Permanently set the following location as part of the system path
setx PATH "%MY_USER_PATH%%CURRENT_DIR%" >nul 2>&1
REM -- This will update the current environment, since SETX only updates the registry
set "PATH=%PATH%;%MY_USER_PATH%%CURRENT_DIR%"
:skipSetXPath

答案 8 :(得分:0)

步骤:1。使用管理员权限打开命令提示符。

步骤:2。运行命令:      setx / M PATH“path \ to;%PATH%”

[注意:请务必更改命令,以便路径\反映根目录中的文件夹路径。]

示例:setx / M PATH“C:\ Program Files;%PATH%”

答案 9 :(得分:0)

当%PATH%环境变量接近1024个字符而我编写了一个Powershell脚本来修复它时,我在管理我的计算机实验室时遇到了这样的麻烦。

您可以在此处下载代码:https://gallery.technet.microsoft.com/scriptcenter/Edit-and-shorten-PATH-37ef3189

您还可以将其用作安全添加,删除和解析PATH条目的简单方法。享受。

答案 10 :(得分:0)

使用OOTB工具很难,您不能直接/轻松地添加系统路径或用户路径。如果要使用OOTB工具,则必须查询SYSTEM或USER路径,将该值另存为变量,然后附加添加的内容并使用setx保存。下面的两个示例显示了如何检索,保存它们以及附加您的添加内容。不要与%PATH%混为一谈,它是USER + SYSTEM的串联,将导致大量重复结果。您必须按如下所示拆分它们...

附加到系统路径

for /f "usebackq tokens=2,*" %A in (`reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PATH`) do set SYSPATH=%B

setx PATH "%SYSPATH%;C:\path1;C:\path2" /M

附加到用户PATH

for /f "usebackq tokens=2,*" %A in (`reg query HKCU\Environment /v PATH`) do set userPATH=%B

setx PATH "%userPATH%;C:\path3;C:\path4"

答案 11 :(得分:0)

此vbscript /批处理混合“ append_sys_path.vbs”不直观,但效果很好:

If CreateObject("WScript.Shell").Run("%ComSpec% /C ""NET FILE""", 0, True) <> 0 Then
    CreateObject("Shell.Application").ShellExecute WScript.FullName, """" & WScript.ScriptFullName & """", , "runas", 5
    WScript.Quit
End If
Set Shell = CreateObject("WScript.Shell")
Cmd = Shell.Exec("%ComSpec% /C ""REG QUERY ""HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"" /v Path | FINDSTR /I /C:""REG_SZ"" /C:""REG_EXPAND_SZ""""").StdOut.ReadAll
Cmd = """" & Trim(Replace(Mid(Cmd, InStr(1, Cmd, "_SZ", VBTextCompare) + 3), vbCrLf, ""))
If Right(Cmd, 1) <> ";" Then Cmd = Cmd & ";"
Cmd = "%ComSpec% /C ""REG ADD ""HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"" /v Path /t REG_EXPAND_SZ /d " & Replace(Cmd & "%SystemDrive%\Python27;%SystemDrive%\Python27\Scripts"" /f""", "%", """%""")
Shell.Run Cmd, 0, True

这种方法的优点:

1)它不会截断1024个字符的系统路径环境。
2)它不连接系统和用户路径环境。
3)它会以管理员身份自动运行。
4)保留系统路径环境中的百分比。
5)支持空格,括号和特殊字符。
6)在Windows 7及更高版本上均可使用。