1

Тема: CMD/BAT: Как разбить строки txt на отдельные переменные?

прочитал кучу тем по этому поводу, но своей задачи не нашел:
есть out_1.txt вида:


 10
051
A37
DD3
5F 

и out_2.txt:


  1
005
1A3
7DD
363

из них нужно получить 2 переменные вида (путь и имя файла):
\\share\000\000\000\000\000\000\010\051\a37\dd3\5f
и
00000000-0000-0000-0001-0051a37dd363
подскажите как вытащить определенную по счету строку в переменную?

2

Re: CMD/BAT: Как разбить строки txt на отдельные переменные?

http://forum.script-coding.com/viewtopi … 957#p65957

3

Re: CMD/BAT: Как разбить строки txt на отдельные переменные?

спасибо.

4 (изменено: basmanov, 2012-12-14 11:07:44)

Re: CMD/BAT: Как разбить строки txt на отдельные переменные?

возникла проблема что количество файлов out_N.txt может быть всегда разное, но подсчитать их не проблема...
как правильно использовать цикл, чтобы переменные именовались по порядку?
код типа не дает нужного результата:


set sFile=C:\kolvo.txt
if exist "%sFile%" <"%sFile%" set /p sKol=>nul

for /l %%i in (1,1,%sKol%) do
(
 set sFile%%i=C:\file_%%i.txt
 set sTempFile=C:\TempFile.tmp

 if exist "%sFile%%i%" (
    <"%sFile%%i%" set /p sFname%%i_1=>nul
    more +1 "%sFile%%i%">"%sTempFile%"
    <"%sTempFile%" set /p sFname%%i_2=>nul
    more +2 "%sFile%%i%">"%sTempFile%"
    <"%sTempFile%" set /p sFname%%i_3=>nul
    more +3 "%sFile%%i%">"%sTempFile%"
    <"%sTempFile%" set /p sFname%%i_4=>nul
    more +4 "%sFile%%i%">"%sTempFile%"
    <"%sTempFile%" set /p sFname%%i_5=>nul
    del "%sTempFile%"
    )
)

где ошибся в синтаксисе?

5 (изменено: basmanov, 2012-12-14 12:23:22)

Re: CMD/BAT: Как разбить строки txt на отдельные переменные?

перенес скобочку


