Эта статья рассказывает, как передать информацию в bat файл из запущенного им процесса через переменные окружения.

Запускаемый процесс может быть любым скриптом или программой.

Когда требуется передать переменные

Этот вопрос возникает, когда bat файл создаёт дочерний процесс, например, программу *.exe, скрипт cscript.exe myscript.js или какой-то другой скрипт, которые заносят выходную информацию в переменные окружения, и в bat файле необходимо «увидеть» значения этих переменных, установленные дочерним процессом.

Проблема в том, что когда bat файл запускает новый процесс, тот работает со своей копией переменных окружения, поэтому внесённые дочерним процессом изменения не видны в родительском процессе.

Как запрограммировать передачу переменных

Рассмотрим, как можно запрограммировать доступность значений переменных на примере, который довольно часто встречается при написании bat файлов – получении значений компонентов даты и времени.

Обычный подход заключается в разборе строк %DATE% и %TIME% на части, но возникают сложности из-за того, что заранее неизвестно, в каком они региональном стандарте, например, %DATE% может выглядеть как 24.07.2019 или как 7/24/2019.

Что, если для определения параметров использовать JScript, где этих сложностей нет и легко определить не только день и месяц, но и день недели?

Скрипт определения значений даты и времени

Скрипт использует объект Date и выглядит так:

var shell = WScript.CreateObject("WScript.Shell");
var env = shell.Environment("VOLATILE");
var now = new Date();

env("time_day") = now.getDate().toString();
env("time_month") = (now.getMonth()+1).toString();
env("time_month_text") = month[now.getMonth()];
env("time_year") = now.getYear().toString();
env("time_hours") = now.getHours().toString();
env("time_minutes") = now.getMinutes().toString();
env("time_seconds") = now.getSeconds().toString();
env("time_weekday") = now.getDay().toString();
var weekday = new Array("Sunday", "Monday", "Tuesday", "Wednesday", 
  "Thursday", "Friday", "Saturday");
env("time_weekday_text") = weekday[now.getDay()];

Все значения скрипт сохраняет в переменных окружения, причём типа VOLATILE – сохраняются до конца сеанса, а больше нам и не надо.

Считывание переменных в bat файле

Если в bat файле вызвать скрипт и затем обратиться к переменной стандартным образом:

cscript //nologo time_values.js
echo %time_day%

то предсказуемо ничего не получится:

time_day=

потому что эти переменные присутствуют в процессе скрипта, а также сохранены в реестре как база для новых процессов.

Этим мы и воспользуемся:

  • считаем переменные из реестра
  • запишем значения в переменные процесса bat файла

Делается это в одну строку:

for /f "tokens=1,2,3" %%A in ('REG QUERY "HKCU\Volatile Environment" ^| find /i "time_"') do set %%A=%%C

Фильтр переменных по time_ по большому счёту необязателен, можно его убрать:

for /f "tokens=1,2,3" %%A in ('REG QUERY "HKCU\Volatile Environment"') do set %%A=%%C

В итоге – переменные доступны в bat файле

После копирования переменных bat файл может использовать значения даты и времени удобным способом, например, проверить, какое сегодня число и день недели:

if "%time_day%"=="13" if "%time_weekday_text%"=="Friday" echo Давай лучше завтра & exit /b 0

Двойной if выполняет функцию логического И, см. Операторы AND / OR в bat файлах.

Типы переменных окружения

Если переменные имеют тип USER (пользовательские переменные), то в реестре они сохраняются в разделе HKCU\Environment, так надо и указать в bat файле.

Файлы для скачивания

Файлы из этой статьи можно скачать с Яндекс.Диска по ссылкам.

Файлы передачи переменные окружения из дочернего процесса в bat файл

Все скрипты

Передача переменных окружения в вызывающий bat файл
Метки:     

Одна мысль о “Передача переменных окружения в вызывающий bat файл

  • 13.02.2020 в 14:34
    Постоянная ссылка

    Не, ну прикольно конечно… Через реестр! IMHO извращение на практике. Ну еще один способ, видимо работающий, не проверял… А чем, собственно не устраивает тривиальный способ возвратить значения из вызываемого Js-скрипта или программы через стандартный ввод-вывод?

    Ответ

Добавить комментарий для Анатолий Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *