如何仅为当前操作系统会话设置variables

setx永久修改环境variables
set仅在批处理脚本持续时间内使variables可用。
有没有办法设置一个variables,以保持其值,直到系统重新启动?
例如在我的batch file中,我正在检查variables是否如下设置:

 if %MYVAR% == 1 ( <block> ) 

 @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 。 tempfile无疑也需要放在一个文件中,用户名是你要使用的名字的一部分。

如果要将此批次包含在启动目录中,则应该还原上次保存的环境变量的值。

所以,在第一次登录时,当前变量的值被存储。 在后续登录中,无论是否执行了setx ,环境都将恢复到最后存储的环境。

但是,您需要更改程序。 这将恢复到已知的状态。 如果你真的想setx一个值或者安装一些增加新的环境变量值或改变现有值的软件(在这里最好使用PATH ),那么你需要先运行这个例程,进行修改,删除保存文件,重新运行这个例程。 尴尬,我承认 – 但这是一个办法。

哦 – 记得在setx之后set你的变量。 你甚至可以写一个setxX批处理setx然后set (反之亦然)所需的变量。

您可以通过使用JScript的WshShell.Environment方法的Batch-JScript混合脚本来实现。 该文档指定有四种类型的环境:系统,用户,易失性和进程,以及易失性类型“适用于当前登录会话,不在注销和重新启动之间保存”,这正是您想要的:

 @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窗口中不可用,但仅在将来的cmd.exe窗口中在同一个OS会话中打开。

在Windows 8.1上测试