for /l %%i in (1,1,%sKol%) do (

но переменные не именует

6

Re: CMD/BAT: Как разбить строки txt на отдельные переменные?

ничё не понял, но отложенная обработка подойдет

Я конечно далек от мысли... (с)

7 (изменено: wisgest, 2012-12-15 04:03:07)

Re: CMD/BAT: Как разбить строки txt на отдельные переменные?

basmanov пишет:

перенес скобочку

Да, это было обязательно!

smaharbA пишет:

но отложенная обработка подойдет

+1

setlocal ENABLEDELAYEDEXPANSION
...
for /l %%i in (1,1,%sKol%) do (
 set sFile%%i=C:\file_%%i.txt
...
 if exist "!sFile%%i!" (
 ...
 )
 ...
)

Но зачем вообще создавать при каждой итерации новую переменную sFile%%i, если бы можно было бы ограничиться sFile_1.

basmanov, и зачем было заимствовать у alexii извращения с more +4 и %sTempFile%, я ведь нарочно дал ссылку не на всю тему, а на сообщение #12 из неё, в котором предложен естественный подход.

Что-то вроде такого

setlocal ENABLEDELAYEDEXPANSION

set /p sKol=<C:\kolvo.txt

for /l %%i in (1,1,%sKol%) do (
 set sFile_1=C:\file_%%i.txt

 if exist "!sFile_1!" <"!sFile_1!" >nul (
    set /p sFname_1=
    set /p sFname_2=
    set /p sFname_3=
    set /p sFname_4=
    set /p sFname_5=
 )
 
)

И не надо засорять память, создавая при каждом проходе цикла новые переменные.

8 (изменено: basmanov, 2012-12-17 12:34:00)

Re: CMD/BAT: Как разбить строки txt на отдельные переменные?

setlocal ENABLEDELAYEDEXPANSION

set /p sKol=<C:\kolvo.txt

for /l %%i in (1,1,%sKol%) do (
 set sFile_1=C:\file_%%i.txt

 if exist "!sFile_1!" <"!sFile_1!" >nul (
    set /p sFname_1=
    set /p sFname_2=
    set /p sFname_3=
    set /p sFname_4=
    set /p sFname_5=
 )
 @echo Переменные: %sFname_1% \ %sFname_2% \ %sFname_3% \ %sFname_4% \ %sFname_5%
)

попробовал на нескольких файлах, выводит переменные только из 3го файла...

а вот моя конструкция работает нормально, остался вопрос как использовать к примеру экранировать sFname%%i_1
т.к. %sFname%%i_1% - не канает

for /l %%i in (1,1,%sKol%) do (
 set sTempFile=C:\TempFile.tmp

 if exist "C:\file_%%i.txt" (
    <"C:\file_%%i.txt" set /p sFname%%i_1=>nul
    more +1 "C:\file_%%i.txt">"%sTempFile%"
    <"%sTempFile%" set /p sFname%%i_2=>nul
    more +2 "C:\file_%%i.txt">"%sTempFile%"
    <"%sTempFile%" set /p sFname%%i_3=>nul
    more +3 "C:\file_%%i.txt">"%sTempFile%"
    <"%sTempFile%" set /p sFname%%i_4=>nul
    more +4 "C:\file_%%i.txt" > "%sTempFile%"
    <"%sTempFile%" set /p sFname%%i_5=>nul
    del "%sTempFile%"
    )
)

хочется чтобы были переменные в виде 00000000-0000-0000-0001-0051a37dd363
типа:

set /p sFullFile%%iName= 00000000-0000-0000-000%sFname%%i_1%-%sFname%%i_2%%sFname%%i_3%%sFname%%i_4%%sFname%%i_5% 

9 (изменено: wisgest, 2012-12-17 12:49:20)

Re: CMD/BAT: Как разбить строки txt на отдельные переменные?

basmanov пишет:
 @echo Переменные: %sFname_1% \ %sFname_2% \ %sFname_3% \ %sFname_4% \ %sFname_5%

попробовал на нескольких файлах, выводит переменные только из 3го файла...

А так:

 @echo Переменные: !sFname_1! \ !sFname_2! \ !sFname_3! \ !sFname_4! \ !sFname_5!

?

Ты всё-таки не знаешь об отложенном раскрытии :

SETLOCAL /? пишет:

ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION включает или отключает
отложенное расширение переменной среды.  См. SET /? для подробного объяснения.

10

Re: CMD/BAT: Как разбить строки txt на отдельные переменные?

А так:

@echo Переменные: !sFname_1! \ !sFname_2! \ !sFname_3! \ !sFname_4! \ !sFname_5! 

?

и так тоже не работает

11 (изменено: wisgest, 2012-12-17 18:17:45)

Re: CMD/BAT: Как разбить строки txt на отдельные переменные?

Проверил — работает.

Количество файлов соответствует заявленному в kolvo.txt?
По-хорошему, «echo Переменные…» следовало бы включить в
«if exist "!sFile_1!"»…

В файлах между строками нет пропусков? — Если на вход SET /P подать пустую строку, то переменная сохранит прежнее значение, поэтому, по-хорошему, перед каждым считыванием строки в переменную, следовало бы её очищать (удалять).


@echo off
setlocal ENABLEDELAYEDEXPANSION

set /p sKol=<C:\kolvo.txt

for /l %%i in (1,1,%sKol%) do (
 set sFile_1=C:\file_%%i.txt

 if exist "!sFile_1!" (
   (
      set sFname_1=
      set /p sFname_1=
      set sFname_2=
      set /p sFname_2=
      set sFname_3=
      set /p sFname_3=
      set sFname_4=
      set /p sFname_4=
      set sFname_5=
      set /p sFname_5=
   ) <"!sFile_1!" >nul 
   echo 00000000-0000-0000-000!sFname_1!-!sFnami_2!!sFname_3!!sFname_4!!sFname_5!
 )
)