批处理文件中的可变范围

时间:2011-07-25 14:43:49

标签: batch-file scope

我是编写批处理文件的新手;它的语法让我呕吐,所以我试着远离。简而言之,我需要一种快速简便的方法来检查大量数据并将其全部导出到Windows中的.csv文件中。我写了一个简单的小批处理文件来为我做这项工作。

我在变量范围方面遇到了一些问题。这段代码的想法是构建一个由逗号分隔的数据字符串,然后回显输出。另一个文件将捕获输出,但这并不重要。

这里有一些伪代码显示我遇到的问题,我已经多次遇到这个问题并重新调整了我的代码以试图避免它

setlocal EnableDelayedExpansion
::pseudo code for loop
LOOP THROUGH LIST OF FILE PATHS PUTTING THEM INTO %%B do (

set str=, ::reset str

other code

if exist %%B ( 

    other code

    ::echos the file path and checks if it is a specific file i need to search
    echo %%B 2> NUL | find /I /N %%B "%phrase_0_%" > NUL
    if %ERRORLEVEL% == 0 ( 

        ::HERE IS THE PROBLEM SEE BELOW FOR MORE INFO

        type %%B 2> NUL | find /I /N "%phrase_1_%" > temp.txt
        set /p var=<temp.txt
        set "str=!str!%var%,"
        del temp.txt

        type %%B 2> NUL | find /I /N "%phrase_2_%" > temp.txt
        set /p var=<temp.txt
        set "str=!str!%var%,"
        del temp.txt
    )

) else ( ::OTHER CODE )

echo !str!
)
endlocal

好的,这就是我认为问题所在。我一直遇到嵌套变量调用的问题。我会使用这个方便的循环技巧将一个命令的输出放入一个变量,但它需要另一个嵌套级别,这意味着更改变量值会更麻烦。正如你所看到的,我可以在:

中混淆%str%
if exists %%B(

使用setlocal EnableDelayedExpansion和!str!废话。但是当我用

进入另一个级别时,这将不起作用
if %ERRORLEVEL% == 0

你们对问题可能是什么或解决方案可能有什么建议吗?

1 个答案:

答案 0 :(得分:2)

无论嵌套级别如何,延迟扩展都将起作用。但无论如何你还有其他问题:

set /p var=<temp.txt
set "str=!str!%var%,"

您期望%var%有什么价值?您正在设置一个值并在块中的两个连续行中使用它。你也需要延迟扩张。