Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - двойное раскрытие

Ответить
Настройки темы
CMD/BAT - двойное раскрытие

Аватара для CyberMuesli

Старожил


Сообщения: 207
Благодарности: 18

Профиль | Отправить PM | Цитировать


Изменения
Автор: CyberMuesli
Дата: 24-06-2012
В переменной VName содержится имя другой переменной окружения. Чтобы получить значение переменной, чье имя содержится в переменной VName, можно использовать такой синтаксис:

set VNAME=FARHOME & rem Но мы этого не знаем
...
set VValue=!%VNAME%!


Как быть, если последнюю строчку надо написать в цикле, в котором %VARNAME% раскроется всего один раз перед циклом. По идее нужно что-то типа такого

Как быть, если последнюю строчку надо написать в цикле или внутри IF, где %VARNAME% раскроется всего один раз перед скобками. По идее нужно что-то типа такого

set VValue=!!VNAME!!

Но так не работает. Как быть?

-------
Кибер Мюсли


Отправлено: 21:51, 24-06-2012

 

Аватара для CyberMuesli

Старожил


Сообщения: 207
Благодарности: 18

Профиль | Отправить PM | Цитировать


Цитата Foreigner:
Код: Выделить весь код
if defined %1.!%1.Count! (
 echo does not working
 call set VNAME=%%%1.!%1.Count!%%
 echo VNAME=!VNAME!
 set VNAME=%VNAME%
 echo VNAME=!VNAME!
)
»
этот код не работает

-------
Кибер Мюсли


Отправлено: 23:56, 24-06-2012 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 1758
Благодарности: 966

Профиль | Цитировать


Цитата CyberMuesli:
этот код не работает »
А что должно быть в итоге? У меня такой вывод:
Цитата:
Ok:
VNAME=MyArray.1
VNAME=value1
does not working
VNAME=value1
VNAME=value1

Отправлено: 23:59, 24-06-2012 | #12


Аватара для CyberMuesli

Старожил


Сообщения: 207
Благодарности: 18

Профиль | Отправить PM | Цитировать


Цитата Foreigner:
А что должно быть в итоге? У меня такой вывод: »
Условие: в 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=

-------
Кибер Мюсли


Отправлено: 00:02, 25-06-2012 | #13


Ветеран


Сообщения: 1758
Благодарности: 966

Профиль | Цитировать


Код: Выделить весь код
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

Отправлено: 00:07, 25-06-2012 | #14


Аватара для CyberMuesli

Старожил


Сообщения: 207
Благодарности: 18

Профиль | Отправить PM | Цитировать


Цитата Foreigner:
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 в 02:38.


Отправлено: 00:09, 25-06-2012 | #15


Аватара для CyberMuesli

Старожил


Сообщения: 207
Благодарности: 18

Профиль | Отправить PM | Цитировать


Всё. Решение найдено. Для двойного раскрытия надо делать так


for %%i in (!VNAME!) do set VNAME=!%%i!

Всем спасибо.

-------
Кибер Мюсли


Отправлено: 03:02, 25-06-2012 | #16


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата CyberMuesli:
Привожу … проблемный код. »
С этого нужно было начинать в первом же посте.

Отправлено: 03:50, 25-06-2012 | #17


Аватара для CyberMuesli

Старожил


Сообщения: 207
Благодарности: 18

Профиль | Отправить PM | Цитировать


Цитата Iska:
С этого нужно было начинать в первом же посте. »
я с этого и начал

Цитата CyberMuesli:
Цитата Iska:
Где сам пример цикла? »
Итак, поясняющий пример. »

-------
Кибер Мюсли


Отправлено: 03:53, 25-06-2012 | #18


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Ключевые слова — «с этого» и «в первом же».

Отправлено: 06:20, 25-06-2012 | #19


Ветеран


Сообщения: 1758
Благодарности: 966

Профиль | Цитировать


Цитата CyberMuesli:
Нет. Не работает. »
Цитата:
надо что-то вставить, что дважды раскроет VNAME, так же, как вне скобок
Код: Выделить весь код
if defined %1.!%1.Count! (

   set VNAME=%1.!%1.Count!
   echo VNAME=!VNAME!
   call set VNAME=%%!VNAME!%%
   echo VNAME=!VNAME!

)

Отправлено: 06:50, 25-06-2012 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - двойное раскрытие

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
.NET - Программное раскрытие DataGridViewComboBoxCell Delirium Программирование и базы данных 1 28-02-2011 17:55
двойное уменьшение частоты FSB K@kTuS Непонятные проблемы с Железом 2 20-04-2010 06:31
CMD/BAT - [решено] Раскрытие имени файла во вложеном For dARKest Скриптовые языки администрирования Windows 7 17-07-2009 00:15
Основы C++ | Раскрытие цикла while (s--) { ... }; Skrip Программирование и базы данных 3 20-08-2005 20:35
Двойное копирование файла с FTP. :( BlackMonk Хочу все знать 3 13-02-2005 09:08




 
Переход