CMD/BAT - [решено] Некорректный разбор строки

Ответить
Аватара пользователя
RedScorpio

CMD/BAT - [решено] Некорректный разбор строки

Сообщение RedScorpio »

Пытаюсь в командном файле разобрать строку (это только для примера)





Код:

Код: Выделить всё

@echo off
set STRING="1;2;3;4"
echo %STRING%
for /F "tokens=1,2,3,4 delims=;" %%a in (%STRING%) do (
  set V1=%%a
  set V2=%%b
  set V3=%%c
  set V4=%%d
)
echo var1=%V1%
echo var2=%V2%
echo var3=%V3%
echo var4=%V4%

Все работает корректно



Но если строка выглядит как STRING="1;;3;4", значения переменных "съезжают" (т.е. пустой будет переменная V4, а не V2).



Как сделать правильный разбор строки, не меняя ее формата?
Аватара пользователя
gora

Re: CMD/BAT - [решено] Некорректный разбор строки

Сообщение gora »

Цитата RedScorpio:



Как сделать правильный разбор строки, не меняя ее формата?
CMD/BAT - [решено] Некорректный разбор строки




Попробуйте так:

Код:

Код: Выделить всё

@echo off
setlocal enabledelayedexpansion
set STRING=1;;3;4
echo %STRING%
set STRING=#%STRING:;=;#%
for /F "tokens=1,2,3,4 delims=;" %%a in ("%STRING%") do (
  set V1=%%a
  set V1=!V1:~1!
  set V2=%%b
  set V2=!V2:~1!
  set V3=%%c
  set V3=!V3:~1!
  set V4=%%d
  set V4=!V4:~1!
)
echo var1=%V1%
echo var2=%V2%
echo var3=%V3%
echo var4=%V4%
Pause
Аватара пользователя
RedScorpio

Re: CMD/BAT - [решено] Некорректный разбор строки

Сообщение RedScorpio »

Цитата gora:


Цитата:



Попробуйте так:



Да, так работает. Но, к сожалению, это уже изменение формата разбираемой строки (STRING=1;;3;4).

В примере строка была упрощена. В реальности может быть с пробелами, поэтому кавычки обязательны (STRING="text 1;;text 3;text 4"



Но идея мне понравилась





Код:

Код: Выделить всё

@echo off
set STRING="1;;3;4"
set STRING=%STRING:;;=;#;%
echo %STRING%
for /F "tokens=1,2,3,4 delims=;" %%a in (%STRING%) do (
  set V1=%%a
  set V2=%%b
  set V3=%%c
  set V4=%%d
)
echo var1=%V1%
echo var2=%V2%
echo var3=%V3%
echo var4=%V4%

Дальше буду просто отбрасывать #



Спасибо



Рано обрадовался



При STRING="1;;;4" уже не работает.



Как бы set STRING=%STRING:;;=;#;% "засунуть" в цикл?
Аватара пользователя
gora

Re: CMD/BAT - [решено] Некорректный разбор строки

Сообщение gora »

Цитата RedScorpio:



В реальности может быть с пробелами
CMD/BAT - [решено] Некорректный разбор строки




Тогда попробуйте так:

Код:

Код: Выделить всё

@echo off
set "STRING=text 1;;;text 4"
echo %STRING%
set temp_STRING="#%STRING:;=;#%"
for /F "tokens=1,2,3,4 delims=;" %%a in (%temp_STRING%) do (
  set V1=%%a
  set V2=%%b
  set V3=%%c
  set V4=%%d
)
set V1=%V1:~1%
set V2=%V2:~1%
set V3=%V3:~1%
set V4=%V4:~1%
echo var1=%V1%
echo var2=%V2%
echo var3=%V3%
echo var4=%V4%
Pause

Работает и с пробелами.



Еще вариант. Ваша переменная STRING в кавычках и остается в неизменном виде:

Код:

Код: Выделить всё

@echo off
set STRING="text 1;;;text 4"
echo %STRING%
for /d %%i in (%STRING%) do set "temp_STRING=%%~i"
set temp_STRING="#%temp_STRING:;=;#%"
for /F "tokens=1,2,3,4 delims=;" %%a in (%temp_STRING%) do (
  set V1=%%a
  set V2=%%b
  set V3=%%c
  set V4=%%d
)
set V1=%V1:~1%
set V2=%V2:~1%
set V3=%V3:~1%
set V4=%V4:~1%
echo var1=%V1%
echo var2=%V2%
echo var3=%V3%
echo var4=%V4%
Pause
Аватара пользователя
RedScorpio

Re: CMD/BAT - [решено] Некорректный разбор строки

Сообщение RedScorpio »

Работает.



Но опять изменение формата

set "STRING=text 1;;;text 4"



Строка set STRING="text 1;;;text 4" должна быть неизменной. В реальности она читается из файла конфигурации, который используется многими другими скриптами. Проблема возникла после того, как появилась необходимость читать этот файл под Windows (под Linux используется скрипт с awk/gawk)



Т.е. нужно решить вопрос:



Как бы set STRING=%STRING:;;=;#;% "засунуть" в цикл?



Цитата gora:


Цитата:



В посте выше есть второй вариант!



Не сразу появился. Изображение

Не сообразил, что предварительно можно избавиться от кавычек



Спасибо.
Аватара пользователя
ldap

Re: CMD/BAT - [решено] Некорректный разбор строки

Сообщение ldap »

возможно тема безнадежно устарела, но я все равно напишу свое предложение по этой проблеме.

Идея состоит в том чтобы в вашем примере заменить тело цыкла do (...) на вызов процедуры.

в этом варианте все красиво работает. переменная не выводит постоянно последнее значение наружного цыкла:



мой пример несколько отличается, но смысл тот же:

здесь поднимается файл, в котором перечислены полные пути типа d:\folder1\folder2\folder3.....

пример перебирает строки из этого файла и передает их параметром на обработку в некую процедуру (в этом случае вынимаются слэши из строки).





Код:

Код: Выделить всё

@echo off
set wd=.\
set bd=.\backups
for /F %%a in (backuper.cnf) do CALL :getFolder %%a
goto :EOF
:getFolder
echo BackupTaskabout: %1
FOR /F "eol=; tokens=2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 delims=\" %%i in ("%1") do set s=%%i %%j %%k %%l %%m%%n%%o%%p%%q%%r%%s%%t%%u%%v%%w
echo    folder %s%
goto :EOF
Ответить

Вернуться в «Скриптовые языки администрирования Windows»