Показать полную графическую версию : двойное раскрытие
CyberMuesli
24-06-2012, 21:51
В переменной VName содержится имя другой переменной окружения. Чтобы получить значение переменной, чье имя содержится в переменной VName, можно использовать такой синтаксис:
set VNAME=FARHOME & rem Но мы этого не знаем
...
set VValue=!%VNAME%!
Как быть, если последнюю строчку надо написать в цикле, в котором %VARNAME% раскроется всего один раз перед циклом. По идее нужно что-то типа такого
Как быть, если последнюю строчку надо написать в цикле или внутри IF, где %VARNAME% раскроется всего один раз перед скобками. По идее нужно что-то типа такого
set VValue=!!VNAME!!
Но так не работает. Как быть?
Где сам пример цикла?
Подобное (http://forum.oszone.net/post-1233230.html#post1233230) пробовали?
@echo off
setlocal enableextensions enabledelayedexpansion
set sValue=Some value
set sVarName=sValue
echo !%sVarName%!
call echo %%%sVarName%%%
endlocal
exit /b 0
CyberMuesli
24-06-2012, 22:29
Где сам пример цикла? »
чуть позже. пока я тренировался, у меня перестало работать даже вне цикла. Что тут не так?
upd: в данном примере все работает, просто & echo надо писать на новой строчке
@echo off
setlocal enabledelayedexpansion
call :vtest MyArray
goto :eof
:vTest
set %1.1=value1
set %1.2=value2
set %1.3=value3
set %1.Index=1
set VNAME=%1.!%1.Index! & echo VNAME=!VNAME!
set VNAME=!%VNAME%! & echo VNAME=!VNAME!
Foreigner
24-06-2012, 22:41
set %1.Index=1 »
set "Index=1"
set "VNAME=!%1.%Index%!"
echo %VNAME%
CyberMuesli
24-06-2012, 22:50
Код: »
да спасибо, так сработает, но это нарушает условия задачи
в переменной VNAME хранится ИМЯ. В вашем примере оно не хранится, в VNAME сразу попадает нужное значение.
Хотелось бы понять, почему не работает мой пример
Foreigner
24-06-2012, 23:14
CyberMuesli,
C промежуточной переменной работает:
set "%1.Index=1"
set "Index=!%1.Index!"
echo !%1.%Index%!
CyberMuesli
24-06-2012, 23:16
C промежуточной переменной работает: »
вы тоже нарушили условия задачи. у вас нет переменной, в которой хранится имя другой переменной
Foreigner
24-06-2012, 23:32
Тогда только как говорил Iska, через "call"
set %1.Index=1
call set "VNAME=%%%1.!%1.Index!%%"
echo %VNAME%
CyberMuesli
24-06-2012, 23:33
Где сам пример цикла? »
Итак, поясняющий пример. Вместо цикла тут IF (видимо закавыка в том, что скобки, как и в цикле). Первый вариант работает, второй нет.
@echo off
setlocal enabledelayedexpansion
call :vtest MyArray
goto :eof
:vTest
set %1.1=value1
set %1.2=value2
set %1.3=value3
set %1.Count=1
echo Ok:
set VNAME=%1.!%1.Count!
echo VNAME=!VNAME!
set VNAME=!%VNAME%!
echo VNAME=!VNAME!
if defined %1.!%1.Count! (
echo does not working
set VNAME=%1.!%1.Count!
echo VNAME=!VNAME!
set VNAME=!%VNAME%!
echo VNAME=!VNAME!
)
Foreigner
24-06-2012, 23:54
if defined %1.!%1.Count! (
echo does not working
call set VNAME=%%%1.!%1.Count!%%
echo VNAME=!VNAME!
set VNAME=%VNAME%
echo VNAME=!VNAME!
)
CyberMuesli
24-06-2012, 23:56
if defined %1.!%1.Count! (
echo does not working
call set VNAME=%%%1.!%1.Count!%%
echo VNAME=!VNAME!
set VNAME=%VNAME%
echo VNAME=!VNAME!
) »
этот код не работает
Foreigner
24-06-2012, 23:59
этот код не работает »
А что должно быть в итоге? У меня такой вывод:
Ok:
VNAME=MyArray.1
VNAME=value1
does not working
VNAME=value1
VNAME=value1
CyberMuesli
25-06-2012, 00:02
А что должно быть в итоге? У меня такой вывод: »
Условие: в VNAME должно быть имя другой переменной. В нашем случае это MyArray.1
Код:
@echo off
setlocal enabledelayedexpansion
call :vtest MyArray
goto :eof
:vTest
set %1.1=value1
set %1.2=value2
set %1.3=value3
set %1.Count=1
echo Ok:
set VNAME=%1.!%1.Count!
echo VNAME=!VNAME!
set VNAME=!%VNAME%!
echo VNAME=!VNAME!
if defined %1.!%1.Count! (
echo does not working
set VNAME=%1.!%1.Count!
echo VNAME=!VNAME!
set VNAME=!%VNAME%!
echo VNAME=!VNAME!
)
if defined %1.!%1.Count! (
echo does not working 2
call set VNAME=%%%1.!%1.Count!%%
echo VNAME=!VNAME!
set VNAME=%VNAME%
echo VNAME=!VNAME!
)
Результаты:
C>Test.bat
Ok:
VNAME=MyArray.1
VNAME=value1
does not working
VNAME=MyArray.1
VNAME=
does not working 2
VNAME=value1
VNAME=
Foreigner
25-06-2012, 00:07
if defined %1.!%1.Count! (
echo does not working
set VNAME=%1.!%1.Count!
echo VNAME=!VNAME!
set VNAME=%VNAME%
echo VNAME=!VNAME!
)
Результат:
Ok:
VNAME=MyArray.1
VNAME=value1
does not working
VNAME=MyArray.1
VNAME=value1
CyberMuesli
25-06-2012, 00:09
does not working
VNAME=MyArray.1
VNAME=value1 »
работает, но не понимаю, почему) бред какой-то. это не должно работать, тут на одно раскрытие меньше
Нет. Не работает. Ваш код каким-то волшебным образом пользуется значением, которое было вычислено ранее. В общем-то сразу кидалось в глаза, что строчка set VNAME=%VNAME% не должна делать ровным счетом ничего. Это нуль-код, который ничего не меняет.
Пора наверное спать. Все странности с Invalid value понял. В скобки вместо %VARNAME% подставляется то, что было на момент входа в скобки. Так как VNAME уже было правильно вычислено вне скобок, то set VNAME=%VNAME% дает внутри скобок нужный результат, который мы ошибочно интерпретируем как рабочий вариант.
Как вычислить то, что нужно, по прежнему, непонятно.
Привожу канонический проблемный код. В ветку с IF (в выделенную жирным строчку) надо что-то вставить, что дважды раскроет VNAME, так же, как вне скобок
@echo off
setlocal enabledelayedexpansion
call :vtest MyArray
goto :eof
:vTest
set %1.1=Right value 1
set %1.Index=1
set %1
echo --- Outside brackets is Ok:
set VNAME=%1.!%1.Index!
echo VNAME=!VNAME!
set VNAME=!%VNAME%!
echo VNAME=!VNAME!
echo ---
set VNAME=Invalid value
set VNAME
if defined %1.!%1.Index! (
echo --- Inside brackets does not working
set VNAME=%1.!%1.Index!
set VNAME
set VNAME=!%VNAME%!
set VNAME
)
goto :eof
CyberMuesli
25-06-2012, 03:02
Всё. Решение найдено. Для двойного раскрытия надо делать так
for %%i in (!VNAME!) do set VNAME=!%%i!
Всем спасибо.
Привожу … проблемный код. »
С этого нужно было начинать в первом же посте.
CyberMuesli
25-06-2012, 03:53
С этого нужно было начинать в первом же посте. »
я с этого и начал
Цитата Iska:
Где сам пример цикла? »
Итак, поясняющий пример. »
Ключевые слова — «с этого» и «в первом же».
Foreigner
25-06-2012, 06:50
Нет. Не работает. »
надо что-то вставить, что дважды раскроет VNAME, так же, как вне скобок
if defined %1.!%1.Count! (
set VNAME=%1.!%1.Count!
echo VNAME=!VNAME!
call set VNAME=%%!VNAME!%%
echo VNAME=!VNAME!
)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.