批量编程:使用子程序读取文本并保留变量

时间:2013-11-17 16:41:05

标签: batch-file

我第一次写了一个bactch文件,我遇到了一个我无法解决的问题。 (我不是程序员,只是机械工程师,所以请原谅我的笨拙......而且我的英语:我不是母语人士......)

我想编写一个批处理文件( 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 

第二块似乎有效。或者说:这些变量被移交给 callreadlist 。但那些只是手动设置测试变量...

然而,第一个街区不起作用,我无法找出原因......

如何在 readlist.bat 完成后管理所有读入的变量?因为对于批处理文件我是一个绝对的新手,所以如果你不仅给我tipps而是代码,我会很高兴的; - )

提前谢谢。

罗伊

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

尝试:

...
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% s在遇到endlocal&(etc)时被其值替换。 &安培;允许在一条物理线路上使用多个命令...

答案 2 :(得分: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%其中“job”是您的列,“26”是行号)。

例如,如果您希望CALLREADLIST.BAT在第45行输出“输入”,那么您需要的只是:

@echo off
readlist
echo %input45%

第一个块不起作用只是因为你为变量名分配了它们自己的值,它是null(set var=%var%,即set var=,它取消定义变量。)