Batch file 为什么为循环设置的变量不存在

Batch file 为什么为循环设置的变量不存在,batch-file,Batch File,我为循环编写了两个,以实现数据自动化。虽然变量在每个循环中都有很好的响应,但最后一步(使用编写良好的批处理的数据处理)会不断给出错误,即前面设置的变量不存在 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 ec

我为循环编写了两个
,以实现数据自动化。虽然变量在每个循环中都有很好的响应,但最后一步(使用编写良好的批处理的数据处理)会不断给出错误,即前面设置的变量不存在

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
代码在目录下的子文件夹(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

有人能找到任何虫子吗?谢谢大家!

我不确定为什么需要将
推送到dir中,但据我所知,只需要一个
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
(我对此表示怀疑)

如果路径有空格,双引号会有所帮助,如果您的程序有问题,那么您可以删除它们:
abc.rb-a!COM_数据-B康沃尔-C康姆-D无花果-E矩阵

@echo off
setlocal ENABLEDELAYEDEXPANSION

set "fig=someA"
set "matrix=someB"
set "COM_V=com-v.dat"
set "COM_M=com-M.dat"

for /f %%f in ('dir /ad /b') do (
    echo %%f
    pause
    if exist "%%~f\*.a*.dat" (
        pushd "%%~f" && (
            for  %%a in (*.a*.dat) do (
                set "COM_DATA=%%~a"
                echo !COM_DATA!
            )
            chdir

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

            popd
        )
    )
)
endlocal
问题:

  • 如果嵌套的
    for
    循环未找到匹配模式为
    *.a*.dat
    的文件,则变量
    COM_DATA
    COM_V
    COM_M
    可能无法定义或更新为新值

  • COM_DATA
    的值是一个文件名。
    COM_V
    COM_M
    的值是父文件夹名称和文件名,两者不一致。基于当前目录,我认为文件名是正确的。这意味着
    COM_V
    COM_M
    永远不需要更改

  • 如果
    abc.rb
    是一个批处理文件,那么您需要使用
    call
    让解释器将控制权返回到主脚本

  • 变化:

  • 测试文件模式是否存在,如果存在,则在代码块中运行代码

  • COM_V
    COM_M
    for
    循环中移出,因为值从未更改

  • 作为批处理文件调用abc.rb
  • 矩阵
    被移出
    for
    循环,因为值永远不会改变

  • 变量的双引号设置和变量的使用,以避免空格、特殊字符等问题

  • pushd&(
    确保括号内的代码仅在成功更改目录时运行

  • 删除了
    rem
    行中的括号。它们可能不会导致问题,但
    rem
    行已被解析,可能会导致语法错误。建议避免使用
    rem
    行中的特殊字符,除非您打算调试


  • 为什么需要
    dir
    然后搜索文件?你在这里只需要一个循环。而且,你没有给出预期的结果,我不知道
    abc.rb-a..
    的输出应该是什么样子。谢谢你的回复!abc.rb用于生成一些excel文件。但是现在找不到这三个变量。第一个循环用于定位e每个子文件夹,q1,q2…第二个用于设置三个变量,因为每个子文件夹中COM_数据的名称不同。我建议您尝试在调用abc.rb之前添加
    echo abc.rb-a..
    (而不是简单地执行
    abc.rb
    )。没有看到
    abc.rb.bat
    这只是猜测,但是如果您希望在执行
    abc.rb
    时建立
    com_数据
    ,那么可能
    调用
    会解决这个问题,但是将其作为参数传递没有实际意义,
    abc.rb.bat
    会将其视为
    %2
    。对于%%a%%code>
    似乎是一种巨大的时间浪费-它所能做的就是将
    com_数据
    建立为目录中的最后一个
    *.a*.dat
    文件