Пакетная оценка динамических переменных с параметром в имени
Я пишу пакетную библиотеку, которая не должна быть локальной, чтобы внешние пакетные файлы могли вызывать функции из одного определенного местоположения.
Это требует, чтобы вызывающий пакетный файл передавал "уникальный" идентификатор для переменных, названных в нем. (Т. е. пройти в Application1 для %1).
Затем я хочу динамически называть переменные, такие как:
set %1_Timer=Hello
Это работает хорошо, за исключением того, что я должен быть в состоянии оценить указанные динамические переменные, но не могу найти решение, которое позволяет мне оценить эти параметры на основе динамических переменных.
Я пробовал такие решения, как:
echo %1_Timer%
echo %1_Timer
echo %%1_Timer%%
echo %%1_Timer%
Call echo %%1%_Timer%
Я не могу использовать переменную, которая не имеет динамического имени, так как другие скрипты, использующие эту библиотеку, могут изменить эту нединамическую переменную, изменяя выходные данные для других скриптов.
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
Вот как.