Могу ли я управлять переменной из одного пакетного файла с другим? - PullRequest
1 голос
/ 21 апреля 2011

Я использую два пакетных файла, и мне нужно управлять переменными в одном из них, из другого.Возможно ли это?

1 Ответ

3 голосов
/ 22 апреля 2011

Вы не можете напрямую влиять на среду одного процесса из другого процесса. Вы знаете, мы уже переросли старые времена реального режима: -)

Все это немного зависит от того, чего вы здесь добиваетесь. Если вы вызываете один пакетный файл из другого, как в

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

Упомянутые выше методы для повышения надежности при доступе к одному и тому же файлу из двух разных программ по-прежнему применяются.

Как уже упоминалось, это лишь приблизительное представление о том, как вы могли бы действовать, если Я правильно понял ваш вопрос.

...