我想迭代一个包含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!
)
---
非常感谢任何见解。
答案 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
)