2013-11-17 1 views
2

Я пишу файл bactch в первый раз, и у меня есть проблема, которую я еще не смог решить. (Я не программист, а просто инженер-механик, поэтому, пожалуйста, простите меня за мою неуклюжесть .. И мой английский: я не носитель языка ...)Пакетное программирование: чтение txt и сохранение переменных с помощью подпрограммы

Я хочу написать командный файл (readlist.bat), который среди прочего следует читать в txt-файле (Text.txt). Затем этот пакетный файл должен быть вызван в другом пакетном файле с номером «call readlist.bat». Для меня ясно следующее: мне нужно определить переменные в readlist.bat не только локально, если я хочу, чтобы они сохранялись после readlist.bat заканчивается. Я попытался реализовать это в прикрепленных файлах, по крайней мере, для некоторых переменных. (Конечно, конечная цель - сохранить все переменные, считываемые из txt-файла.) Но я не могу это сделать.

text.txt содержит только «тестовые переменные» readlist.btat должны прочитать во всех строках в столбцах (это работает). Но переменные должны быть определены «не локально». Поэтому по причинам тестирования я добавил следующие команды:

endlocal 
set "job1fld=%job1fld%" 
set "job1dat=%job1dat%" 
set "job1kyw=%job1kyw%" 
set "job2fld=%job2fld%" 
set "job2dat=%job2dat%" 
set "job2kyw=%job2kyw%" 
set "job3fld=%job3fld%" 
set "job3dat=%job3dat%" 
set "job3kyw=%job3kyw%" 

set vartest1=test1 
set vartest2=test2 
set vartest3=test3 
set vartest4=test4 
set vartest5=test5 
set vartest5=test6 
set vartest6=test7 

Второй блок, похоже, работает. Или давайте скажем: эти переменные передаются в список запросов. Но это только вручную установить тест-переменные ...

Первый блок, однако, не работает, и я не могу figureout почему ...

Как управлять, что все переменные читать сохраняются после . readlist.bat отделка? Поскольку я абсолютный greenhorn, когда дело доходит до пакетных файлов, я был бы рад, если бы вы не только дали мне подсказки, но и коды ;-)

Спасибо заранее.

Рой

CALLREADLIST.BAT:

@echo off 
call readlist.bat 
set 
pause 

READLIST.BAT:

REM ================================= 
REM ================================= 
REM READ TXT 
@echo off 
setlocal ENABLEDELAYEDEXPANSION 
REM START: Read 1. Column (Ordner) 
set ColNo=1 
set cntr1=0 
for /F "delims=; tokens=%ColNo%" %%A in (Text.txt) do (
    set /a cntr1=!cntr1! + 1 
    set job!cntr1!fld=%%A 
) 
REM END: Read 1. Column (Ordner) 
REM START: Read 2. Column (Ordner) 
set ColNo=2 
set cntr2=0 
for /F "delims=; tokens=%ColNo%" %%A in (Text.txt) do (
    SET /A cntr2=!cntr2! + 1 
    set job!cntr2!dat=%%A 
) 
REM END: Read 2. Column (Ordner) 
REM START: Read 3. Column (Ordner) 
set ColNo=3 
set cntr3=0 
for /F "delims=; tokens=%ColNo%" %%A in (Text.txt) do (
    SET /A cntr3=!cntr3! + 1 
    set job!cntr3!kyw=%%A 
) 
REM END: Read 3. Column (Ordner) 
endlocal 
set "job1fld=%job1fld%" 
set "job1dat=%job1dat%" 
set "job1kyw=%job1kyw%" 
set "job2fld=%job2fld%" 
set "job2dat=%job2dat%" 
set "job2kyw=%job2kyw%" 
set "job3fld=%job3fld%" 
set "job3dat=%job3dat%" 
set "job3kyw=%job3kyw%" 
set vartest1=test1 
set vartest2=test2 
set vartest3=test3 
set vartest4=test4 
set vartest5=test5 
set vartest5=test6 
set vartest6=test7 

TXT-FILE:

