【问题标题】:Batch Programming: read txt and keep variables with a subroutine批处理编程:读取 txt 并使用子程序保存变量
【发布时间】:2013-11-17 16:41:04
【问题描述】:

我是第一次编写一个 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 完成后保留?因为在批处理文件方面我绝对是新手,如果您不仅给我提示而且给我代码,我会很高兴;-)

提前谢谢你。

罗伊

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 文件:

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

【问题讨论】:

  • 你的问题是endlocal。这将恢复自 setlocal 以来对变量的任何更改。在您的 readlist.bat 中删除 setlocalendlocal。将它们放入您的 callreadlist.bat 中。
  • 就是这样!非常感谢你!问题解决了我会说。但我不得不说:对我来说看起来很不合逻辑......我的意思是 setlocal 然后静止打开,甚至更早的一个脚本......
  • 不是那么不合逻辑:子进程在母进程的环境中运行 - 所以两者共享相同的变量。除非你明确告诉女儿使用 setlocal 的自己的环境

标签: batch-file


【解决方案1】:

好东西:

@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

【讨论】:

    【解决方案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&amp;(etc) 时的值替换。 & 允许在一条物理线上执行多个命令...

    【讨论】:

      【解决方案3】:

      您想读取 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= 未定义变量)。

      【讨论】:

      • 请不要在= 周围使用空格和set 命令。 set ordner%i% = %%a 将名称为“ornder1 ”的变量设置为值“`Ordner1". Use set ordner%i%=%%a` 或确保末尾没有空格@987654333 @
      • 斯蒂芬:你完全正确。我知道,但我总是弄错。我讨厌这个东西。固定。
      • 这不起作用。你知道为什么不吗?您无法在代码块内访问您的计数器%i%
      • 我可以使用!i!而不是%i%来访问块内的计数器。 Noize,您的解决方案对我来说似乎很简洁,我只是觉得您在set i=1 中忘记了/a。但是,如果我在三个 for 循环中执行此操作,我可以稍后比较 4 个不同的计数器,以检查某些行是否有问题...
      • 实际上/a 参数只有在执行算术运算时才需要。如果我添加它不会出错,但它不是必需的。 “但如果我在三个 for 循环中执行此操作,我可以稍后比较 4 个不同的计数器,以检查某些行是否有问题......” - 我无法理解你的意思。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 2015-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多