Пакетная обработка — оценка динамических переменных с параметром в имени

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

Это требует, чтобы вызывающий пакетный файл передал «уникальный» идентификатор для переменных, названных в нем. (IE проходит в Application1 для %1).

Затем я хочу динамически назвать переменные, например:

set %1_Timer=Hello

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

Я пробовал такие решения, как:

echo %1_Timer%
echo %1_Timer
echo %%1_Timer%%
echo %%1_Timer%
Call echo %%1%_Timer%

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


person Ryan    schedule 09.04.2015    source источник
comment
См. связанные массивы -lists-and-other-data-structures-in-cmd-exe-batch-script. Механизм доступа к вашим динамическим переменным такой же, как и для массива.   -  person Aacini    schedule 09.04.2015


Ответы (2)


Вы хотите использовать отложенное расширение.

@echo off
setlocal enabledelayedexpansion

echo !%1_Timer!

Вы также можете использовать знаки call и %% (call echo %%%1_Timer%%, но обычно отложенное расширение будет более полезным. Кроме того, это обязательно, если вы когда-либо устанавливаете или изменяете переменную внутри блока кода, например for или if.

person SomethingDark    schedule 09.04.2015
comment
Я указал, что это не может быть локальным. Одна и та же библиотека будет вызываться несколько раз, и если задано значение local, одни и те же переменные будут недоступны, что приведет к нарушению функции библиотеки. - Я вижу, что вы добавляете метод, для которого я мог бы использовать CALL без использования локального. - person Ryan; 09.04.2015
comment
@Ryan - О, я предположил, что это означает, что это не может быть на вашей локальной машине. (Я знаю, что это не имеет никакого смысла, но мы видим здесь всевозможные странные вопросы, поэтому я просто смирился с этим.) - person SomethingDark; 09.04.2015

@ECHO OFF
SETLOCAL
SET myapp_timer=original_value
CALL :appsee myapp
CALL :appset myapp
CALL :appsee myapp
GOTO :EOF

:: set variable(s) - can be external batch to set caller's environment
:appset
SET %1_timer=hello
GOTO :EOF

:: see variable(s) - can be external batch to set caller's environment
:appsee
CALL ECHO %%1_timer=%%%1_timer%%
GOTO :EOF

Вот как.

person Magoo    schedule 09.04.2015