Windows中环境变量中的SETX和SET有什么区别

Pre*_*raj 100 windows environment-variables

SETX和 和有SET什么区别?

根据我的理解:
两者都用于设置环境变量
SETX,用于用户变量。
SET用于外壳变量。

Fra*_*mas 123

恐怕事情没那么简单。正如您所建议的,环境变量不受范围的限制,但是在比较动词时,变量中值的生命周期是不同的,这是正确的。

set修改当前 shell 的(窗口的)环境值,更改立即可用,但它是暂时的。该更改不会影响正在运行的其他 shell,并且只要您关闭 shell,新值就会丢失,直到您再次运行 set 时为止。

setx永久修改该值,这会影响所有未来的 shell,但不会修改已经运行的 shell 的环境。在更改可用之前,您必须退出 shell 并重新打开它,但该值将保持修改状态,直到您再次更改它。

请参阅此处的示例:http : //batcheero.blogspot.com/2008/02/set-and-setx.html

  • 写得很好,不过我要补充的是,setx 更改了注册表 (17认同)

Pre*_*raj 15

实际上我们可以在三个范围内设置变量:
1. Shell
2. User
3. System (Machine) or Global

SET :为临时创建或更新当前的 shell 范围。

C:\Users\977246>set /?
Displays, sets, or removes cmd.exe environment variables.

SET [variable=[string]]

  variable  Specifies the environment-variable name.
  string    Specifies a series of characters to assign to the variable.

Type SET without parameters to display the current environment variables.
Run Code Online (Sandbox Code Playgroud)

SETX :永久创建或更新当前用户环境变量。

C:\Users\977246>setx /?

SetX has three ways of working:

Syntax 1:
    SETX [/S system [/U [domain\]user [/P [password]]]] var value [/M]

Syntax 2:
    SETX [/S system [/U [domain\]user [/P [password]]]] var /K regpath [/M]

Syntax 3:
    SETX [/S system [/U [domain\]user [/P [password]]]]
         /F file {var {/A x,y | /R x,y string}[/M] | /X} [/D delimiters]

Description:
    Creates or modifies environment variables in the user or system
    environment. Can set variables based on arguments, regkeys or
    file input.

To remove the variable set value to empty string as follows

Example: setx path ""
Run Code Online (Sandbox Code Playgroud)

在 GUI 用户和系统环境变量中。

在此处输入图片说明


小智 12

添加其他回答者遗漏的一点。

要设置系统环境变量而不是用户环境变量,我们只需要在 setx 命令中使用 /m 选项并从提升的(管理员)命令提示符运行它。

setx variable value /m
Run Code Online (Sandbox Code Playgroud)

示例:以管理员身份打开命令提示符并运行

setx Path "%Path%;C:\Users\User\Libs" /m
Run Code Online (Sandbox Code Playgroud)

说明:上面的命令将“C:\Users\User\Libs”附加到已经存在的路径变量(系统环境变量)。

如果没有/m参数,它将仅更改或创建用户级路径变量。

从 setx 用户手册中,

/M 指定应在系统范围 (HKEY_LOCAL_MACHINE) 环境中设置该变量。默认是在 HKEY_CURRENT_USER 环境下设置变量。

  • __注意:请勿使用发布的命令行重新定义系统环境变量“PATH”!__ 这是绝对不行的 - 永远不要使用 __local__ 环境的字符串值通过命令 __SETX__ 重新定义 __system__ 或 __user__ 环境变量“Path”使用“%Path%”引用的变量。结果是 __system__ `Path` 扩展了所有环境变量引用,并附加了 __user__ `Path` 的文件夹路径,导致串联的 __local__ `Path` 中出现重复,并且可能因命令 __SETX__ 截断而删除了文件夹路径。 (2认同)

Lew*_*sey 5

setx.exe是一个在注册表中设置用户/系统环境变量的程序,用于将来的进程创建。set是一个命令,显示当前进程的 PEB 中的参数块中的环境中的进程环境变量(显示用户和系统变量以及当前或父进程使用 定义的变量set),以及允许更多当前流程在其中定义的变量,可以在流程资源管理器中查看环境的变化。

cmd /c set variable=value将为它创建的子进程设置变量cmd.exe(它将自身附加到父控制台窗口并且不分配自己的环境,并继承父进程的环境),因此当您在同一窗口中cmd.exe执行此操作后,它不会生效,set因为它指的是父进程cmd.exe。顶级进程直接从注册表继承其环境,并explorer.exe动态更新其环境变量(与大多数其他应用程序不同),因此当您setx甚至不会更新当前进程环境时,只会更新注册表(由explorer.exeexplorer.exe进程读取)由设置环境变量的 Windows API 函数更新(不太可能),以便将来打开的cmd.exes 继承explorer.exe的环境,因为它们是子级。