Ordner1;Job1;Input1 
Ordner2;Job2;Input2 
Ordner3;Job3;Input3 
Ordner4;Job4;Input4 
Ordner5;Job5;Input5 
Ordner6;Job6;Input6 
Ordner7;Job7;Input7 
Ordner8;Job8;Input8 
Ordner9;Job9;Input9 
Ordner10;Job10;Input10 
Ordner11;Job11;Input11 
Ordner12;Job12;Input12 
Ordner13;Job13;Input13 
Ordner14;Job14;Input14 
Ordner15;Job15;Input15 
Ordner16;Job16;Input16 
Ordner17;Job17;Input17 
Ordner18;Job18;Input18 
Ordner19;Job19;Input19 
Ordner20;Job20;Input20 
Ordner21;Job21;Input21 
Ordner22;Job22;Input22 
Ordner23;Job23;Input23 
Ordner24;Job24;Input24 
Ordner25;Job25;Input25 
Ordner26;Job26;Input26 
Ordner27;Job27;Input27 
Ordner28;Job28;Input28 
Ordner29;Job29;Input29 
Ordner30;Job30;Input30 
Ordner31;Job31;Input31 
Ordner32;Job32;Input32 
Ordner33;Job33;Input33 
Ordner34;Job34;Input34 
Ordner35;Job35;Input35 
Ordner36;Job36;Input36 
Ordner37;Job37;Input37 
Ordner38;Job38;Input38 
Ordner39;Job39;Input39 
+2

Ваша проблема - 'endlocal'. это возвращает любые изменения к переменным с 'setlocal'. Избавьтесь от 'setlocal' и' endlocal' в вашем readlist.bat. Вместо этого поместите их в ваш callreadlist.bat. – Stephan

+0

Вот оно! Большое спасибо! Проблема решена, я бы сказал. Но я должен сказать: выглядит довольно нелогично для меня ... Я имею в виду, что setlocal затем выключен, только один skript ранее ... – user3001971

+0

не так уж и нелогично: дочерний процесс работает в среде матери -process - так что оба имеют одни и те же переменные. Если вы не сообщите дочерней явной использовать собственную среду с 'setlocal' – Stephan

ответ

2

Try:

... 
REM END: Read 3. Column (Ordner) 
endlocal&(
set "job1fld=%job1fld%" 
set "job1dat=%job1dat%" 
set "job1kyw=%job1kyw%" 
set "job2fld=%job2fld%" 
set "job2dat=%job2dat%" 
set "job2kyw=%job2kyw%" 
set "job3fld=%job3fld%" 
set "job3dat=%job3dat%" 
set "job3kyw=%job3kyw%" 
set vartest1=test1 
set vartest2=test2 
set vartest3=test3 
set vartest4=test4 
set vartest5=test5 
set vartest5=test6 
set vartest6=test7 
) 

По сути, должно случиться, что вся последняя строка анализируется с ENDLOCAL до закрывающей скобки. Это THEN выполнено, но с %var% с заменены на их значения во время столкновений endlocal&(etc). & допускает несколько команд на одной физической линии ...

0

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

Легко:

@echo off 
set i=1 
for /f "delims= ; tokens=1-3" %%a in (Text.txt) do (
    set ordner%i%=%%a 
    set job%i%=%%b 
    set input%i%=%%c 
    set /a i=i+1 
) 

Этот код будет установить переменные, как это:

set ordner1=Ordner1 
set job1=Job1 
set input1=Input1 

set ordner2=Ordner2 
set job2=Job2 
set input2=Input2 

... 

Из вашего вызова файла (CALLREADLIST.BAT) вы можете получить доступ к любой столбец в любой строке, просто используя %columnLine% (например: %job26%, где «задание» - это ваш столбец и «26» номер строки).

Например, если вы хотите CALLREADLIST.BAT для вывода «Input» в строке 45 все, что вам было бы нужно было бы:

@echo off 
readlist 
echo %input45% 

Первый блок не работает только потому, что вы присваивание переменная именует свои собственные значения, которая равна null (set var=%var%, то есть set var=, которая определяет неопределенность переменной).

+1

Пожалуйста, не используйте пробелы вокруг' = 'с помощью команды' set'. 'set ordner% i% = %% a' устанавливает переменную с именем (например)" 'ornder1' "в значение" Ordner1' ". Используйте 'set ordner% i% = %% a' или убедитесь, что в конце нет пробелов' set 'ordner% i% = %% a "' – Stephan

+0

Stephan: вы совершенно правы. Я знаю это, но я все время ошибаюсь. Я ненавижу эту вещь. Исправлена. – noize

+1

это не работает. Вы знаете, почему нет? Вы не можете получить доступ к своему счетчику '% i%' внутри блока кода. – Endoro

3

хороший материал:

@echo off 
for /f %%a in ('^< Text.txt find /c /v ""') do set /a lines=%%a 
<Text.txt (
for /l %%a in (1 1 %lines%) do (
    set "line=" 
    set /p "line=" 
    for /f "tokens=1-3delims=;" %%d in ('call echo %%line%%') do (
     set "job%%afld=%%d"&set "job%%asat=%%e"&set "job%%akyw=%%f" 
    ) 
)) 
set "line="&set "lines=" 
set "job" 

Это очень просто, реальная задача состоит в том, чтобы дать каждому работу переменной уникальный номер (здесь 1-117) без delayed expansion.

Смежные вопросы