使用Windows批处理脚本我可以使用For循环来迭代多行文件并运行多个命令

时间:2013-11-19 23:47:04

标签: windows batch-file

我想迭代一个包含Windows目录列表的平面文本文件,并针对每一行运行多个命令,将每一行分配给一个变量。然后,我想将每个命令的每个结果输出回显到逗号分隔的文件。是的,我理解批量编程可能不是最好的选择,但目前有点受限。这就是我所处的位置:

@echo off
setlocal
SETLOCAL ENABLEDELAYEDEXPANSION

:: There could be spaces in the filename, thus using delims
FOR /f "delims=?" %%a in (e:\multiline_textfile.txt) do (
set filename=%%a
CALL :PROG1
CALL :PROG2
CALL :PROG3
CALL :ENDPROG

:PROG1
FOR /f "delims=?" %%h in ('e:\apps\exe1.exe -s "!filename!"') do set result11=%%h

:PROG2
FOR /f "delims=?" %%i in ('e:\apps\exe1.exe -b"!filename!"') do set result2=%%i

:PROG3
FOR /f "delims=?" %%j in ('e:\apps\exe2.exe -c "!filename!"') do set result3=%%j

:ENDPROG
echo !result1!,!result2!,!result3!
)

---

非常感谢任何见解。

1 个答案:

答案 0 :(得分:0)

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

:: There could be spaces in the filename, thus using delims
FOR /f "delims=" %%a in (e:\multiline_textfile.txt) do (
set "filename=%%a"
CALL :PROG1
CALL :PROG2
CALL :PROG3
CALL :ENDPROG
)
echo here endeth your batch mainline
goto :eof

:PROG1
FOR /f "delims=" %%h in ('e:\apps\exe1.exe -s "!filename!"') do set "result1=%%h"
goto :eof

:PROG2
FOR /f "delims=" %%i in ('e:\apps\exe1.exe -b"!filename!"') do set "result2=%%i"
goto :eof

:PROG3
FOR /f "delims=" %%j in ('e:\apps\exe2.exe -c "!filename!"') do set "result3=%%j"
goto :eof

:ENDPROG
echo !result1!,!result2!,!result3!
goto :eof

你不需要最初的SETLOCAL - 一个就足够了。

标签只是批量程序中的MARKERS - 它们不会影响流量。在CALL ed例程中返回的最常见方法是GOTO :EOF,其中冒号是必需的,标签:EOF是隐式的,不应声明。

尝试在FOR循环中使用标签的错误主意。可能适用于更高版本,但不适用于更早版本。请注意FOR循环结束已被移动...

尽管!var!起作用,但在这种情况下并不是必需的,因为每个子程序本质上都是一个全新的程序,它继承了CALL处的主要环境。因此,每个!var!可以由%var%替换,SETLOCAL ENABLEDELAYEDEXPANSION只需要SETLOCAL。您只需要使用delayedexpansion,其中在复合语句中更改后使用普通环境变量的值(例如,多行上的FOR