您不能直接从另一个进程影响一个进程的环境。你知道,我们现在已经有点过时了 :-)
这完全取决于您在这里想要实现的目标。如果您从另一个调用一个批处理文件,如
call second.cmd
然后被调用者»继承«父批次的环境。因此,您之前定义的任何变量都将继续存在于子批次中。但是,您不能将更改传播到父批处理,并且您也不能在子批处理启动后更改子批处理中的变量。如果您只需要在启动子批处理之前执行一些一次性初始化,它可能仍然是一个可行的选择。
您可以做的是就两个批处理文件使用的文件达成一致,它们将用作相互通信的手段,可能位于临时目录中。每个批处理文件都需要定期检查文件是否存在,如果存在,则读取它并相应地更新其变量。为此,您需要在批处理文件中可以查找该文件的位置。最简单的就是两个文件,它们只是简单地相互通信:
代码在这里:
callchat.cmd:
@echo off
set SENDFILE=%TEMP%\1.out
set RCVFILE=%TEMP%\1.in
start call chat.cmd
ping -w 5000 -n 1 123.45.67.89 >nul 2>&1
set RCVFILE=%TEMP%\1.out
set SENDFILE=%TEMP%\1.in
start call chat.cmd
chat.cmd:
@echo off
setlocal enabledelayedexpansion
rem Prevent direct use
if not defined SENDFILE goto :eof
if not defined RCVFILE goto :eof
set MESSAGE0=I don't know what to say ...
set MESSAGE1=Foo
set MESSAGE2=Bar
set MESSAGE3=Hey there!
set MESSAGE4=Meow.
:loop
rem wait a bit
ping -n 1 -w 1000 123.45.67.89 >nul 2>&1
rem look whether we need to show something
if exist %RCVFILE% (
for /f "delims=" %%l in (%RCVFILE%) do echo Received message at %TIME% - %%l
del "%RCVFILE%"
)
rem randomly send out messages. Roughly ever three times we try this
set /a msg=%random% %% 5
set msg=!MESSAGE%msg%!
if %RANDOM% LSS 10000 (
>>%SENDFILE% echo(%msg%
echo(Sent message "%msg%"
)
goto loop
批处理文件启动两次,使用不同的输入/输出文件——事实上,与第一次调用时文件的角色相反。然后它只不过是一个无限循环,它查看其输入文件并读取其中的内容并将内容写入其输出文件(这是另一批的输入文件)。
我不得不在启动它们时引入延迟,以避免两者完全相同的 PRNG。它还减少了访问文件失败的情况(这可能可以通过在读取文件之前重命名它来缓解 - 或者,如果写入更长的内容,仅在完成写入后将其重命名为最终名称)。这只是一个简单的演示应用程序,向您展示了这种方式是可能的。
要设置环境变量,您不会打印出文件中的内容,而是将其作为批处理文件调用,例如:
if exist %RCVFILE% call %RCVFILE%
不过,它需要适当的扩展名。您也可以逐行阅读并让每一行包含一个VARIABLE=VALUE 对:
if exist %RCVFILE% call for /f "tokens=1* delims==" %%a in (%RCVFILE%) do set %%a=%%b
当从两个不同的程序访问同一个文件时,上面提到的提高可靠性的技术仍然适用。
如前所述,这只是您如何操作的一个粗略想法,iff我正确理解了您的问题。