Page 1 of 1

Saving Vars

Posted: 24 Mar 2014 14:32
by gaventemples31415
How would I save a variable so that it can be accessed if the program has been closed?

Re: Saving Vars

Posted: 24 Mar 2014 15:58
by foxidrive
You can write the variable to a file.

Re: Saving Vars

Posted: 24 Mar 2014 16:15
by Compo
Or use the registry:

Code: Select all

@Echo off&SetLocal
Set "NewVar=Compo"
Set "KEY=HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
Reg Add "%KEY%" /V NewVar /D "%NewVar%" /F 1>Nul

Re: Saving Vars

Posted: 25 Mar 2014 13:59
by gaventemples31415
SO, I would just change Key to the variable's name?

Re: Saving Vars

Posted: 25 Mar 2014 14:40
by ShadowThief
Key is where in the registry you're storing it. Change the value of NewVar to the variable you're storing.

Re: Saving Vars

Posted: 25 Mar 2014 15:21
by Compo
gaventemples31415 wrote:SO, I would just change Key to the variable's name?

No, if you want to have a variable identified as %CDROM% with a Value of E: then change the script to read:
@Echo off&SetLocal
Set "CDROM=E:"
Set "KEY=HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
Reg Add "%KEY%" /V CDROM /D "%CDROM%" /F 1>Nul

Re: Saving Vars

Posted: 26 Mar 2014 18:05
by Dos_Probie
gaventemples31415 wrote:How would I save a variable so that it can be accessed if the program has been closed?

More information about your specific program and what exactly you are trying to do would be helpful for a better answer..DP

Re: Saving Vars

Posted: 06 Apr 2014 01:39
by carlsomo
You could try SETX

type SETX -I @ command prompt for examples
It may not work if script is not run in admin mode depending on win version

Re: Saving Vars

Posted: 06 Apr 2014 10:05
by Aacini
Some time ago I wrote a Batch-JScript hybrid script called SetEnv.bat that allows to define persistent variables of severals types. Here it is:

Code: Select all

@if (@CodeSection == @Batch) @then


:: SetEnv.bat: Creation of persistent environment variables via a JScript subroutine
:: Antonio Perez Ayala

@echo off
setlocal EnableDelayedExpansion

if "%~1" neq "" if "%~1" neq "/?" goto begin
set start=
for /F "delims=:" %%a in ('findstr /N "^</*usage>" "%~F0"') do (
   if not defined start (set start=%%a) else set /A lines=%%a-start-1
)
set line=0
for /F "skip=%start% tokens=1* delims=:" %%a in ('findstr /N "^" "%~F0"') do (
   echo(%%b
   set /A line+=1
   if !line! equ %lines% goto :EOF
)

<usage>
Create persistent environment variables.

SETENV charVar=code strVar:=string ... [/T:envtype]

  charVar    Specifies the name of one-character environment-variable.
  code       Ascii (Unicode) code of the character assigned to charVar;
             any code is valid, excepting zero.

  strVar     Specifies the name of string environment-variable.
  string     String of characters assigned to strVar;
             if contain spaces or special characters, enclose it in quotes.

  /T         Specify the environment type for the variables.
  envtype     SYSTEM    Applies to all users of the computer and is saved
                        between logoffs and restarts in the registry.
              USER      Applies to the user currently logged on to the
                        computer and is saved between logoffs and restarts.
              VOLATILE  Applies to current logon session and is not saved
                        between logoffs and restarts (this is the default).
              PROCESS   Applies to current process and might be passed to
                        child processes.

Examples:

    [call] SetEnv BEL=7 BS=8 TAB=9 CR=13 LF=10
    [call] SetEnv LastLogoff:="%date% @ %time%" /T:USER
</usage>

:begin

rem Define the variables via JScript
Cscript /nologo /E:JScript "%~F0" %*
goto :EOF


@end


// JScript section: SetEnv subprogram

// Define environment variables given in command-line arguments with this format:
//     charVar=code strVar:="string" ... [/T:SYSTEM|USER|VOLATILE|PROCESS]
// Antonio Perez Ayala

// Reference: http://technet.microsoft.com/en-us/library/ee156595.aspx

var envType = WScript.Arguments.Named.Item("T");
if ( envType == undefined ) envType = "VOLATILE";
var WshShell = WScript.CreateObject("WScript.Shell"),
    colEnvVars = WshShell.Environment(envType),
    args = WScript.Arguments.Unnamed, name_Value, equalSignPos;
for ( var i = 0; i < args.Length; i++ ) {
   name_Value = args.Item(i);
   equalSignPos = name_Value.indexOf("=");
   if ( name_Value.charAt(equalSignPos-1) == ":" )
      colEnvVars(name_Value.slice(0,equalSignPos-1)) = name_Value.slice(equalSignPos+1);
   else {
      colEnvVars(name_Value.slice(0,equalSignPos)) = String.fromCharCode(parseInt(name_Value.slice(equalSignPos+1)));
   }
}

Antonio