我可以控制一个批处理文件中的变量吗?

时间:2011-04-21 11:50:29

标签: variables batch-file

我正在使用两个批处理文件,我需要控制其中一个的变量。这可能吗?

1 个答案:

答案 0 :(得分:3)

您不能直接从另一个流程影响一个流程的环境。你知道,到现在为止,我们已经超越了真实模式的日子: - )

这完全取决于你在这里想要实现的目标。如果您从另一个调用一个批处理文件,如

call second.cmd

然后被调用者»继承«父批次的环境。因此,您之前定义的任何变量将继续存在于子批处理中。但是,您无法将更改传播到父级,并且在子批处理启动后也无法更改子批处理中的变量。如果您只需要在启动子批处理之前执行一次性初始化,那么它仍然是一个可行的选项。

您可以做的是同意两个批处理文件使用的文件,这些文件将用作彼此通信的方式,可能位于临时目录中。每个批处理文件都需要定期检查要存在的文件,如果存在,请读取它并相应地更新其变量。为了获得成功,您需要批处理文件中的点可以查找该文件。最简单的是两个文件只是相互之间进行一点沟通:

enter image description here

代码就在这里:

<强> 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 我正确理解你的问题。