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


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

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

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

set %1_Timer=Hello

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

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

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

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

2 2

2 ответа:

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

@echo off
setlocal enabledelayedexpansion

echo !%1_Timer!

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

@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

Вот как.