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