Войти

Показать полную графическую версию : [решено] Увеличение значения имени переменной или считывание строки файла в переменную


VokaMut
10-11-2012, 14:47
Уже часа 2 держу открытым OSzone и пытаюсь сам добиться своего, но одно осталось нерешенным:

set var1=text1
set var2=text2
set var3=text3
set var4=text4
for /l %%i in (1,1,4) do (
set text=!var%%i!
echo %text%
)

Подобный код нашел в одной из тем.

Нужно, что бы выводилась переменные в цикле, т.е. в идеал должна программа быть такой:

echo text1
echo text2
echo text3
echo text4

Но переменных "var*" 78 штук и вместо "echo %text%" используется более сложная конструкция.

Если это покажется проще, то сделайте пожалуйста цикл вытаскивания переменной из файла, новая строчка-новое значение переменной(так же ":" или ";" разделителями могу сделать в файле).
Буду очень признателен:)

Iska
10-11-2012, 15:53
Нужно, что бы выводилась переменные в цикле, т.е. в идеал должна программа быть такой: »
set var01=text1
set var02=text2
set var03=text3
set var04=text4
set var09=text9
set var10=text10
set var11=text11
set var99=text99

for /f "tokens=2* delims==" %%i in ('set var') do echo %%i
А вообще не понятно, что именно Вам нужно.

VokaMut
10-11-2012, 16:28
Цитата VokaMut:
А вообще не понятно, что именно Вам нужно. »
Файле 1.po происходит замена одного слова(textN), после файл компилируется в 1.mo и вместе с окружающими файлами архивируется в textN.rar

Iska
10-11-2012, 17:49
VokaMut, понятней не стало. Что именно у Вас не получается?

VokaMut
11-11-2012, 08:15
VokaMut, понятней не стало. Что именно у Вас не получается? »

chcp 866

::файл для редактирования
set infile=1\file.po

::первое слово которое ищем в файле для замены
set find=findword

::последующие
set var1=Слово1
set var2=Слово2
set var3=Слово3
set var4=Слово4

::цикл проходит по каждой переменной выше
for /f "tokens=2* delims==" %%i in ('set var') do (
::задаем заменяющее слово
set replace=%%i

::заменяем его
@echo off
setlocal enabledelayedexpansion
for /F "tokens=* delims=," %%n in (!infile!) do (
set LINE=%%n
set TMPR=!LINE:%find%=%replace%!
echo !TMPR!>>tmp.txt
)
move tmp.txt %infile%

::преобразуем file.po в file.mo
msgfmt file.po -o file.mo

::архивируем всю папку с этим файлом и исключаем file.po
"C:\PROGRA~1\WinRAR\rar.exe" a -m5 -s -y -ep1 -r -x*"file.po" "2\%replace%.rar" "1\*.*"

::теперь ищем заменяеющее слово и заменяем его на следующее
set find=%rerep%

::сделал паузу для проверки
pause
)


После просмотра увидел что:
set replace=%%i
Задается правильно, но в итоге переменная find:
set find=%rerep%
Получается пустая...

Для проверки работоспособности архивирование и компилирование из po в mo можно опустить

Iska
11-11-2012, 08:28
Что такое «rerep» и откуда оно берётся? Ибо в первый раз она появляется из ниоткуда и уже сразу участвует в присваивании.

Так что:
но в итоге переменная find:
set find=%rerep%
Получается пустая... »
ничего другого ожидать не приходится.

VokaMut
11-11-2012, 08:51
ничего другого ожидать не приходится. »
Заменил на:
set find=%replace%
Все равно в итоге переменная пустая, даже слово(findword) заменяется на пустое место

http://img339.imageshack.us/img339/9246/123il.png

gora
11-11-2012, 09:27
Все равно в итоге переменная пустая »
Так и должно быть!
1 setlocal enabledelayedexpansion должно быть в начале кода
2 Присвоение переменной set replace=%%i происходит в блоке первого for и, для правильного ее использования в дальнейшем внутри блока, она должна использоваться в знаках "!", а не в "%".
3 В строке set TMPR=!LINE:%find%=%replace%! переменную %replace% (!replace!) использовать затруднительно. Попробуйте так: set TMPR=!LINE:%find%=%%i!

VokaMut
11-11-2012, 10:00
В итоге получилось:

chcp 866
setlocal enabledelayedexpansion
set infile=file.po

set find=123

set var01=234
set var02=345
set var03=567
set var04=678

for /f "tokens=2* delims==" %%i in ('set var') do (

for /F "tokens=* delims=," %%n in (!infile!) do (
set LINE=%%n
set TMPR=!LINE:%find%=%%i!
Echo !TMPR!>>TMP.TXT
)
move TMP.TXT %infile%

set find=!i!

pause
)


Все равно итоге переменной find новое значение не присваивается и программа продолжает искать слово "123, заменяет на "234", потом снова ищет "123" и уже пытается заменить на "345" и т.д...

Iska
11-11-2012, 10:14
Все равно итоге переменной find новое значение не присваивается и программа продолжает искать слово "123, заменяет на "234", потом снова ищет "123" и уже пытается заменить на "345" и т.д... »
Вы чего хотели добиться-то? Я, например, так и не понял конечной Вашей цели. И сейчас не понимаю. Полагал, что пониманию поможет выложенный Вами код, но этого не случилось.

gora
11-11-2012, 10:20
переменной find новое значение не присваивается »
Она тоже присваивается внутри блока, а используете Вы ее опять в "%"set TMPR=!LINE:%find%=%%i! »
Вы чего хотели добиться-то? »
Я, к сожалению, тоже не смог понять постановку задачи.
VokaMut, сформулируйте ее четко, прикрепите файл file.po в архиве, что бы можно было проверять на Вашем файле.

VokaMut
11-11-2012, 10:24
Вы чего хотели добиться-то? Я, например, так и не понял конечной Вашей цели. И сейчас не понимаю. Полагал, что этому поможет выложенный Вами код, но этого не случилось. »
Давайте на чистоту.
Я являюсь одним из создателей модификаций интерфейса игры WOT.
По началу их было с десяток, но сейчас уже 78 и каждая по 2 варианта, т.е. 156 вариантов модификаций.
Вручную я их обрабатывал бы часа 2 и по этому автоматизировал архивацию (http://forum.oszone.net/thread-243807.html) папки с модом(измененный файл,файлы,инструкция).
Это сократило время в 4 раза и теперь всего пол часа всё это занимает.
Но я всё равно хочу ускорить процесс по максимуму.

VokaMut
26-11-2012, 15:54
На QT тоже не получилось написать.
Написал на php, проблема решена.




© OSzone.net 2001-2012