2015-07-06 4 views
1

Я знаю, как вы можете использовать для/L, delayedexpansion и массивов для создания вложенных переменных в пакетных файлах, но, пожалуйста, выслушайте мой сценарий.Пакетные файлы - Вложенные переменные?

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

% 1x1%% 1х2% и т.д. % 2x1%% 2х2% и т.д. и он идет до 20х20.

Если пользователь просит изменить 20 x 20, они набирают «20 20» и обрабатываются. Например, я могу установить 20x20 в 0. Моя проблема заключается в проверке. Я хочу иметь возможность изменить его на "." (это то, что есть до того, как пользователь запросит установить его в 0), если они снова набирают «20 20».

Это то, что это вид выглядит как:

set !xVal!x!yVal!=0 

Как я могу добиться этого:

if %!xVal!x!yVal!%==0 

без переписывания всего моего сценария? Имейте в виду, я сказал, что он создан динамически, поэтому это не проблема, если мне нужно настроить массив, который я не уверен, что это даже сработает. Это по существу 2 для циклов для создания «сетки» переменных, от 1x1 до 20x20.

ответ

1

Я думаю, ваша проблема имеет две основные различные точки:

1 Вы никогда не должны определять любую переменную, которая начала в цифре, как set 1x1=0. Зачем? Потому что, когда вы пытаетесь расширить его значение таким образом: echo %1x1% первый «% 1» берется как первый параметр Batch-файла, поэтому вы должны never получить значение переменной «1x1». Я предлагаю вам вставить письмо в начале имени переменной; например: set a1x1=0.

2- Вы используете неправильный метод для расширения значения переменной. Вот некоторые примеры:

Создание 20 х 20 массив:

for /L %%i in (1,1,20) do (
    for /L %%j in (1,1,20) do (
     set a%%ix%%j=0 
    ) 
) 

Установите значение элемента xVal и yVal:

set a!xVal!x!yVal!=0 

Получить значение элемента xVal и yVal:

echo !a%xVal%x%yVal%! 

Получите значение элемента xVal и yVal, когда оба индекса меняются внутри кодового блока:

for %%x in (!xVal!) do for %%y in (!yVal!) do echo !a%%xx%%y! 

То же самое, но с использованием только один для:

for /F "tokens=1,2" %%x in ("!xVal! !yVal!") do echo !a%%xx%%y! 

Для полного описания этих управлений массива, см this post.

Смежные вопросы