1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

A request for a new feature for the "set" command...

Discussion in 'Support' started by mathewsdw, Nov 2, 2010.

Thread Status:
Not open for further replies.
  1. mathewsdw

    Joined:
    May 24, 2010
    Messages:
    855
    Likes Received:
    0
    I use "SetLocal/EndLocal" a lot to avoid "polluting" the environment - and these can often be nested somewhat deeply as batch files call other batch files. However, there are times when I want to set a variable in an upper environment, or even the root environment (i. e. that of the TCMD/TCC session in which I am running the batch file), and the only way I've found to do this is the (fairly long and complicated) code sequence:

    REM
    REM Where I am setting the variable:
    REM
    ...
    Set Variable=...
    ...
    REM Set variable as a volatile variable in the registry
    Set /V Variable=%Variable

    REM
    REM Where I am retrieving the variable's value:
    REM
    REM Retrieve variable from registry
    REM (Is this the only way????)
    Set Variable=%@ExecStr[Set /V Variable]
    DoWhatever with %Variable as needed...
    REM Drop variable from the registry (assuming this even works)
    Set /V Variable=

    Possibilities:

    "/U#": Set in the environment # levels up from the current environment (may not be generally useful...)

    "/U": Set in the environment one level up. (Specifying without a count - one level up - may be generally useful...)

    "/T" or "/R": Set in the "Top" or "Root" environment...

    I know I can avoid using SetLocal/EndLocal commands and drop the batch-file variables I no longer need at the bottom of the batch file, but doing this for all no-longer-needed variables that were used and avoiding variable conflicts with the "current" envirionment is more effort/discipline than I really want to put into this. (If setting a variable in a "lower" environment that was defined in an "upper" environment didn't "re-create" the variable in the "lower" environment (again, like other languages that have variable scoping) would do the job, but I know that this would probably "break" too much existing code and is therefore too much to ask.)

    I do this regularly in C Plus Plus programs (and I am refering to environment variables) so I absolutely know it can be done...
    <O:p
     
  2. vefatica

    Joined:
    May 20, 2008
    Messages:
    7,952
    Likes Received:
    30
    On Tue, 02 Nov 2010 19:32:52 -0400, mathewsdw <> wrote:

    |Set /V Variable=%Variable
    |
    |REM
    |REM Where I am *retrieving* the variable's value:
    |REM
    |REM Retrieve variable from registry
    |REM (Is this the only way????)
    |Set Variable=%@ExecStr[Set /V Variable]

    My 4UTILS plugin offers:

    Code:
    v:\> help @GEV
    @GEV[name[,s|u|v|d]] = value of [registry] environment variable
    
    Example:
    
    v:\> set /v foo=bar
    
    v:\> echo %@gev[foo,v]
    bar
    |/U# - Set in the environment # levels up from the current environment (may not be generally useful...)
    |
    |/U - Set in the environment one level up. (Specifying without a *count* - one level up - may be generally useful...)

    What's a "level"?

    The only hierarchy of environments is the parental one ... processes inherit the
    environment of their parent. And that hierarchy is not generally available to a
    process or to the programmer.

    My SYSUTILS plugin offers EXPORT and @PSET[] which may be helpful.

    Code:
    v:\> help export
    EXPORT var [var [...]] (to parent 4NT/TCC)
    
    v:\> help @pset
    @PSET[pid,var[=[value]]]
    
    get[unset[set]] variable in process <pid>
    
    returns value (get/set) or var (unset) on success, else an empty string
     
  3. rconn

    rconn Administrator
    Staff Member

    Joined:
    May 14, 2008
    Messages:
    9,859
    Likes Received:
    83
    You can already do this by exporting variables in the ENDLOCAL command.
     
  4. Charles Dye

    Charles Dye Super Moderator
    Staff Member

    Joined:
    May 20, 2008
    Messages:
    3,307
    Likes Received:
    39
    SETLOCAL nesting level, I think.
     
  5. vefatica

    Joined:
    May 20, 2008
    Messages:
    7,952
    Likes Received:
    30
    On Tue, 02 Nov 2010 22:51:05 -0400, Charles Dye <> wrote:

    |---Quote (Originally by vefatica)---
    |What's a "level"?
    |---End Quote---
    |SETLOCAL nesting level, I think.

    OK, I see. The comments I made about EXPORT and @PSET are unrelated to
    SETLOCAL.
     
  6. mathewsdw

    Joined:
    May 24, 2010
    Messages:
    855
    Likes Received:
    0
    Stated simpy, Rex, thank you very much. I will note that I've been using your product(s) for many years (starting with Windows 3.1, I think), and while I read the "help" file fairly thoroghly years ago, since my eyesight has largely failed me (as I know I've mentioned in the past, I have to use the screen magnfier app and/or a large font to even use a computer) I'm reading things pretty much on an "as needed" basis and this functionality of the "EndLocal" command I was completely unaware of, and it never occurred to me that the "EndLocal" command might have those "features". Again, thanks very much Rex! The more I find out about this product, the better it is!!!!
     
Thread Status:
Not open for further replies.

Share This Page