PDA

Показать полную графическую версию : [решено] CMD Разрезание строки на подстроки


Страниц : [1] 2

Acuna
17-03-2014, 19:18
Всем привет!

Есть строка вида

key1=value2;key2=value2;key3=value3

Появилась необходимость разрезать ее и сделать из нее переменные со значениями.

Таких пар "ключ-значение" может быть большое количество.

А получиться из этого должно что-то типа

%key1% = value1
%key2% = value2
%key3% = value3

и т. д. То есть одноименные переменные с присвоенными им значениями.

Обгуглился до кучи! Много вариантов когда делить нужно только по одному символу, а тут у меня его нужно осуществлять в несколько этапов по-ходу...

А вообще я батникам удивляюсь, для каждого чиха язык заново почти что создавать надо! (((

Заранее благодарен!

Georgio
17-03-2014, 20:00
А вообще я батникам удивляюсь, для каждого чиха язык заново почти что создавать надо! ((( »

Это уж точно. "Бои без правил". Но в этом их прелесть.


Вы это хотели получить в результате:

@echo off
setlocal enabledelayedexpansion
set n=
for %%i in (key1=value1;key2=value2;key3=value3) do (
set /a n+=1
if !n!==1 (
set key=%%i
) else (
set !key!=%%i
set n=
)
)
set key=
set key
pause>nul
endlocal
exit /b

???

Sphinx114
17-03-2014, 20:12
Применил небольшую хитрость:
@echo off
set "str=key1=value2;key2=value2;key3=value3"
set %str:;=&set %
set k
pause

Acuna
17-03-2014, 20:30
Это уж точно. "Бои без правил". Но в этом их прелесть.
Вот-вот, я бы даже сказал "на любителя"!)
Лично я предпочитаю, чтобы язык все-таки подчинялся каким-либо законам)

Спасибо, оба приема действительно режут. Но я, возможно, не совсем точно описал задачу. В итоге мне нужно выводить эти переменные в echo.

То есть echo %key1% выведет value1, echo %key2% выведет value2 и т. д. А изначально строка должна быть именно строкой (она будет вводиться как аргумент функции). Вообще, суть в том, что в батник нужно вбросить около 50 значений (то есть больше 9 возможных). Вот я и хотел их ввести всего одним аргументом...

Georgio
17-03-2014, 23:32
около 50 значений (то есть больше 9 возможных) »


Возможно и более 50 значений. Например, вот так:

@echo off
call:# "key1=value1" "key2=value2" "key3=value3" "key4=value4" "key5=value5"^
"key6=value6" "key7=value7" "key8=value8" "key9=value9" "key10=value10"^
"key11=value11" "key12=value12" "key13=value13" "key14=value14" "key15=value15"

echo %key1%
echo %key2%
echo %key3%
echo %key4%
echo %key5%
echo %key6%
echo %key7%
echo %key8%
echo %key9%
echo %key10%
echo %key11%
echo %key12%
echo %key13%
echo %key14%
echo %key15%

echo.

rem Или проще:
for /l %%i in (1 1 15) do call echo %%key%%i%%

pause>nul
exit /b

:#
for %%i in (%*) do set %%i
exit /b

Acuna
18-03-2014, 16:39
Ах да, действительно, решение

for %%i in (%*) do set %%i
оказалось наредкость изящным, а главное действенным. И без присущей батникам лишней писанины.

rem Или проще:
for /l %%i in (1 1 15) do call echo %%key%%i%%
Это понятно, просто количество аргументов изначально не известно. В том-то и прелесть этой задачи: юзер может ввести различное количество аргументов. Получается что-то сродни массиву.

А что, если эту задачу немного усложнить, скажем еще одним аргументом ввести просто переменную:

set var=ggg
moysuperbatnik.bat %var% "key1=value1" "key2=value2"

Что самое интересное, echo %1 в moysuperbatnik.bat при этом работает, но выводит сообщение "Переменная var не определена". Хотя ggg выводит. Это сообщение можно просто подавить, но боюсь того, как он может себя при этом повести на разных машинах...

Foreigner
18-03-2014, 18:21
Что самое интересное, echo %1 в moysuperbatnik.bat при этом работает, но выводит сообщение "Переменная var не определена" »
У меня все в порядке:

:: Вызывать -- mybatch.cmd %var% "key1=1;key2=2;key3=3"

@echo off
setlocal

echo %1
set str="%~2"

for %%i in (%str:;=","%) do set %%i

set key

Acuna
19-03-2014, 17:12
Foreigner, ой, да этот mybatch.cmd выкинул мне все мои установленные переменные и плюс надпись "Переменная среды key не определена". Это он ругается на строку set key(

Мне бы только второй аргумент распарсить в mybat.bat:

mybatch.cmd %var% "key1=value1;key2=value2;key3=value3"

А все остальные передавать в него as is...

Ну все равно, ларчик хоть и фомкой, но все-равно уже потихоньку поддается)

Foreigner
19-03-2014, 18:32
выкинул мне все мои установленные переменные и плюс надпись "Переменная среды key не определена" »

Iska
19-03-2014, 18:42
Изображения
Тип файла: png 1.png »
Foreigner, «Console2 (http://sourceforge.net/projects/console/)»?

Foreigner
19-03-2014, 19:07
Iska, conemu

Iska
19-03-2014, 19:26
Foreigner, спасибо, ясно. Тоже гоже.

yurfed
19-03-2014, 21:21
Acuna, вам скрипт нужен принципиально или можно обойтись стандартными средствами?
Любой текстовый редактор, понимающий регулярные выражения в поиске/замене. Тот же всем известный Notepad++ (http://alvarvas.com/s/html-redaktor-na-russkom-yazyke-notepad/)
Замена в два прохода. Первый - замена ; на перевод строки \n
Второй - замена key на %key%.
Делов на 5 секунд.

Acuna
21-03-2014, 03:15
yurfed, к сожалению, да. Предполагается, что эти аргументы юзеры будут вводить самостоятельно при использовании этого батника. То, что они работают с батниками, еще не свидетельствует об их обширных понятиях в этой области) Так что да, все должно быть "само") Ну либо если все-таки батники будут вредничать и дальше и расколоться не захотят - воспользуюсь неплохим решением Georgio. Просто мне все-таки хотелось одним аргументом все присунуть...

Foreigner, ну хорошо, вот ты получил эти три строки. А можно их как-то по знаку = теперь разделить на ключ и значение? Возможно, это то, что нужно)

Foreigner
21-03-2014, 07:49
Acuna, можно:

:: mybatch %var% "key1=1;key2=2;key3=3"

@echo off
setlocal

echo %1
set str="%~2"

for %%i in (%str:;=","%) do 1>nul set %%i

for /f "tokens=1,2 delims==" %%i in ('set key') do echo %%i %%j

Вывод:

test
key1 1
key2 2
key3 3

Acuna
24-03-2014, 20:04
Эцнова я) Foreigner, странно, но в mybatch пишет то же самое:

Переменная среды key не определена
Режим вывода команд на экран (echo) отключен
Нет, ну надо же какие душлые! :(

Foreigner
24-03-2014, 21:02
Acuna, Я даже не знаю, что посоветовать, скопировал свой последний вариант, все работает. Вы не забыли строку key1.... взять в кавычки?
mybatch %var% "key1=1;key2=2;key3=3" Т.к. символ ";" является разделителем. Во всяком случае в 8.1

Вы лучше напишите, что нужно конкретно, так будет проще.

Acuna
25-03-2014, 16:46
Foreigner, о Боже! Все-таки работает! Глаз замылился, забыл назначить переменную var. Хотя почему он при этом называл ее key для меня загадка, ну да ладно, батники живут своей жизнью... Да уж, решение конечно интересное...

Хотел спросить, а что за запятая в первой строке тут: %str:;=","% Это какой-то спец. символ, или что? И do 1>nul set %%i что-то подавляет? А что?

А так, огромное спасибо! Пожалуй, ларчик с размаху и фомкой, как это часто бывает с батниками, но все-таки открылся)))

Я для себя его немного доработал (мне же с этими переменными еще работать надоть) ). Так что кому интересно:



файл test.bat:

@echo off

set var1=value1

test2 %var1% "key1=1;key2=2;key3=3"

файл test2:

set str="%~2"
for %%i in (%str:;=","%) do 1>nul set %%i
for /f "tokens=1,2 delims==" %%i in ('set key') do set %%i=%%j

echo %~1
echo %key1%
echo %key2%
echo %key3%

Iska
25-03-2014, 17:56
а что за запятая в первой строке тут: %str:;=","% Это какой-то спец. символ, или что? »
Замена всех вхождений символа «;» в переменной окружения «str» на последовательность «","». Таким образом «"key1=1;key2=2;key3=3"» превращается в «"key1=1","key2=2","key3=3"».

И do 1>nul set %%i что-то подавляет? А что? »
Перенаправление stdout на пустое устройство («1>nul») подавляет вывод команды «set %%i».

Acuna
26-03-2014, 03:15
Iska, ясно, спасибо! Но ведь set только вводит новую переменную. А зачем ее нужно вводить и тут же подавлять? Или я что-то недопонимаю?)




© OSzone.net 2001-2012