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

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

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

Новый участник


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

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


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

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

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

Отправлено: 11:24, 04-06-2009

 

Аватара для gora

Ушёл из жизни


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

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


Цитата RedScorpio:
Как сделать правильный разбор строки, не меняя ее формата? »
Попробуйте так:
Код: Выделить весь код
@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
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:46, 04-06-2009 | #2



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

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


Новый участник


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

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


Цитата 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:;;=;#;% "засунуть" в цикл?

Последний раз редактировалось RedScorpio, 04-06-2009 в 12:28.


Отправлено: 12:16, 04-06-2009 | #3


Аватара для gora

Ушёл из жизни


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

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


Цитата RedScorpio:
В реальности может быть с пробелами »
Тогда попробуйте так:
Код: Выделить весь код
@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

Последний раз редактировалось gora, 04-06-2009 в 12:40.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:29, 04-06-2009 | #4


Новый участник


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

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


Работает.

Но опять изменение формата
set "STRING=text 1;;;text 4"

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

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

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

Цитата gora:
Цитата:
В посте выше есть второй вариант!
Не сразу появился.
Не сообразил, что предварительно можно избавиться от кавычек

Спасибо.

Отправлено: 12:55, 04-06-2009 | #5


Новый участник


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

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


возможно тема безнадежно устарела, но я все равно напишу свое предложение по этой проблеме.
Идея состоит в том чтобы в вашем примере заменить тело цыкла 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

Отправлено: 17:52, 03-06-2011 | #6



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Не включается режим AGP 2X на Chaintech CT 6ATA2 и некорректный разгон выше 133МГц. J7BXA Материнские платы и память 5 03-12-2009 19:59
OSChooser разбор полета InventoRs Автоматическая установка Windows 2000/XP/2003 0 13-11-2009 00:54
[решено] Разбор HTML-кода на логические части Мартиша Вебмастеру 9 20-06-2009 00:09
Разбор HTML кода palmer_monk Вебмастеру 2 21-06-2006 15:29
Некорректный логон WinXP в домен (AD на Win2003srv) lantanoid Сетевые технологии 1 05-05-2005 17:32




 
Переход