如何仅为当前OS会话设置变量

时间:2014-08-11 13:12:08

标签: windows variables batch-file command-line windows-7

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

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

3 个答案:

答案 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的外壳中看到它,但是仍然可以在注册表中看到它为空。

这里是参考:https://ss64.com/nt/reg.html