首页 > 解决方案 > 为什么 for 循环中设置的变量不存在

问题描述

我写了两个for循环来做数据自动化。虽然变量在每个循环中都能很好地回响,但最后一步(使用编写良好的批处理的数据处理)不断给出先前设置的变量不存在的错误。

代码循环遍历目录下的子文件夹(q1、q2 等)。对于每个子文件夹,都有另一个 for 循环来设置多个变量。我在循环中很好地呼应了三个变量。但是,当使用名为 的批处理时abc.rb,错误是COM_M不存在的。实际上,错误是所有三个变量都不存在。

setlocal ENABLEDELAYEDEXPANSION
for /f %%f in ('dir /ad /b ') do (
    echo %%f
    pause
    pushd %%f
    for  %%a in (*.a*.dat) do (
        set COM_DATA=%%a
        echo !COM_DATA!
        set COM_V=%%f\com-v.dat
        echo !COM_V!
        set COM_M=%%f\com-M.dat
        echo !COM_M!
    )
    chdir
    set fig=someA
    set matrix=someB

    rem use a written batch (called abc.rb) to process data
    abc.rb  -a !COM_DATA!  -b !COM_V!  -c !COM_M! -d !fig! -e !matrix!

    popd
)
endlocal

任何人都可以找到任何错误吗?谢谢!

标签: batch-file

解决方案


我不确定为什么需要pushd进入目录,但据我所知,只需要一个for循环:

@echo off
setlocal enabledelayedexpansion
set "fig=someA"
set "matrix=someB"
for  /R %%a in (*.a*.dat) do (
    set "COM_DATA=%%a"
    echo !COM_DATA!
    set "COM_V=%%~dpacom-v.dat
    echo !COM_V!
    set COM_M=%%~dpacom-M.dat
    echo !COM_M!
    rem If abc.rb is is NOT a windows batch file, remove call below
    call abc.rb  -a "!COM_DATA!"  -b "!COM_V!"  -c "!COM_M!" -d !fig! -e !matrix!
)

如果你需要pushd(我怀疑)

@echo off
setlocal enabledelayedexpansion
set "fig=someA"
set "matrix=someB"
for  /R %%a in (*.a*.dat) do (
    pushd "%%~dpa"
    set "COM_DATA=%%a"
    echo !COM_DATA!
    set "COM_V=%%~dpacom-v.dat"
    echo !COM_V!
    set "COM_M=%%~dpacom-M.dat"
    echo !COM_M!
    rem If abc.rb is is NOT a windows batch file, remove call below
    call abc.rb  -a "!COM_DATA!"  -b "!COM_V!"  -c "!COM_M!" -d !fig! -e !matrix!
    popd
)

如果路径有空格,双引号会有所帮助,如果您的程序有问题,那么您可以删除它们:abc.rb -a !COM_DATA! -b !COM_V! -c !COM_M! -d !fig! -e !matrix!


推荐阅读