There is no need to do so if a batch job can read from a file system to retrieve a change. Just run a job with path to a temporary unique directory and pass the same path to the child shell script. Script will lock a file in that directory and write a file with new values near the lock file. A job script time to time will lock the same file, parse and read changes back from the values file. To find out how to make a lock in the unix shell just search for `unix shell lock file` or `bash lock file`, there is already exist a plenty solutions for that.

Benefits from this solution:

* portable between almost any OS like Windows or Unix
* no need to write and duplicate complex parsers for each interpreter (unix/windows/etc) to read back values from the file as long as the values file stays simple

Issues in implementation below:

* Implementation relies on a file lock in a shell redirection phase (`flock` in Linux to achieve exclusion effect, in Windows has a builtin exclusion)
* Each value for a variable is a single line value (not a multiline)

Implementation is stored here: https://sourceforge.net/p/contools/contools/HEAD/tree/trunk/Scripts/Tools

The `bash` implementation:

*set_vars_from_locked_file_pair.sh*

 #!/bin/bash

 # Another variant of a configuration file variables read and set script.
 # The script must stay as simple as possible, so for this task it uses these parameters:
 # 1. path where to lock a lock file
 # 2. path where to read a file with variable names (each per line)
 # 3. path where to read a file with variable values (each per line, must be the same quantity of lines with the variable names file)

 # Script can be ONLY included by "source" command.
 if [[ -n "$BASH" && (-z "$BASH_LINENO" || ${BASH_LINENO[0]} -gt 0) ]]; then 

 function set_vars_from_locked_file_pair()
 {
 # the lock file directory must already exist
 if [[ ! -d "${1%[/\\]*}" ]]; then
 echo "$0: error: lock file directory does not exist: \`${1%[/\\]*}\`" >&2
 return 1
 fi

 if [[ ! -f "${2//\\//}" ]]; then
 echo "$0: error: variable names file does not exist: \`$2\`" >&2
 return 2
 fi

 if [[ ! -f "${3//\\//}" ]]; then
 echo "$0: error: variable values file does not exist: \`$3\`" >&2
 return 3
 fi

 function LocalMain()
 {
 # open file for direct reading by the `read` in the same shell process
 exec 7< "$2"
 exec 8< "$3"

 # cleanup on return
 trap "rm -f \"$1\" 2> /dev/null; exec 8>&-; exec 7>&-; trap - RETURN" RETURN

 local __VarName
 local __VarValue

 # shared acquire of the lock file
 while :; do
 # lock via redirection to file
 {
 flock -s 9

 # simultaneous iteration over 2 lists in the same time
 while read -r -u 7 __VarName; do
 read -r -u 8 __VarValue
 # drop line returns
 __VarName="${__VarName//[$'\r\n']}"
 __VarValue="${__VarValue//[$'\r\n']}"
 declare -gx $__VarName="$__VarValue"
 (( $4 )) && echo "$__VarName=\`$__VarValue\`"
 done

 break

 # return with previous code
 } 9> "$1" 2> /dev/null # has exclusive lock been acquired?

 # busy wait
 sleep 0.02
 done
 }

 LocalMain "${1//\\//}" "${2//\\//}" "${3//\\//}" "${4:-0}"
 }

 fi

*testlock.sh*

 #!/bin/bash

 {
 flock -x 9 2> /dev/null
 read -n1 -r -p "Press any key to continue..."
 echo >&2
 } 9> "lock"

The same on Windows (as an example of portability):

*set_vars_from_locked_file_pair.bat*

 @echo off

 rem Another variant of a configuration file variables read and set script.
 rem The script must stay as simple as possible, so for this task it uses these parameters:
 rem 1. path where to lock a lock file
 rem 2. path where to read a file with variable names (each per line)
 rem 3. path where to read a file with variable values (each per line, must be the same quantity of lines with the variable names file)

 rem disable alternative variables expansion to avoid `!` character consumption
 setlocal DISABLEDELAYEDEXPANSION

 set "FILE_LOCK_PATH=%~1"
 set "FILE_VAR_NAMES_PATH=%~2"
 set "FILE_VAR_VALUES_PATH=%~3"
 set "PRINT_VARS_SET=%~4"

 set "FILE_LOCK_DIR=%~d1"

 rem the lock file directory must already exist
 if not exist "%FILE_LOCK_DIR%" (
 echo.%~nx0: error: FILE_LOCK_DIR does not exist: "%FILE_LOCK_DIR%"
 exit /b 1
 ) >&2

 if not exist "%FILE_VAR_NAMES_PATH%" (
 echo.%~nx0: error: FILE_VAR_NAMES_PATH does not exist: "%FILE_VAR_NAMES_PATH%"
 exit /b 2
 ) >&2

 if not exist "%FILE_VAR_VALUES_PATH%" (
 echo.%~nx0: error: FILE_VAR_VALUES_PATH does not exist: "%FILE_VAR_VALUES_PATH%"
 exit /b 3
 ) >&2

 rem The endlocal works only in the same call context
 endlocal

 rem exclusive acquire of the lock file
 :REPEAT_LOCK_LOOP

 (
 (
 rem if lock is acquired, then we are in...
 call :MAIN "%%~2" "%%~3" "%%~4"
 call set "LASTERROR=%%ERRORLEVEL%%"

 rem exit with return code from the MAIN
 ) 9> "%~1" && (del /F /Q /A:-D "%~1" & goto EXIT)
 ) 2>nul

 rem Busy wait: with external call significantly reduces CPU consumption while in a waiting state
 pathping localhost -n -q 1 -p 20 >nul 2>&1
 goto REPEAT_LOCK_LOOP

 :EXIT
 exit /b %LASTERROR%

 :MAIN
 rem drop last error
 type nul>nul

 if %~30 NEQ 0 goto SET_WITH_PRINT

 rem trick with simultaneous iteration over 2 lists in the same time
 (
 for /f "usebackq eol=# tokens=* delims=" %%i in ("%~1") do (
 set /p "%%i="
 )
 ) < "%~2"

 exit /b

 :SET_WITH_PRINT
 rem trick with simultaneous iteration over 2 lists in the same time
 (
 for /f "usebackq eol=# tokens=* delims=" %%i in ("%~1") do (
 set /p "%%i="
 rem to filter out wrong matches of a variable from the `set "%%i"`
 for /f "usebackq eol=# tokens=1,* delims==" %%j in (`set "%%i"`) do if "%%j" == "%%i" echo.%%i=%%k
 )
 ) < "%~2"

*testlock.bat*

 @echo off

 (
 pause
 ) 9> ./lock

To write the files in just make the same way lock in your code.