如何在批处理文件中使用嵌套FOR循环

问题描述:

我有一些代码,我想用FOR循环来处理一组文件。 作为处理文件的一部分,有一个FOR /F循环读取它并根据文件名将数据追加到其他文件。如何在批处理文件中使用嵌套FOR循环

为了能够设置输出文件名,我设置了延迟变量扩展集。

这是代码应该是什么样子,因为我原本打算它是:

setlocal enabledelayedexpansion 
for %%f in (DataFolder\*.Ext) do (
    set POI=%%~f 
    set POI=!JbPOI:DataFolder\=! 
    set POI=!JbPOI:.Ext=! 
    for /f "tokens=1,2,3 delims=," %%a in ("%%~f") do (
     set CX=%%a 
     set CY=%%b 
     set FN=%%c 
     echo !FN!,9,!CX!,!CY! >> "DataFolder\!POI!.tmp" 
    ) 
) 
endlocal 

此代码不起作用,因为变量%%a%%b%%c永远不会收到一个值,%%a总是有与%%f的值相同。

我已阅读了一些关于此问题的文章,但无法从他们的工作中提取解决方案。

我已经试过几件事,没有到目前为止工作...

  • 添加一个虚拟外环创建变量%%a通过%%j明确
  • FOR取出循环,并使它成为子程序
  • 内部FOR环取出并使其成为一个单独的批处理文件

任何人都可以请te让我知道这可以 - 或必须 - 解决?

+1

我想说最简单的解决方案是安装Python并为它编写一个小Python脚本。或者除了MS批处理之外还有其他任何语言 – ThiefMaster 2014-11-23 15:45:09

+0

是否要读取文件'%%〜f'的内容或将其名称用作字符串。因为现在您将它用作字符串。 – npocmaka 2014-11-23 15:54:52

+0

文件%% f将被读取......如果以这种方式将它视为字符串:这有意义地解释了为什么%% a始终与%% f具有相同的值。我将要做更多的测试... – 2014-11-23 19:05:59

setlocal enabledelayedexpansion 
for %%f in (DataFolder\*.Ext) do (
    set POI=%%~f 
    set POI=!JbPOI:DataFolder\=! 
    set POI=!JbPOI:.Ext=! 
    for /f "useback tokens=1,2,3 delims=," %%a in ("%%~f") do (
     set CX=%%a 
     set CY=%%b 
     set FN=%%c 
     echo !FN!,9,!CX!,!CY! >> "DataFolder\!POI!.tmp" 
    ) 
) 
endlocal 

我不确定您是否想读取文件"%%~f",但我认为这是您需要的。

+0

不应该'useback'是'usebackq'? – 2016-03-29 16:15:41

+0

@LưuVĩnhPhúc - 他们都工作 – npocmaka 2016-03-29 16:56:42

+0

我刚刚意识到它是无证的解决方案http://ss64.com/nt/for_f.html – 2016-03-29 16:58:29

对不起,但对于发布的代码,我不认为需要延迟扩展。所有需要的数据是直接从for替换参数

setlocal enableextensions disabledelayedexpansion 
for %%f in (DataFolder\*.Ext) do (
    (
    for /f "usebackq tokens=1-3 delims=," %%a in ("%%~f") do echo(%%c,9,%%a,%%b 
) > "DataFolder\%%~nf.tmp" 
) 
endlocal 

检索如果实际代码包含的东西就不贴了,也许从npocmaka答案将更好地适应问题。

+0

正如你所看到的,输出文件名的一部分来源于%% f文件姓名,但不完全......有些人物被剥离。 – 2014-11-23 23:35:59

+0

@JaapBregman,是的,路径和扩展名。 '%%〜nf'将只返回没有路径和扩展名的文件名。 – 2014-11-24 05:53:27

+0

感谢提示! – 2014-11-25 11:09:07