2014-06-23 2 views
0

Итак, я писал небольшую игру в пакетном файле и наткнулся на эту проблему в цикле FOR. Это небольшой кусок моего кода. Если игрок забирает камень, проверьте, находится ли он на столе, а затем положите его в свой пакет. Проблема заключается в том, что команда SET не работает. Я предполагаю, что строки выполняются как: set% table1% = empty not: set table1 = empty.Batch FOR loop IF и SET conflict

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

set take=rock 
set table1=box 
set table2=rock 
set table3=wrench 

for %%x in (%table1% %table2% %table3%) do (

    if %%x==%take% (
     set %%x=empty 
     set pack=%%x 
     goto tableRoom 
) 
) 

ответ

0

Основная проблема с вашим кодом является set %%x=empty для логическая причина: цикл for выполняет итерацию по списку значений внутри переменных table, а не по имени переменных, поэтому вы не можете изменить значение переменной, если у вас нет ссылки на переменную, у вас есть значение внутри Это.

Включение замедленного расширения и итерация имен переменных может решить проблему

@echo off 
    setlocal enableextensions enabledelayedexpansion 

    set "take=rock" 
    set "table1=box" 
    set "table2=rock" 
    set "table3=wrench" 

    for %%x in (table1 table2 table3) do (
     if "!%%x!"=="%take%" (
      set "%%x=empty" 
      set "pack=%take%" 
      goto tableRoom 
     ) 
    ) 

:tableRoom 
    set table 
    exit /b 

%%x будет содержать имя переменного, поэтому, когда !%%x! выполняется это будет что-то вроде !table1!, извлекая значение внутри переменной (когда включено замедленное расширение).

Если имена используемых переменных (table...) не сталкиваются ни с чем другим, и вы не хотите использовать задержанное расширение, можно взять вывод команды set table (список переменных со значениями) и обрабатывать этот список с командой for /f, разделяя вывод команды, отделяя имя переменной и значение

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "take=rock" 
    set "table1=box" 
    set "table2=rock" 
    set "table3=wrench" 

    for /f "tokens=1,* delims==" %%a in ('set table') do (
     if "%%b"=="%take%" (
      set "%%a=empty" 
      set "pack=%take%" 
      goto tableRoom 
     ) 
    ) 

:tableRoom 
    set table 
    exit /b 

выход set команды содержит var=value. Каждая из линий разделяется с использованием = в качестве разделителя для получения двух жетонов (tokens=1,*). %%a сохранит первый токен (имя переменной) и %%b остальную часть строки (значение в переменной)

+0

Aha! Ваш первый пример - то, что я искал! Большое спасибо! Когда я изначально пробовал цикл FOR с таблицей 1, а не% table1%, SET работал, но IF не делал этого. !%%Икс! устраняет проблему. – user3768793

0

Вы можете использовать счетчик, чтобы в настоящее время, какую таблицу вы тестируете в вашей FOR петли и установить непосредственно table!N! как пустые:

set take=rock 
set table1=box 
set table2=rock 
set table3=wrench 

setlocal enabledelayedexpansion 
set $c=1 
for %%x in (%table1% %table2% %table3%) do (
    if %%x==%take% (
     set table!$c!=empty 
     set pack=%%x 
     goto tableRoom 
) 
set /a $c+=1 
) 

:tableroom 
echo table2 is now : %table2% 
+0

Мне нравится эта идея, и она вызывающе решает эту проблему. Спасибо! Но есть ли простой способ получить: if %% x == any и set %% x = независимо от того, как работать в одном и том же цикле FOR, я чувствую, что это ограничит меня дальше по дороге. – user3768793