90

我想使用setx. 以下内容在 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\到 PATH 的末尾。

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

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

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

我真的应该能够在一个命令中做到这一点。我究竟做错了什么?

4

12 回答 12

84

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

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

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

TL;博士

发生截断是因为当您回显时,%PATH%您会得到 SYSTEM 和 USER 值的串联,因此,当您将其添加到第二个参数中时setx,该命令将尝试在 USER var 中匹配 SYSTEM 和 USER 的内容。当你再次回显时,结果将翻倍。

/M选项需要管理员权限,因此您需要使用“以管理员身份运行”打开终端,否则setx将因“拒绝访问注册表路径”而失败。

注意:这样设置后回显时看不到新值%PATH%,需要关闭cmd再打开。

如果要检查存储在注册表中的实际值,请检查此问题

于 2014-11-15T15:02:42.553 回答
30

这完美地工作:

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 环境变量 'PATH' 放入 'my_user_path' 变量中第二行添加了 'C:\Python27;C:\Python27\Scripts;' 到 USER 环境变量 'PATH'

于 2017-08-08T11:15:07.887 回答
6

如果有人想在 PowerShell 中运行它,它的工作方式如下所示,

以管理员身份运行 Powershell

然后

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

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

$Env:PATH
于 2017-10-11T03:21:32.757 回答
4

如果您不喜欢setx,您可以使用备用命令行工具,例如pathed在https://superuser.com/questions/297947/is-there-a-convenient-way-to-edit-path-in-windows-7/655712#655712有更全面的替代 PATH 编辑器列表

您也可以直接编辑注册表值,就是这样setx做的。更多在这个答案中。

奇怪的是,您%PATH%的字符被截断为 1024 个字符。我以为setx没有这个问题。尽管您可能应该清理无效的路径条目。

于 2013-10-10T05:09:00.183 回答
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的组合

于 2018-07-18T10:59:32.833 回答
3

遗憾的是,使用 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

附加到用户路径

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

setx PATH "%userPATH%;C:\path3;C:\path4"
于 2020-01-02T23:06:52.267 回答
2
setx path "%PATH%; C:\Program Files (x86)\Microsoft Office\root\Office16" /m

这应该在不添加任何额外内容的情况下附加到系统环境变量路径,并保持原始文件完整而不会丢失任何数据。我已使用此命令更正了 McAfee 的 Web 控制对 Microsoft 的 Outlook 桌面客户端所做的问题。

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

于 2020-07-02T14:21:57.567 回答
2

只是想重申一下: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
于 2021-03-20T14:03:55.290 回答
2

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

使用路径人。

pathman /as %M2%

例如,将 %M2% 添加到系统路径。不多也不少。混合使用用户 PATH 和系统 PATH 不再有问题。不再试图从注册表中获取正确的值......

在 Windows 10 上尝试过

于 2016-12-14T07:52:26.207 回答
0

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

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

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

于 2017-11-20T02:46:41.793 回答
0

这个 vbscript/batch 混合“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 及更高版本。

于 2020-01-07T15:10:55.950 回答
0

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

步骤: 2.运行命令:setx /M PATH "path\to;%PATH%"

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

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

于 2017-05-29T16:12:43.307 回答