使用变量调用第二批时遇到问题

时间:2016-09-22 17:43:19

标签: string windows variables batch-file cmd

我在弄清楚如何使用变量填充文件然后运行循环来打印一系列行时遇到问题。

以下是代码:

第1批:

@echo off

:: This batch read a file and copy all lines containing that word into a new 
file in an ordered list. (This works just fine)

findstr /C:"wordA" OLD.txt >> list_of_variables.txt
for /f "delims=" %%x in (list_of_variables.txt) do set string=%%x & call dp2.bat %string%

结果是这样的

wordA 1111 wordb
wordA 1112 wordb
wordA 1113 wordb
wordA 555 wordb

第2批:

@echo off
cls

:: This batch is supposed to get the variable %string% and look in a different file (old.txt) and copy a block of 10 lines below the matching string.

setlocal enabledelayedexpansion
set string=%string%
for /f "tokens=*" %%1 in (OLD.txt) do ( 
        if !flag! equ 1 (
         echo !string! %%1 >> output.txt
         set /a count+=1
         if !count! gtr 10 goto endit
         )
    if /i "%%1" equ "!string!" (set flag=1)
)
echo "%string%" not found check spellings and input file.
exit /b

:endit
type output.txt

预期结果如下:

|-same as string|  | read form old.txt|
wordA 1111 wordb   wordc word worde worf
wordA 1111 wordb   wordg worh wordi worj

这是交易:

如果我单独使用它们,它们都可以正常工作,但是当我尝试让它们一起工作时它不起作用。将worda设置为set string=worda的批处理2的工作方式类似于魅力,因此我知道它是正确的但是当我从批处理1传递变量时,它不会在output.txt文件中打印任何内容。

其他解决方案是在同一个批处理文件中调用2个循环,但我无法弄明白。

任何帮助或指导都将受到高度赞赏。

乔纳森。

2 个答案:

答案 0 :(得分:0)

在您的第一个批处理文件中,行:

for /f "delims=" %%x in (list_of_variables.txt) do set string=%%x & call dp2.bat %string%

在执行之前作为整体进行解析。那时%string%仍然是空的。 您必须使用delayed expansion

for /f "delims=" %%x in (list_of_variables.txt) do set string=%%x & call dp2.bat !string! 

答案 1 :(得分:0)

在batch1中,更改

for /f "delims=" %%x in (list_of_variables.txt) do set string=%%x & call dp2.bat %string%

for /f "delims=" %%x in (list_of_variables.txt) do call dp2.bat %%x

奇怪的是,您在第二批中使用delayedexpansion,但在第一批中没有使用delayedexpansion%var%允许访问变量值变化的循环中变量的运行时值。 var表示"遇到该行时!var!的原始值" var表示&{34; %%1的值,因为它通过命令的操作而发生变化"

在第二批中,将每个%%q更改为%1(或%% 任意字母,与案例一致。)the value of the first parameter provided to the routine表示{{1}并尝试将其用作元变量很容易发生灾难并被认为是批处理世界中的不良做法。

然后,您可以使用

string的值设置为第一个参数(由batch1提供)的值
set "string=%1"

请注意,如果传递的字符串包含空格或其他分隔符,则应引用传递的参数"%%x"并在赋值set "string=%~1"上取消引用字符串(注意~)< / p>

但是,按照您的代码,第一批将在环境中设置string,第二批将看到{1}},因为它是由batch1设置的; string是多余的。

我相信,您的问题是尝试将set string=%string%用作元变量。