setx
永久修改环境变量
set
仅在批处理脚本持续时间内使变量可用
有没有办法设置变量以保持其值,直到系统重新启动?
例如。在我的批处理文件中,我正在检查变量是否设置如下:
if %MYVAR% == 1 (
<block>
)
答案 0 :(得分:5)
@ECHO Off
IF NOT EXIST q25244121.org GOTO done
:: reset to original
FOR /f "tokens=1*delims==" %%a IN (q25244121.org) DO (
IF DEFINED %%a FOR /f "tokens=1*delims==" %%p IN ('set %%a') DO (
IF "%%a"=="%%p" IF "%%b" neq "%%q" SET "%%a=%%b"
)
)
:: Delete if not originally defined
FOR /f "tokens=1*delims==" %%p IN ('set') DO (
FINDSTR /L /i /c:"%%p=" q25244121.org >NUL
IF ERRORLEVEL 1 SET "%%p="
)
:done
:: Record current settings
set>q25244121.org
EXIT /b
这可能对你有用。您需要将CAPS中的SET
说明更改为SETX
。毫无疑问,临时文件也需要放在一个文件中,其中用户名是您使用的名称的一部分。
如果要将此批处理包含在启动目录中,则应恢复上次保存的环境变量的值。
因此,在首次登录时,会存储当前变量的值。在后续登录中,无论是否已执行setx
,环境都将恢复到最后存储的环境。
然而,您需要更改程序。这将恢复到已知状态。如果你真的想要setx
一个值或者安装一些软件来添加新的环境变量值或更改现有的值(PATH
会在这里受欢迎)那么你需要先运行这个例程,make更改,删除保存文件并重新运行此例程。尴尬,我承认 - 但这是一种方法。
哦 - 请记住set
变量setx
之后的变量。您甚至可以将setxX
批次写入setx
,然后set
(或反之亦然)写入所需变量。
答案 1 :(得分:2)
您可以通过使用JScript的WshShell.Environment方法的Batch-JScript混合脚本来实现。 documentation指定有四种类型的环境:系统,用户,易失性和进程,以及易失性类型&#34;适用于当前登录会话,并且不会在注销和重新启动之间保存&#34;,即正是你想要的:
@if (@CodeSection == @Batch) @then
@echo off
rem Define a persistent variable for the current OS session only via JScript
Cscript //nologo //E:JScript "%~F0" MYVAR "This is the value"
goto :EOF
@end
var colEnvVars = WScript.CreateObject("WScript.Shell").Environment("Volatile");
colEnvVars(WScript.Arguments(0)) = WScript.Arguments(1);
您必须将以前的代码保存在.bat文件中,并将其作为任何批处理文件执行。请注意,以这种方式定义的变量不在当前 cmd.exe窗口中可用,但仅限于将来在同一OS会话中打开的cmd.exe窗口。
在Windows 8.1上测试。
答案 2 :(得分:0)
好吧,我发现了一种比JScript方法更简单(且明显不那么hacky)的方法,但是通过可变的环境操作,它使我们处于正确的方向。
只需使用reg
命令来操作注册表中的易失性环境:
reg add "HKCU\Volatile Environment" /v "%MYVAR%" /d "%MYVALUE%" /f
reg add
都可以创建和更新值。
\f
绕过覆盖确认。
使用\d ""
设置空数据等同于删除全局变量。您不会在带有set
的外壳中看到它,但是仍然可以在注册表中看到它为空。