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

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

RedScorpio 04-06-2009 11:24 1134701

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

Код:

@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 04-06-2009 11:46 1134726

Цитата:

Цитата 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


RedScorpio 04-06-2009 12:16 1134747

Цитата 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 04-06-2009 12:29 1134762

Цитата:

Цитата 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


RedScorpio 04-06-2009 12:55 1134779

Работает.

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

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

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

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

Цитата gora:
Цитата:

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

Спасибо.

ldap 03-06-2011 17:52 1687916

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



Время: 01:41.

Время: 01:41.
© OSzone.net 2001-