【问题标题】:Can I control a variable from one batch file with another?我可以用另一个批处理文件控制一个变量吗?
【发布时间】:2011-08-10 06:19:00
【问题描述】:

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

【问题讨论】:

  • 您是在不同的窗口中启动两个批处理文件,还是在一个窗口中并行启动,它们是否同时运行?如果你能展示样本,它就可以解决(也许)。
  • 这是适用于 Windows 还是其他一些操作系统?
  • @Patrick:批处理文件通常指的是 Windows。除非你能告诉我一个 Unix 用户,他也调用他们的 shell 脚本»批处理文件«。
  • @jeb:关于我在回答中做错了什么疯狂的任何有用的提示? ;)
  • @Joey:为什么你认为你的答案可能是错误的?好的,这可能是另一个问题的解决方案,但我们不知道这一点。

标签: variables batch-file


【解决方案1】:

您不能直接从另一个进程影响一个进程的环境。你知道,我们现在已经有点过时了 :-)

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

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

【讨论】:

  • +1,我认为它几乎完美地解决了这类问题,但仍然存在一个问题,这是OP的具体问题吗?
  • @jeb:这是我不知道的。更多的是猜测。但无论如何,这是我想要实现一段时间的东西。
猜你喜欢
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
相关资源
最近更新 更多