Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] CMD Разрезание строки на подстроки (http://forum.oszone.net/showthread.php?t=279407)

Acuna 17-03-2014 19:18 2324968

CMD Разрезание строки на подстроки
 
Всем привет!

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

Код:

key1=value2;key2=value2;key3=value3
Появилась необходимость разрезать ее и сделать из нее переменные со значениями.

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

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

Код:

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

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

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

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

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

Georgio 17-03-2014 20:00 2324987

Цитата:

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

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



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

Код:

@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 2324989

Применил небольшую хитрость:
Код:

@echo off
set "str=key1=value2;key2=value2;key3=value3"
set %str:;=&set %
set k
pause


Acuna 17-03-2014 20:30 2324996

Цитата:

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

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

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

Georgio 17-03-2014 23:32 2325010

Цитата:

Цитата Acuna
около 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 2325283

Ах да, действительно, решение

Код:

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 2325343

Цитата:

Цитата Acuna
Что самое интересное, 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 2325793

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 2325837

Вложений: 1
Цитата:

Цитата Acuna
выкинул мне все мои установленные переменные и плюс надпись "Переменная среды key не определена" »


Iska 19-03-2014 18:42 2325842

Цитата:

Цитата Foreigner
Изображения
Тип файла: png 1.png »

Foreigner, «Console2»?

Foreigner 19-03-2014 19:07 2325858

Iska, conemu

Iska 19-03-2014 19:26 2325873

Foreigner, спасибо, ясно. Тоже гоже.

yurfed 19-03-2014 21:21 2325956

Acuna, вам скрипт нужен принципиально или можно обойтись стандартными средствами?
Любой текстовый редактор, понимающий регулярные выражения в поиске/замене. Тот же всем известный Notepad++
Замена в два прохода. Первый - замена ; на перевод строки \n
Второй - замена key на %key%.
Делов на 5 секунд.

Acuna 21-03-2014 03:15 2326501

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

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

Foreigner 21-03-2014 07:49 2326527

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 2328039

Эцнова я) Foreigner, странно, но в mybatch пишет то же самое:

Цитата:

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

Foreigner 24-03-2014 21:02 2328063

Acuna, Я даже не знаю, что посоветовать, скопировал свой последний вариант, все работает. Вы не забыли строку key1.... взять в кавычки?
Код:

mybatch %var% "key1=1;key2=2;key3=3"
Т.к. символ ";" является разделителем. Во всяком случае в 8.1

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

Acuna 25-03-2014 16:46 2328418

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 2328434

Цитата:

Цитата Acuna
а что за запятая в первой строке тут: %str:;=","% Это какой-то спец. символ, или что? »

Замена всех вхождений символа «;» в переменной окружения «str» на последовательность «","». Таким образом «"key1=1;key2=2;key3=3"» превращается в «"key1=1","key2=2","key3=3"».

Цитата:

Цитата Acuna
И do 1>nul set %%i что-то подавляет? А что? »

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

Acuna 26-03-2014 03:15 2328645

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

Iska 26-03-2014 09:14 2328690

Цитата:

Цитата Acuna
Но ведь set только вводит новую переменную. »

Не «вводит». Осуществляет создание переменной окружения и присвоение ей значения.

Acuna 29-03-2014 14:23 2330184

Iska, ну да, так, возможно, будет точнее. Но вот я и спрашиваю, если она просто создает переменную окружения и присваивает ей значение, то зачем подавлять ее вывод, которого нет?

Iska 29-03-2014 22:41 2330362

Acuna, я тоже не знаю. Подождём, что скажет на этот счёт коллега Foreigner.

Foreigner 29-03-2014 22:52 2330369

Цитата:

Цитата Acuna
то зачем подавлять ее вывод, которого нет? »

Легче всего убрать "1>nul" и посмотреть разницу.

Iska 29-03-2014 22:59 2330375

Foreigner, на примере кода из #15 — не вижу, не пойму. Покажите, что у Вас — c «1>nul» и без «1>nul».


Время: 13:45.

Время: 13:45.
© OSzone.net 2001-